🔐 Kubernetes NetworkPolicy 완전 정리

2026. 2. 22. 11:40k8s

Kubernetes에서 NetworkPolicy

“Pod 간 네트워크 통신을 제어하는 방화벽 정책”

이다.

즉,

  • 어떤 Pod가
  • 어떤 Pod와
  • 어떤 포트로
  • 통신할 수 있는지

를 정의한다.


📌 1️⃣ 기본 개념

기본적으로 Kubernetes는:

모든 Pod ↔ 모든 Pod 통신 허용

NetworkPolicy를 적용하면:

명시적으로 허용한 것만 통신 가능

📦 2️⃣ NetworkPolicy 구조

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-nginx
  namespace: test
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 80

🔍 필드 설명

podSelector

정책이 적용될 대상 Pod

podSelector:
  matchLabels:
    app: nginx

👉 nginx Pod에 적용


policyTypes

policyTypes:
- Ingress
- Egress
  • Ingress → 들어오는 트래픽 제어
  • Egress → 나가는 트래픽 제어

ingress

어디에서 들어오는 것을 허용할지

ingress:
- from:

egress

어디로 나가는 것을 허용할지


🔥 핵심 개념 (가장 중요)

NetworkPolicy는:

“허용(Allow) 정책만 정의”

즉:

  • 명시되지 않은 트래픽은 차단
  • deny 정책은 없음

📌 3️⃣ 기본 차단 정책 만들기

모든 Ingress 차단:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: test
spec:
  podSelector: {}
  policyTypes:
  - Ingress

👉 namespace 내 모든 Pod의 Ingress 차단


📌 4️⃣ 특정 Pod만 허용

ingress:
- from:
  - podSelector:
      matchLabels:
        app: frontend

👉 frontend Pod만 접근 가능


📌 5️⃣ namespace 기준 허용

from:
- namespaceSelector:
    matchLabels:
      team: backend

👉 backend 팀 namespace에서만 접근 허용


📌 6️⃣ IP 기준 허용

from:
- ipBlock:
    cidr: 192.168.0.0/16
    except:
    - 192.168.1.0/24

👉 특정 IP 대역 허용


🧠 동작 흐름

NetworkPolicy 생성
   ↓
CNI 플러그인(calico 등)이 규칙 적용
   ↓
iptables/ipset 규칙 생성
   ↓
트래픽 허용/차단

⚠️ 매우 중요한 조건

NetworkPolicy는:

CNI 플러그인이 지원해야 동작한다.

예:

  • Calico ✅
  • Cilium ✅
  • Weave ✅
  • 기본 kubenet ❌

📊 Ingress vs Egress 차이

구분 Ingress Egress
방향 들어오는 트래픽 나가는 트래픽
기본 동작 허용 허용
정책 생성 후 차단 후 허용만 가능 차단 후 허용만 가능

🚨 흔한 오해

1️⃣ NetworkPolicy 만들었는데 차단 안 됨

  • CNI가 지원 안 함
  • 다른 namespace에는 정책 없음

2️⃣ 일부 Pod만 막힘

NetworkPolicy는 podSelector 기준 적용


📌 전체 흐름 예시

Frontend Pod
   ↓
Service
   ↓
NetworkPolicy 검사
   ↓
nginx Pod

🎯 실무 설계 패턴

1️⃣ 기본 차단 정책 먼저 생성

podSelector: {}

2️⃣ 필요한 통신만 허용

  • DB 접근 허용
  • API 접근 허용
  • DNS 허용

📌 DNS 허용 예시

DNS 차단되면 통신 다 안 됨

egress:
- to:
  - namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: kube-system

🏗️ 구조 요약

기본: All Allow
NetworkPolicy 적용:
   → Default Deny
   → Explicit Allow