Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #9] 네트워크 정책(NetworkPolicy)을 통한 특정 Pod 간 트래픽 제어

ygtoken 2025. 3. 16. 18:57
728x90

 

쿠버네티스 클러스터에서 Pod 간 트래픽을 제어하지 않으면 모든 Pod이 서로 자유롭게 통신할 수 있습니다.

이는 보안 및 네트워크 관리 측면에서 취약점을 발생시킬 수 있습니다.

이를 해결하기 위해 NetworkPolicy를 활용하여 특정 Pod 간 트래픽을 제어하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. NetworkPolicy를 적용하여 특정 네임스페이스에서 Pod 간 통신을 제한하는 방법

2. Ingress 및 Egress 정책을 활용하여 외부 서비스와의 연결을 제어하는 방법

3. kubectl을 활용한 NetworkPolicy 적용 상태 및 트래픽 차단 확인

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ NetworkPolicy를 적용하여 특정 네임스페이스에서 Pod 간 통신을 제한하는 방법

 

❓ 문제 상황

 

운영팀에서 네임스페이스 내에서 모든 Pod이 자유롭게 통신하고 있으며, 이를 보안 강화 차원에서 제한해야 합니다.

특정 애플리케이션(Pod)만 선택적으로 허용하도록 설정해야 합니다.

허용 대상: frontend Pod이 backend Pod과만 통신 가능

차단 대상: frontend Pod이 다른 Pod과는 통신 불가능

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. NetworkPolicy를 설정하여 frontend Pod이 backend Pod과만 통신할 수 있도록 제한합니다.

 

2. kubectl 명령어를 활용하여 정책이 정상적으로 적용되었는지 확인합니다.

 


✅ 정답 Manifest (NetworkPolicy 설정)

 

🔹 frontend → backend 간 트래픽만 허용

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend

이제 frontend Pod만 backend Pod과 통신 가능하며, 다른 Pod은 차단됨

 


📌 적용 후 예상 결과 값

 

1. frontend → backend 통신 테스트

kubectl exec -it frontend-pod -- curl http://backend-service

 

💡 예상 출력 값 (정상 응답)

{"status": "ok"}

 

2. frontend → 다른 서비스 통신 테스트

kubectl exec -it frontend-pod -- curl http://database-service

 

💡 예상 출력 값 (차단됨)

curl: (7) Failed to connect to database-service port 80: Connection refused

네트워크 정책이 정상적으로 적용됨

 


2️⃣ Ingress 및 Egress 정책을 활용하여 외부 서비스와의 연결을 제어하는 방법

 

❓ 문제 상황

 

운영팀에서 내부 애플리케이션이 외부 API 서버(external-api.com)와만 통신하도록 제한해야 합니다.

또한 외부에서 특정 Pod으로 직접 접근할 수 없도록 차단해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Egress 정책을 사용하여 특정 도메인으로의 아웃바운드 트래픽만 허용합니다.

 

2. Ingress 정책을 사용하여 외부에서 특정 Pod에 대한 접근을 차단합니다.

 


✅ 정답 Manifest (Ingress 및 Egress 정책 설정)

 

🔹 외부 API 서버로의 Egress 트래픽만 허용

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress-to-external-api
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  egress:
  - to:
    - ipBlock:
        cidr: 203.0.113.5/32  # external-api.com의 IP 주소

 

🔹 외부에서 특정 Pod으로의 Ingress 차단

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-ingress-from-external
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress: []

이제 backend Pod은 external-api.com과만 통신할 수 있으며, 외부에서 접근 불가능

 


📌 적용 후 예상 결과 값

 

1. backend → external-api.com 통신 테스트

kubectl exec -it backend-pod -- curl http://external-api.com

 

💡 예상 출력 값 (정상 응답)

{"status": "ok"}

 

2. backend → 다른 외부 IP 통신 테스트

kubectl exec -it backend-pod -- curl http://google.com

 

💡 예상 출력 값 (차단됨)

curl: (6) Could not resolve host: google.com

Egress 정책이 정상적으로 적용됨

 


3️⃣ kubectl을 활용한 NetworkPolicy 적용 상태 및 트래픽 차단 확인

 

❓ 문제 상황

 

운영팀에서 현재 적용된 네트워크 정책이 올바르게 설정되었는지 확인하고, 특정 Pod이 차단되었는지 점검해야 합니다.

kubectl 명령어를 활용하여 NetworkPolicy 설정을 검증해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. kubectl get networkpolicy 명령어를 사용하여 설정된 네트워크 정책을 확인합니다.

 

2. kubectl describe networkpolicy 명령어를 활용하여 특정 Pod의 적용 상태를 점검합니다.

 


✅ NetworkPolicy 상태 확인 명령어

 

🔹 현재 설정된 NetworkPolicy 확인

kubectl get networkpolicy

 

💡 예상 출력 값

NAME                          POD-SELECTOR    AGE
allow-frontend-to-backend     app=backend     10m
allow-egress-to-external-api  app=backend     5m
deny-ingress-from-external    app=backend     2m

 

🔹 특정 NetworkPolicy 상세 정보 확인

kubectl describe networkpolicy allow-frontend-to-backend

 

💡 예상 출력 값

Name:         allow-frontend-to-backend
Namespace:    default
Created on:   10m ago
Pod Selector: app=backend
Allowed Ingress From:
  PodSelector: app=frontend

NetworkPolicy가 올바르게 설정되었으며, 트래픽이 제한됨

 

728x90