안녕하세요! 클라우드 네이티브 환경에서 애플리케이션을 개발하고 운영하다 보면, "누가 우리 서비스에 접근할 수 있는가?"라는 보안 질문에 직면하게 됩니다. 쿠버네티스의 기본 철학은 '모든 포드 간 통신 허용(Any-to-Any)'이지만, 실제 운영 환경에서는 매우 위험한 발상이죠.
오늘은 CKAD 시험의 필수 항목이자, 제로 트러스트(Zero Trust) 보안의 시작점인 NetworkPolicy를 완벽하게 파헤쳐 보겠습니다.

1. NetworkPolicy란 무엇인가?
쿠버네티스 NetworkPolicy는 포드 그룹 간의 네트워크 트래픽 흐름을 허용하는 규칙을 정의하는 L3/L4 방화벽 역할을 합니다.
핵심 특징
- 화이트리스트(Whitelist) 방식: 기본적으로 NetworkPolicy가 적용되는 순간, 명시되지 않은 모든 트래픽은 차단됩니다.
- 라벨 셀렉터(Label Selector) 기반: IP 주소가 아닌 포드의 라벨을 통해 대상을 지정합니다. 이는 유동적인 쿠버네티스 환경에 최적화된 방식입니다.
- 네트워크 플러그인 의존성: 중요합니다! NetworkPolicy를 지원하는 네트워크 솔루션(Calico, Cilium, Weave Net 등)이 클러스터에 설치되어 있어야 실제 차단이 작동합니다.
2. NetworkPolicy의 주요 구성 요소
NetworkPolicy YAML을 작성할 때 반드시 이해해야 하는 4가지 핵심 영역이 있습니다.
- podSelector: 정책을 적용할 타겟 포드들을 선택합니다.
- policyTypes: 이 정책이 들어오는 트래픽(Ingress)에 대한 것인지, 나가는 트래픽(Egress)에 대한 것인지 명시합니다.
- Ingress: 허용할 유입 트래픽의 소스(from)와 포트(ports)를 정의합니다.
- Egress: 허용할 유출 트래픽의 목적지(to)와 포트(ports)를 정의합니다.
3. 실전 예제로 배우는 통신 제어
시나리오 1: 특정 포드에서 오는 요청만 허용하기 (Ingress)
app: database 라벨을 가진 포드에게, app: backend 라벨을 가진 포드로부터 오는 5432 포트 접속만 허용하고 싶을 때입니다.
YAML
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-allow-backend
namespace: default
spec:
podSelector:
matchLabels:
app: database # 정책을 적용할 대상 (DB 포드)
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend # 접속을 허용할 소스 (백엔드 포드)
ports:
- protocol: TCP
port: 5432 # 허용할 포트
시나리오 2: 모든 트래픽 차단하기 (Default Deny)
가장 안전한 보안 전략은 모든 통신을 막아두고 필요한 것만 여는 것입니다.
YAML
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: default
spec:
podSelector: {} # 네임스페이스 내의 모든 포드 선택
policyTypes:
- Ingress
- Egress
# ingress/egress 하위 항목을 비워두면 모든 트래픽이 차단됩니다.
4. CKAD 시험에서 실수하기 쉬운 포인트 (꿀팁)
시험장에서 당황하지 않으려면 아래 세 가지 조건을 명확히 구분해야 합니다.
- podSelector vs namespaceSelector: * podSelector만 있으면 동일 네임스페이스 내의 포드를 찾습니다.
- 다른 네임스페이스의 포드를 허용하려면 반드시 namespaceSelector를 함께 사용해야 합니다.
- 배열(-)의 유무:
-
YAML
from: - podSelector: {...} namespaceSelector: {...} # 1번: 두 조건이 'AND'로 동작 (특정 NS 안의 특정 포드) from: - podSelector: {...} - namespaceSelector: {...} # 2번: 두 조건이 'OR'로 동작 (현재 NS의 특정 포드 또는 특정 NS의 모든 포드) - DNS 확인 (Egress): 포드에서 외부로 나가는 트래픽을 제어할 때, DNS 쿼리(UDP 53)를 허용하지 않으면 도메인 기반 통신이 실패합니다. Egress 정책 시 꼭 확인하세요!
5. 마치며
NetworkPolicy는 단순히 통신을 막는 도구가 아니라, 마이크로서비스 아키텍처에서 서비스 간의 신뢰 경계를 설정하는 아주 중요한 수단입니다. CKAD 시험을 준비하신다면 다양한 라벨 조합을 통해 kubectl describe netpol 결과를 분석하는 연습을 충분히 하시길 권장합니다.
오늘 정리한 내용이 주군의 클러스터를 더욱 안전하게 만드는 데 도움이 되기를 바랍니다!
'클라우드 > 쿠버네티스' 카테고리의 다른 글
| ☸️ Kubernetes ConfigMap: 설정과 코드를 완벽하게 분리하는 법 (0) | 2026.02.09 |
|---|---|
| 🚀 [K8s 심화] 쿠버네티스 확장하기: CRD(Custom Resource Definition) 완벽 가이드 (feat. CKAD) (0) | 2026.02.09 |
| 🏆 쿠버네티스 트래픽 제어의 진화: Ingress에서 Gateway API, 그리고 Traefik CRD까지 (0) | 2026.02.07 |
| ⚓ Helm 4: 더 강력하고 안전해진 쿠버네티스 항해의 새로운 동반자 (0) | 2026.02.06 |
| Helm을 활용한 Traefik 쿠버네티스 설치하기 (0) | 2026.02.06 |