Kubernetes NetworkPolicy Egress (DNS만 허용) — 실제 검증 방법 정리

2026. 2. 22. 18:41k8s

CKAD 문제 유형 중 하나:

frontend Pod는 외부 통신 불가
단 DNS(53 TCP/UDP)는 허용


1️⃣ NetworkPolicy 설정

내가 사용한 정책은 다음과 같다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-egress
spec:
  podSelector:
    matchLabels:
      run: frontend
  policyTypes:
  - Egress
  egress:
  - ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

핵심 포인트

  • policyTypes: Egress → 해당 Pod는 기본적으로 egress 차단
  • 53번 포트만 예외 허용
  • 그 외 모든 외부 통신은 자동 차단 (default deny)

2️⃣ nginx 이미지에 curl이 없을 때 검증 방법

nginx 이미지는 curl / wget이 없다.
그래서 Pod 안에 들어가서 직접 테스트하기 어렵다.

그래서 나는 이렇게 해결했다.

✔️ 정책과 동일한 라벨을 가진 테스트 Pod를 띄웠다

NetworkPolicy는 이미지가 아니라 라벨(selector) 기준으로 적용된다.

따라서 policy가 run=frontend라면
테스트 Pod도 동일하게 run=frontend로 생성하면 된다.


3️⃣ 실제 검증 명령

🔹 외부 HTTP 호출 (실패해야 정상)

kubectl run busybox -n test --image busybox \
-l run=frontend -it --rm --restart=Never -- \
wget -qO- www.naver.com --timeout 2

✔ 정상이라면 timeout 발생
✔ 외부 HTTP는 차단된 상태


🔹 DNS 테스트 (성공해야 정상)

kubectl run busybox -n test --image busybox \
-l run=frontend -it --rm --restart=Never -- \
nslookup google.com

✔ DNS 응답이 정상적으로 반환됨
✔ 53번 포트 허용이 제대로 적용됨


4️⃣ 결과 해석

테스트 기대 결과
nslookup google.com 성공
wget www.naver.com timeout

이 상태라면

✅ DNS는 허용
✅ 외부 HTTP는 차단
→ NetworkPolicy egress가 정상 동작


5️⃣ 여기서 중요한 포인트

🔥 반드시 라벨을 정책과 동일하게 맞춰야 한다

예를 들어

matchLabels:
  run: frontend

이라면

-l run=frontend

로 생성해야 한다.

만약

-l app=frontend

로 생성하면 정책이 적용되지 않는다.

NetworkPolicy는 이미지 기반이 아니라 selector 기반이라는 점이 핵심이다.


6️⃣ 정리

CKAD에서 egress 제한 문제는 다음 흐름으로 푼다.

  1. policyTypes: Egress 설정
  2. 허용할 포트만 명시
  3. 동일 라벨 테스트 Pod 생성
  4. DNS 성공 / 외부 HTTP 실패 확인

nginx 이미지에 curl이 없어도
같은 라벨을 가진 busybox Pod를 띄우면 충분히 검증 가능하다.