쿠버네티스 클러스터에서 Pod 간 트래픽을 제어하지 않으면 모든 Pod이 서로 자유롭게 통신할 수 있습니다.
이는 보안 및 네트워크 관리 측면에서 취약점을 발생시킬 수 있습니다.
이를 해결하기 위해 NetworkPolicy를 활용하여 특정 Pod 간 트래픽을 제어하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. NetworkPolicy를 적용하여 특정 네임스페이스에서 Pod 간 통신을 제한하는 방법
2. Ingress 및 Egress 정책을 활용하여 외부 서비스와의 연결을 제어하는 방법
3. kubectl을 활용한 NetworkPolicy 적용 상태 및 트래픽 차단 확인
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ NetworkPolicy를 적용하여 특정 네임스페이스에서 Pod 간 통신을 제한하는 방법
❓ 문제 상황
운영팀에서 네임스페이스 내에서 모든 Pod이 자유롭게 통신하고 있으며, 이를 보안 강화 차원에서 제한해야 합니다.
특정 애플리케이션(Pod)만 선택적으로 허용하도록 설정해야 합니다.
• 허용 대상: frontend Pod이 backend Pod과만 통신 가능
• 차단 대상: frontend Pod이 다른 Pod과는 통신 불가능
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. NetworkPolicy를 설정하여 frontend Pod이 backend Pod과만 통신할 수 있도록 제한합니다.
2. kubectl 명령어를 활용하여 정책이 정상적으로 적용되었는지 확인합니다.
✅ 정답 Manifest (NetworkPolicy 설정)
🔹 frontend → backend 간 트래픽만 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
✅ 이제 frontend Pod만 backend Pod과 통신 가능하며, 다른 Pod은 차단됨
📌 적용 후 예상 결과 값
1. frontend → backend 통신 테스트
kubectl exec -it frontend-pod -- curl http://backend-service
💡 예상 출력 값 (정상 응답)
{"status": "ok"}
2. frontend → 다른 서비스 통신 테스트
kubectl exec -it frontend-pod -- curl http://database-service
💡 예상 출력 값 (차단됨)
curl: (7) Failed to connect to database-service port 80: Connection refused
✅ 네트워크 정책이 정상적으로 적용됨
2️⃣ Ingress 및 Egress 정책을 활용하여 외부 서비스와의 연결을 제어하는 방법
❓ 문제 상황
운영팀에서 내부 애플리케이션이 외부 API 서버(external-api.com)와만 통신하도록 제한해야 합니다.
또한 외부에서 특정 Pod으로 직접 접근할 수 없도록 차단해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Egress 정책을 사용하여 특정 도메인으로의 아웃바운드 트래픽만 허용합니다.
2. Ingress 정책을 사용하여 외부에서 특정 Pod에 대한 접근을 차단합니다.
✅ 정답 Manifest (Ingress 및 Egress 정책 설정)
🔹 외부 API 서버로의 Egress 트래픽만 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress-to-external-api
namespace: default
spec:
podSelector:
matchLabels:
app: backend
egress:
- to:
- ipBlock:
cidr: 203.0.113.5/32 # external-api.com의 IP 주소
🔹 외부에서 특정 Pod으로의 Ingress 차단
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-ingress-from-external
namespace: default
spec:
podSelector:
matchLabels:
app: backend
ingress: []
✅ 이제 backend Pod은 external-api.com과만 통신할 수 있으며, 외부에서 접근 불가능
📌 적용 후 예상 결과 값
1. backend → external-api.com 통신 테스트
kubectl exec -it backend-pod -- curl http://external-api.com
💡 예상 출력 값 (정상 응답)
{"status": "ok"}
2. backend → 다른 외부 IP 통신 테스트
kubectl exec -it backend-pod -- curl http://google.com
💡 예상 출력 값 (차단됨)
curl: (6) Could not resolve host: google.com
✅ Egress 정책이 정상적으로 적용됨
3️⃣ kubectl을 활용한 NetworkPolicy 적용 상태 및 트래픽 차단 확인
❓ 문제 상황
운영팀에서 현재 적용된 네트워크 정책이 올바르게 설정되었는지 확인하고, 특정 Pod이 차단되었는지 점검해야 합니다.
kubectl 명령어를 활용하여 NetworkPolicy 설정을 검증해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl get networkpolicy 명령어를 사용하여 설정된 네트워크 정책을 확인합니다.
2. kubectl describe networkpolicy 명령어를 활용하여 특정 Pod의 적용 상태를 점검합니다.
✅ NetworkPolicy 상태 확인 명령어
🔹 현재 설정된 NetworkPolicy 확인
kubectl get networkpolicy
💡 예상 출력 값
NAME POD-SELECTOR AGE
allow-frontend-to-backend app=backend 10m
allow-egress-to-external-api app=backend 5m
deny-ingress-from-external app=backend 2m
🔹 특정 NetworkPolicy 상세 정보 확인
kubectl describe networkpolicy allow-frontend-to-backend
💡 예상 출력 값
Name: allow-frontend-to-backend
Namespace: default
Created on: 10m ago
Pod Selector: app=backend
Allowed Ingress From:
PodSelector: app=frontend
✅ NetworkPolicy가 올바르게 설정되었으며, 트래픽이 제한됨