🔐 Kubernetes NetworkPolicy 완전 정리
2026. 2. 22. 11:40ㆍk8s
Kubernetes에서 NetworkPolicy는
“Pod 간 네트워크 통신을 제어하는 방화벽 정책”
이다.
즉,
- 어떤 Pod가
- 어떤 Pod와
- 어떤 포트로
- 통신할 수 있는지
를 정의한다.
📌 1️⃣ 기본 개념
기본적으로 Kubernetes는:
모든 Pod ↔ 모든 Pod 통신 허용
NetworkPolicy를 적용하면:
명시적으로 허용한 것만 통신 가능
📦 2️⃣ NetworkPolicy 구조
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx
namespace: test
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
🔍 필드 설명
podSelector
정책이 적용될 대상 Pod
podSelector:
matchLabels:
app: nginx
👉 nginx Pod에 적용
policyTypes
policyTypes:
- Ingress
- Egress
- Ingress → 들어오는 트래픽 제어
- Egress → 나가는 트래픽 제어
ingress
어디에서 들어오는 것을 허용할지
ingress:
- from:
egress
어디로 나가는 것을 허용할지
🔥 핵심 개념 (가장 중요)
NetworkPolicy는:
“허용(Allow) 정책만 정의”
즉:
- 명시되지 않은 트래픽은 차단
- deny 정책은 없음
📌 3️⃣ 기본 차단 정책 만들기
모든 Ingress 차단:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: test
spec:
podSelector: {}
policyTypes:
- Ingress
👉 namespace 내 모든 Pod의 Ingress 차단
📌 4️⃣ 특정 Pod만 허용
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
👉 frontend Pod만 접근 가능
📌 5️⃣ namespace 기준 허용
from:
- namespaceSelector:
matchLabels:
team: backend
👉 backend 팀 namespace에서만 접근 허용
📌 6️⃣ IP 기준 허용
from:
- ipBlock:
cidr: 192.168.0.0/16
except:
- 192.168.1.0/24
👉 특정 IP 대역 허용
🧠 동작 흐름
NetworkPolicy 생성
↓
CNI 플러그인(calico 등)이 규칙 적용
↓
iptables/ipset 규칙 생성
↓
트래픽 허용/차단
⚠️ 매우 중요한 조건
NetworkPolicy는:
CNI 플러그인이 지원해야 동작한다.
예:
- Calico ✅
- Cilium ✅
- Weave ✅
- 기본 kubenet ❌
📊 Ingress vs Egress 차이
| 구분 | Ingress | Egress |
|---|---|---|
| 방향 | 들어오는 트래픽 | 나가는 트래픽 |
| 기본 동작 | 허용 | 허용 |
| 정책 생성 후 | 차단 후 허용만 가능 | 차단 후 허용만 가능 |
🚨 흔한 오해
1️⃣ NetworkPolicy 만들었는데 차단 안 됨
- CNI가 지원 안 함
- 다른 namespace에는 정책 없음
2️⃣ 일부 Pod만 막힘
NetworkPolicy는 podSelector 기준 적용
📌 전체 흐름 예시
Frontend Pod
↓
Service
↓
NetworkPolicy 검사
↓
nginx Pod
🎯 실무 설계 패턴
1️⃣ 기본 차단 정책 먼저 생성
podSelector: {}
2️⃣ 필요한 통신만 허용
- DB 접근 허용
- API 접근 허용
- DNS 허용
📌 DNS 허용 예시
DNS 차단되면 통신 다 안 됨
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
🏗️ 구조 요약
기본: All Allow
NetworkPolicy 적용:
→ Default Deny
→ Explicit Allow'k8s' 카테고리의 다른 글
| # 💾 Kubernetes PV와 PVC 완전 정리 (0) | 2026.02.22 |
|---|---|
| 🧠 Pod 안에서 kubectl 대신 API 호출하기 (0) | 2026.02.22 |
| 🌐 Kubernetes Service Type 변경 방법 & 확인 방법 (0) | 2026.02.22 |
| 🌐 Kubernetes Service를 만들면 생성되는 Endpoint의 의미 (0) | 2026.02.22 |
| 🚨 kubectl delete --force --grace-period=0 완전 정리 (0) | 2026.02.22 |