NetworkPolicy

Kubernetes Pod 간 네트워크 통신을 제어하는 방화벽 규칙


Kubernetes Pod 간 네트워크 통신을 제어하는 방화벽 규칙

목표: 제로 트러스트 네트워크를 구현할 수 있는 수준


🛡️ NetworkPolicy 개요

기본 동작

graph TB
    subgraph "기본: 모든 통신 허용"
        A["Pod A"] --- B["Pod B"]
        A --- C["Pod C"]
        B --- C
    end
    
    subgraph "NetworkPolicy 적용 후"
        D["Pod D"] ---|"✅ 허용"| E["Pod E"]
        D ---|"❌ 차단"| F["Pod F"]
    end

기본적으로 Kubernetes는 모든 Pod 간 통신을 허용합니다. NetworkPolicy로 이를 제한합니다.


📋 기본 정책

1. 기본 차단 (Default Deny)

# 모든 Ingress 차단
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress
# 모든 Egress 차단
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes:
  - Egress
# Ingress + Egress 모두 차단
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

2. 허용 규칙

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

🎯 고급 규칙

네임스페이스 기반

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-namespace
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: production

IP 블록 기반

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-ip
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
  - from:
    - ipBlock:
        cidr: 10.0.0.0/8
        except:
        - 10.0.1.0/24

Egress 규칙

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: egress-policy
spec:
  podSelector:
    matchLabels:
      app: frontend
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: backend
    ports:
    - protocol: TCP
      port: 8080
  - to:
    - ipBlock:
        cidr: 8.8.8.8/32
    ports:
    - protocol: UDP
      port: 53

🐛 문제 해결

정책 확인

# NetworkPolicy 목록
kubectl get networkpolicies

# 상세 정보
kubectl describe networkpolicy allow-frontend

# Pod에 적용된 정책 확인
# (CNI 플러그인에 따라 다름)

Calico에서 확인

# Calico 정책
kubectl get networkpolicies.crd.projectcalico.org

# iptables 규칙
sudo iptables -L -n | grep cali

📋 체크리스트

  • Default Deny 정책 적용
  • Pod Selector 이해
  • Namespace Selector 사용
  • IP Block 사용
  • Ingress/Egress 규칙
  • 포트/프로토콜 제한
  • CNI 지원 확인

🔗 관련 노트

  • 02-03-CNI-네트워크 — 네트워크 플러그인
  • 02-04-NetworkPolicy — TLS, mTLS
  • 01-06-Service-타입 — 서비스 노출

마지막 업데이트: 2026-06-01