쿠버네티스에서 NetworkPolicy는 네트워크 트래픽을 제어하여 특정 Pod 간의 통신을 제한하거나 허용하는 기능을 제공합니다.
이번 글에서는 기본적인 NetworkPolicy를 설정하고, 특정 Pod에 대한 인바운드(Ingress) 및 아웃바운드(Egress) 트래픽을 제어하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 특정 Pod에 대한 인바운드(Ingress) 트래픽 제한
2️⃣ 특정 Pod의 아웃바운드(Egress) 트래픽 제한
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 특정 Pod에 대한 인바운드(Ingress) 트래픽 제한
❓ 문제 상황
운영팀에서 특정 애플리케이션 Pod이 외부에서 접근되지 않도록 제한해야 하는 요구사항이 생겼습니다.
기본적으로 모든 Pod은 네트워크에서 자유롭게 통신할 수 있지만, 보안 강화를 위해 특정 Pod의 인바운드 트래픽을 차단해야 합니다.
• restricted-app이라는 이름의 Deployment를 생성해야 합니다.
• restricted-app Pod은 app=restricted 레이블을 가져야 합니다.
• 특정 네임스페이스에서만 접근을 허용하고, 나머지 네트워크 트래픽은 차단해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. NetworkPolicy를 생성하여 restricted-app이 특정 네임스페이스에서만 접근 가능하도록 제한해야 합니다.
• podSelector를 사용하여 app=restricted 레이블을 가진 Pod에 정책을 적용
• Ingress 규칙을 추가하여 특정 네임스페이스의 Pod에서만 접근 허용
2. 정책이 적용된 후, 해당 네임스페이스 외부에서 접근이 차단되는지 확인해야 합니다.
✅ 정답 Manifest (Ingress 트래픽 제한 NetworkPolicy 설정)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-ingress
namespace: default
spec:
podSelector:
matchLabels:
app: restricted # 이 레이블이 있는 Pod에 정책 적용
policyTypes:
- Ingress # 인바운드 트래픽 제어
ingress:
- from:
- namespaceSelector: # 특정 네임스페이스에서만 접근 허용
matchLabels:
access: allowed
📌 적용 후 예상 결과 값
1. NetworkPolicy 적용 확인
kubectl get networkpolicy
💡 예상 출력 값
NAME POD-SELECTOR AGE
restrict-ingress app=restricted 5s
2. 허용된 네임스페이스에서 접속 테스트 (성공해야 함)
kubectl run --rm -it test-pod --namespace=allowed-ns --image=busybox -- /bin/sh -c "wget -qO- http://restricted-app"
💡 예상 출력 값
<html>
<body>
<h1>Welcome to Restricted App</h1>
</body>
</html>
3. 허용되지 않은 네임스페이스에서 접속 테스트 (차단되어야 함)
kubectl run --rm -it test-pod --namespace=default --image=busybox -- /bin/sh -c "wget -qO- http://restricted-app"
💡 예상 출력 값
wget: download timed out
2️⃣ 특정 Pod의 아웃바운드(Egress) 트래픽 제한
❓ 문제 상황
운영팀에서 특정 애플리케이션이 외부 네트워크(인터넷)로 나가는 것을 차단해야 하는 요구사항이 생겼습니다.
기본적으로 모든 Pod은 인터넷에 접근할 수 있지만, 보안 정책에 따라 특정 애플리케이션의 인터넷 사용을 차단해야 합니다.
• no-egress-app이라는 Deployment를 생성해야 합니다.
• no-egress-app Pod은 app=no-egress 레이블을 가져야 합니다.
• 해당 Pod은 클러스터 외부(인터넷)로의 트래픽을 차단해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. NetworkPolicy를 생성하여 no-egress-app의 모든 Egress 트래픽을 차단해야 합니다.
• podSelector를 사용하여 app=no-egress 레이블을 가진 Pod에 정책 적용
• Egress 정책을 추가하여 모든 외부 네트워크 접근 차단
2. 정책이 적용된 후, 인터넷에 접근할 수 없는지 확인해야 합니다.
✅ 정답 Manifest (Egress 트래픽 제한 NetworkPolicy 설정)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-egress
namespace: default
spec:
podSelector:
matchLabels:
app: no-egress # 이 레이블이 있는 Pod에 정책 적용
policyTypes:
- Egress # 아웃바운드 트래픽 제어
egress: [] # 모든 외부 트래픽 차단
📌 적용 후 예상 결과 값
1. NetworkPolicy 적용 확인
kubectl get networkpolicy
💡 예상 출력 값
NAME POD-SELECTOR AGE
restrict-egress app=no-egress 5s
2. 외부 인터넷 접근 시도 (차단되어야 함)
kubectl exec -it no-egress-app -- wget -qO- http://example.com
💡 예상 출력 값
wget: download timed out
3. 내부 서비스 접근 테스트 (허용되어야 함)
kubectl exec -it no-egress-app -- wget -qO- http://internal-service.default.svc.cluster.local
💡 예상 출력 값
<html>
<body>
<h1>Internal Service</h1>
</body>
</html>