본문 바로가기
Infra2026년 2월 28일7분 읽기

Kubernetes 네트워크 정책으로 Pod 간 통신 제어

YS
김영삼
조회 344

Kubernetes 네트워크 정책

기본적으로 Kubernetes 클러스터 내 모든 Pod는 서로 통신할 수 있습니다. NetworkPolicy를 사용하면 Pod 간 트래픽을 화이트리스트 방식으로 제어할 수 있습니다.

기본 개념

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from: [...]
      ports: [...]
  egress:
    - to: [...]
      ports: [...]

기본 정책: 모든 트래픽 차단

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

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

마이크로서비스 간 통신 허용

# frontend → backend API 통신만 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-api
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend-api
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 8080

---
# backend → database 통신만 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-api-to-db
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: backend-api
      ports:
        - protocol: TCP
          port: 5432

네임스페이스 간 통신

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-monitoring
  namespace: production
spec:
  podSelector:
    matchLabels:
      metrics: "true"
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              purpose: monitoring
          podSelector:
            matchLabels:
              app: prometheus
      ports:
        - protocol: TCP
          port: 9090

외부 트래픽 제어

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-external-api
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend-api
  policyTypes:
    - Egress
  egress:
    - to: []
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
    - to:
        - ipBlock:
            cidr: 203.0.113.0/24
      ports:
        - protocol: TCP
          port: 443

CNI 플러그인 지원

CNI 플러그인NetworkPolicy 지원특징
Calico완전 지원 + 확장가장 널리 사용, L3/L4 정책
Cilium완전 지원 + L7eBPF 기반, HTTP 레벨 정책
Weave Net지원설치 간편, 암호화 지원
Flannel미지원단순 오버레이, 정책 없음

디버깅 및 테스트

kubectl get networkpolicies -n production
kubectl describe networkpolicy allow-frontend-to-api -n production

# 연결 테스트
kubectl run test-pod --rm -it --image=busybox -n production -- sh
# wget -qO- --timeout=2 http://backend-api:8080/health

# Calico calicoctl로 상세 확인
calicoctl get networkpolicy -n production -o yaml
  • NetworkPolicy는 허용 규칙만 존재하며, 명시되지 않은 트래픽은 차단
  • 정책이 없는 Pod는 기본적으로 모든 트래픽 허용
  • DNS(port 53) Egress를 반드시 허용해야 서비스 디스커버리 정상 동작
  • Cilium을 사용하면 HTTP 메서드, 경로 수준의 L7 정책도 가능
  • 프로덕션 적용 전 스테이징에서 충분히 테스트 후 점진적 적용

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록