Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #7: NetworkPolicy (서비스 및 네트워크 리소스)

ygtoken 2025. 3. 5. 00:18
728x90

Kubernetes에서는 기본적으로 모든 Pod 간의 네트워크 통신이 허용됩니다.
하지만 보안 강화를 위해 특정 Pod 간의 통신만 허용하거나 차단하려면 NetworkPolicy를 사용해야 합니다.

이번 글에서는 NetworkPolicy의 개념, 동작 방식, 그리고 실전 활용법을 정리하겠습니다.


🔹 NetworkPolicy란?

NetworkPolicyPod 간의 네트워크 트래픽을 제어하는 Kubernetes 리소스입니다.
✔️ Pod 간 트래픽을 허용하거나 차단 가능
✔️ 네임스페이스 단위로 정책을 적용 가능
✔️ 보안을 강화하여 불필요한 접근 차단

💡 NetworkPolicy는 기본적으로 적용되지 않으며, Calico, Cilium 등의 네트워크 플러그인이 필요합니다.


🔹 NetworkPolicy 기본 원리

NetworkPolicy는 선언적(Declarative) 방식으로 네트워크 트래픽을 제어합니다.

  1. Pod Selector: 특정 Pod에 정책을 적용 (matchLabels 사용)
  2. Ingress Rule: 들어오는 트래픽(Inbound) 허용 또는 차단
  3. Egress Rule: 나가는 트래픽(Outbound) 허용 또는 차단

💡 정책이 적용된 Pod는 허용된 트래픽만 수락하며, 나머지는 차단됩니다.


🔹 기본적인 NetworkPolicy 예제

아래 예제는 app: frontend Pod가 app: backend Pod와만 통신할 수 있도록 설정합니다.

apiVersion: networking.k8s.io/v1  # NetworkPolicy 리소스의 API 버전
kind: NetworkPolicy  # NetworkPolicy 리소스 선언
metadata:
  name: allow-frontend-to-backend  # 정책 이름
spec:
  podSelector:
    matchLabels:
      app: backend  # 이 레이블이 있는 Pod에 적용됨
  policyTypes:
    - Ingress  # 들어오는 트래픽(Ingress)만 제어
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend  # frontend Pod에서 오는 요청만 허용
      ports:
        - protocol: TCP  # TCP 프로토콜
          port: 80  # 80번 포트 허용

💡 결과적으로 frontend Pod만 backend Pod로 요청을 보낼 수 있으며, 다른 Pod의 접근은 차단됩니다.


🔹 NetworkPolicy 주요 필드 설명

필드 설명

podSelector 정책을 적용할 Pod 선택 (matchLabels 사용)
policyTypes Ingress, Egress 또는 둘 다 지정 가능
ingress 허용할 Inbound 트래픽 정의
egress 허용할 Outbound 트래픽 정의

💡 podSelector가 없으면 네임스페이스 전체에 정책이 적용됩니다.


🔹 모든 트래픽 차단 (기본 거부 정책)

아래 예제는 특정 Pod에 대한 모든 트래픽을 차단하는 정책입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}  # 네임스페이스 내 모든 Pod 적용
  policyTypes:
    - Ingress  # Ingress 트래픽 차단

💡 이 정책이 적용된 Pod는 아무런 네트워크 요청도 받을 수 없습니다.


🔹 Egress 정책: 특정 외부 도메인으로의 요청 허용

아래 정책은 app: database Pod가 특정 IP 또는 도메인으로만 요청을 보낼 수 있도록 허용합니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-database-egress
spec:
  podSelector:
    matchLabels:
      app: database  # 이 레이블이 있는 Pod에 적용됨
  policyTypes:
    - Egress  # 나가는 트래픽 제어
  egress:
    - to:
        - ipBlock:
            cidr: 192.168.1.0/24  # 192.168.1.0/24 네트워크로만 접근 허용
      ports:
        - protocol: TCP
          port: 3306  # MySQL 포트만 허용

💡 결과적으로 database Pod는 192.168.1.0/24 네트워크의 MySQL 서버로만 연결할 수 있습니다.


🔹 NetworkPolicy를 적용한 후 테스트 방법

1️⃣ 정책 적용 전, 모든 Pod 간 통신 가능

kubectl exec -it frontend -- curl backend:80

💡 정상적으로 응답이 오면 네트워크 정책이 적용되지 않은 상태입니다.

2️⃣ NetworkPolicy 적용 후, 차단 여부 확인

kubectl apply -f networkpolicy.yaml
kubectl exec -it unknown-app -- curl backend:80

💡 curl: (7) Failed to connect 에러가 발생하면 정책이 정상 적용된 것입니다.


🚀 마무리

✔️ NetworkPolicy를 사용하면 Pod 간 트래픽을 제한하여 보안을 강화할 수 있음
✔️ Ingress(들어오는 트래픽)와 Egress(나가는 트래픽)를 제어 가능
✔️ 기본적으로 적용되지 않으므로, 네트워크 플러그인(Calico 등)이 필요

 

 

728x90