
🎯 목표: DB Pod를 보호하고, 오직 prod 네임스페이스의 API Pod만이 3306 포트로 접근 가능하도록 설정
| 대상 | 허용 트래픽 | 설명 |
|---|---|---|
| Web Pod | X | 접근 차단 |
| API Pod | ✅ Ingress to DB: 3306 | prod 네임스페이스에 한정 |
| DB Pod | 🔒 보호 대상 | 모든 트래픽 차단 후, 특정 트래픽만 허용 |
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
spec:
podSelector:
matchLabels:
role: db # DB Pod 식별
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: api
namespaceSelector:
matchLabels:
env: prod
ports:
- protocol: TCP
port: 3306
Ingress만 설정해 "들어오는 트래픽"만 제어role=api인 Pod이면서 env=prod인 네임스페이스만 허용| 선택자 종류 | 설명 |
|---|---|
podSelector | 특정 Pod (Label 기준) |
namespaceSelector | 특정 Namespace (Label 기준) |
ipBlock | 외부 서버 (IP or CIDR 범위) |
from(Ingress) 또는to(Egress)에 사용 가능
AND 조합:
from:
- podSelector:
matchLabels: { role: api }
namespaceSelector:
matchLabels: { env: prod }
⇒
env=prod네임스페이스 내role=apiPod만 허용
OR 조합 (별개의 요소로 나열):
from:
- podSelector: ...
- namespaceSelector: ...
- ipBlock: ...
⇒ 조건 중 하나만 충족해도 허용
ipBlock)from:
- ipBlock:
cidr: 192.168.5.10/32
✅ 외부 백업 서버 등 클러스터 외부에서 들어오는 트래픽 허용
policyTypes:
- Ingress
- Egress
egress:
- to:
- ipBlock:
cidr: 192.168.5.10/32
ports:
- protocol: TCP
port: 80
✅ DB Pod가 외부 백업 서버로
port 80에 접속 가능하도록 허용
| 항목 | 설명 |
|---|---|
Ingress만 설정 시 | 수신 트래픽만 제어, 발신(Egress)은 전부 허용됨 |
Egress 필요 시 | 반드시 policyTypes에 명시해야 적용됨 |
namespaceSelector 사용 시 | 네임스페이스에 반드시 라벨이 있어야 함 |
Flannel 사용 시 | 네트워크 정책이 작동하지 않음 |
| 규칙이 많아질수록 | 조합 방식에 따라 보안 허점 생길 수 있음 (주의) |
| 개념 | 설명 |
|---|---|
NetworkPolicy | Pod 간 통신 제어 객체 |
policyTypes | Ingress, Egress 명시 필요 |
| 트래픽 방향 기준 | 항상 "정방향" 기준 (요청 쪽을 기준으로) |
from / to | podSelector, namespaceSelector, ipBlock 사용 가능 |
| AND / OR 구분 | 단일 항목 내부는 AND, 목록은 OR |
kubectl label ns prod env=prod 같이 네임스페이스 라벨 추가 필요curl, nc, telnet)