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 | 완전 지원 + L7 | eBPF 기반, 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