Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.32] 🚀 NetworkPolicy 편 #2 | 네임스페이스 및 특정 Pod 간 트래픽 제어

ygtoken 2025. 3. 16. 17:48
728x90

 

쿠버네티스에서 NetworkPolicy는 네트워크 트래픽을 제어하여 특정 네임스페이스 및 Pod 간의 통신을 제한하거나 허용하는 기능을 제공합니다.

이번 글에서는 특정 네임스페이스의 Pod만 허용하는 정책과 특정 Pod 간의 통신을 제어하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 특정 네임스페이스에서만 접근을 허용하는 NetworkPolicy 적용

2️⃣ 특정 Pod 간 트래픽을 허용하거나 차단하는 정책 설정

 

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

 


1️⃣ 특정 네임스페이스에서만 접근을 허용하는 NetworkPolicy 적용

 

❓ 문제 상황

 

운영팀에서 특정 네임스페이스의 Pod만 애플리케이션 서비스에 접근할 수 있도록 제한하는 요구사항이 생겼습니다.

일반적으로 모든 네임스페이스에서 접근이 가능하지만, 보안 강화를 위해 특정 네임스페이스 외부의 Pod에서는 접근할 수 없도록 설정해야 합니다.

secure-app이라는 Deployment를 생성해야 합니다.

secure-app Pod은 app=secure 레이블을 가져야 합니다.

특정 네임스페이스(allowed-ns)에서만 접근을 허용하고, 나머지는 차단해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. NetworkPolicy를 생성하여 secure-app이 특정 네임스페이스에서만 접근 가능하도록 제한해야 합니다.

podSelector를 사용하여 app=secure 레이블을 가진 Pod에 정책을 적용

Ingress 규칙을 추가하여 allowed-ns 네임스페이스의 Pod에서만 접근 허용

 

2. 정책이 적용된 후, 해당 네임스페이스 외부에서 접근이 차단되는지 확인해야 합니다.

 


✅ 정답 Manifest (네임스페이스 기반 접근 제한 NetworkPolicy 설정)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-namespace-access
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: secure  # 이 레이블이 있는 Pod에 정책 적용
  policyTypes:
  - Ingress  # 인바운드 트래픽 제어
  ingress:
  - from:
    - namespaceSelector:  # 특정 네임스페이스에서만 접근 허용
        matchLabels:
          access: allowed

 

 


📌 적용 후 예상 결과 값

1. NetworkPolicy 적용 확인

kubectl get networkpolicy

 

💡 예상 출력 값

NAME                     POD-SELECTOR       AGE
allow-namespace-access   app=secure        5s

 

2. 허용된 네임스페이스에서 접속 테스트 (성공해야 함)

kubectl run --rm -it test-pod --namespace=allowed-ns --image=busybox -- /bin/sh -c "wget -qO- http://secure-app"

 

💡 예상 출력 값

<html>
<body>
<h1>Welcome to Secure App</h1>
</body>
</html>

 

3. 허용되지 않은 네임스페이스에서 접속 테스트 (차단되어야 함)

kubectl run --rm -it test-pod --namespace=default --image=busybox -- /bin/sh -c "wget -qO- http://secure-app"

 

💡 예상 출력 값

wget: download timed out

 

 


2️⃣ 특정 Pod 간 트래픽을 허용하거나 차단하는 정책 설정

 

❓ 문제 상황

 

운영팀에서 두 개의 애플리케이션이 실행 중이지만, 특정 Pod 간에만 통신할 수 있도록 제한해야 하는 요구사항이 생겼습니다.

예를 들어 frontend Pod은 backend Pod과만 통신할 수 있어야 하며, 다른 Pod과의 통신은 차단해야 합니다.

frontend라는 Deployment를 생성해야 합니다.

frontend Pod은 app=frontend 레이블을 가져야 합니다.

backend Pod(app=backend 레이블)을 제외한 모든 Pod과의 통신을 차단해야 합니다.

 

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

 


🛠️ 해결 방법

 

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

podSelector를 사용하여 app=frontend 레이블을 가진 Pod에 정책을 적용

Ingress 규칙을 추가하여 app=backend 레이블을 가진 Pod에서 오는 트래픽만 허용

 

2. 정책이 적용된 후, backend 외의 Pod에서 접근이 차단되는지 확인해야 합니다.

 


✅ 정답 Manifest (Pod 간 트래픽 제한 NetworkPolicy 설정)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: frontend  # 이 레이블이 있는 Pod에 정책 적용
  policyTypes:
  - Ingress  # 인바운드 트래픽 제어
  ingress:
  - from:
    - podSelector:  # app=backend 레이블을 가진 Pod에서만 접근 허용
        matchLabels:
          app: backend

 

 


📌 적용 후 예상 결과 값

1. NetworkPolicy 적용 확인

kubectl get networkpolicy

 

💡 예상 출력 값

NAME                         POD-SELECTOR      AGE
allow-frontend-to-backend   app=frontend      5s

 

2. backend Pod에서 접속 테스트 (성공해야 함)

kubectl run --rm -it test-pod --labels=app=backend --image=busybox -- /bin/sh -c "wget -qO- http://frontend"

 

💡 예상 출력 값

<html>
<body>
<h1>Welcome to Frontend</h1>
</body>
</html>

 

3. 다른 Pod에서 접속 테스트 (차단되어야 함)

kubectl run --rm -it test-pod --labels=app=other --image=busybox -- /bin/sh -c "wget -qO- http://frontend"

 

💡 예상 출력 값

wget: download timed out
728x90