본문으로 건너뛰기

Network Policies

December 27, 2025

트래픽의 종류
  • Ingress: 들어오는 트래픽
  • Egress: 나가는 트래픽
  • 참고: 아래에서 설정하는 규칙들은 모두 요청 트래픽이다.
    • Ingress 규칙: 들어오는 요청 트래픽에 대한 규칙
    • Egress 규칙: 나가는 요청 트래픽에 대한 규칙
    • 응답 트래픽은 별도의 규칙이 필요 없다. (NetworkPolicy는 stateful connection tracking을 기반으로 동작하므로, 허용된 요청으로 맺어진 연결의 응답은 자동으로 통과된다)

Network Policy​


개념​

  • 쿠버네티스의 네트워크는 기본적으로 모든 Pod 끼리 서로 통신이 가능하다.
  • 이런 상황을 가정해보자. 보안상의 이유로 DB Pod가 허가된 특정 Pod를 제외하고는 접근하지 못하도록 해야한다고 하자.
  • 이 때 사용하는 것이 Network Policy 이다.
  • 특정 Pod에 Network Policy를 설정하면 해당 Pod는 Network Policy에서 허용한 트래픽 외에는 모두 차단한다.

Selector의 종류​

종류설명사용 예시
podSelector같은 네임스페이스 내에서 특정 label을 가진 파드를 선택role: api-pod 레이블을 가진 파드만 허용
namespaceSelector특정 label을 가진 네임스페이스를 선택name: prod 레이블이 있는 네임스페이스의 모든 파드 허용
ipBlock클러스터 외부의 특정 IP 대역(CIDR)을 선택외부 백업 서버(192.168.1.0/24)에서의 접근 허용

YAML​

예시​

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-policy
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: api-pod
ports:
- protocol: TCP
port: 3306
  • 위 예시는 role: db라는 label을 가진 Pod에서는, role: api-pod라는 label을 가진 Pod의 3306포트의 TCP 요청만 받겠다라는 Network Policy 이다.

Selector 조건 (AND, OR)​

OR 조건 (배열이 분리되어 있는 경우, 개별 항목)

ingress:
- from:
- podSelector:
matchLabels:
role: api-pod
- namespaceSelector:
matchLabels:
name: prod
  • 위 조건은 Pod의 label이 role: api-pod 이거나 Namespace의 label이 name: prod인 조건

AND 조건 (-안에 같이 있는 경우, 단일 항목)

ingress:
- from:
- podSelector:
matchLabels:
role: api-pod
namespaceSelector:
matchLabels:
name: prod

위 조건은 Pod의 label이 role: api-pod 이고 Namespace의 label이 name: prod인 조건


지원 CNI 플러그인​

  • Network Policy는 쿠버네티스 API 서버가 아니라 CNI가 실제 패킷 필터링을 수행한다.
  • 이에 지원하는 CNI도 있고 지원하지 않는 CNI도 있다.
    • 지원하는 CNI - Kube-router, Calico, Romana, Weave-net 등
    • 지원하지 않는 CNI - Flannel
  • 주의) Flannel을 사용하는 환경에서 Network Policy를 생성한다고 해서 에러 메시지가 나오지 않는다. 그냥 동작을 하지 않는 것이다.

레퍼런스​