Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.40] 🚀 Multi-Tenancy 편 #3 | 네트워크 격리 및 정책 적용

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

 

쿠버네티스에서 Multi-Tenancy 환경을 운영할 때, 네임스페이스 간 네트워크 격리를 유지하는 것이 중요합니다.

이번 글에서는 NetworkPolicy를 활용하여 네임스페이스 간 네트워크 트래픽을 격리하고, 특정 서비스 간 통신을 허용하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ 네임스페이스 간 네트워크 격리를 위한 NetworkPolicy 설정

2️⃣ 서비스 간 트래픽 정책 및 보안 그룹 설정

 

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

 


1️⃣ 네임스페이스 간 네트워크 격리를 위한 NetworkPolicy 설정

 

❓ 문제 상황

 

운영팀에서 각 팀(테넌트)이 사용하는 네임스페이스 간 네트워크를 격리해야 하는 요구사항이 생겼습니다.

기본적으로 쿠버네티스 네임스페이스 간 트래픽은 모두 열려 있기 때문에, 보안 강화를 위해 특정 네임스페이스 간 통신을 제한해야 합니다.

team-ateam-b 네임스페이스를 격리해야 합니다.

team-a 내부에서는 Pod 간 자유롭게 통신할 수 있어야 합니다.

team-b에서 team-a로의 트래픽은 차단해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. NetworkPolicy를 생성하여 네임스페이스 간 트래픽을 차단합니다.

podSelector를 활용하여 team-a 네임스페이스의 Pod만 내부 통신 가능하도록 설정

namespaceSelector를 활용하여 외부 네임스페이스에서의 접근 차단

 

2. 정책이 적용된 후, team-b 네임스페이스에서 team-a의 서비스에 접근할 수 없는지 확인합니다.

 


✅ 정답 Manifest (네임스페이스 격리 NetworkPolicy 설정)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-external-traffic
  namespace: team-a  # team-a 네임스페이스에서만 적용
spec:
  podSelector: {}  # team-a의 모든 Pod에 적용
  policyTypes:
  - Ingress  # 인바운드 트래픽 차단
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: team-a  # 같은 네임스페이스에서만 통신 허용

 

 


📌 적용 후 예상 결과 값

 

1. NetworkPolicy 적용 확인

kubectl get networkpolicy -n team-a

 

💡 예상 출력 값

NAME                     POD-SELECTOR   AGE
deny-external-traffic    <all>          5s

 

2. team-a 내부 Pod 간 통신 테스트 (허용됨)

kubectl exec -n team-a pod-a -- curl http://pod-b.team-a.svc.cluster.local

 

💡 예상 출력 값

<html>
<body>
<h1>Team A Service</h1>
</body>
</html>

 

3. team-b에서 team-a로의 트래픽 테스트 (차단됨)

kubectl exec -n team-b pod-c -- curl http://pod-a.team-a.svc.cluster.local

 

💡 예상 출력 값

curl: (7) Failed to connect to pod-a.team-a.svc.cluster.local port 80: Connection refused

 

 


2️⃣ 서비스 간 트래픽 정책 및 보안 그룹 설정

 

❓ 문제 상황

 

운영팀에서 특정 애플리케이션 서비스 간 트래픽을 제한해야 하는 요구사항이 생겼습니다.

특히, 외부에서 접근할 수 있는 서비스와 내부 서비스 간 트래픽을 제어해야 합니다.

public-service는 모든 네임스페이스에서 접근 가능해야 합니다.

internal-serviceteam-a 네임스페이스에서만 접근 가능해야 합니다.

 

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

 


🛠️ 해결 방법

 

1. NetworkPolicy를 설정하여 public-service는 모든 네임스페이스에서 접근 가능하도록 허용합니다.

 

2. 반대로 internal-service는 team-a 네임스페이스에서만 접근 가능하도록 제한합니다.

 


✅ 정답 Manifest (서비스별 트래픽 제한 NetworkPolicy 설정)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-public-access
  namespace: team-a
spec:
  podSelector:
    matchLabels:
      app: public-service  # 외부에서 접근 가능한 서비스
  policyTypes:
  - Ingress
  ingress:
  - from: []  # 모든 네임스페이스에서 접근 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-internal-access
  namespace: team-a
spec:
  podSelector:
    matchLabels:
      app: internal-service  # 내부 서비스
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: team-a  # team-a에서만 접근 허용

 

 


📌 적용 후 예상 결과 값

 

1. NetworkPolicy 적용 확인

kubectl get networkpolicy -n team-a

 

💡 예상 출력 값

NAME                     POD-SELECTOR       AGE
allow-public-access      app=public-service 5s
restrict-internal-access app=internal-service 5s

 

2. public-service에 모든 네임스페이스에서 접근 가능 여부 확인

kubectl exec -n team-b pod-c -- curl http://public-service.team-a.svc.cluster.local

 

💡 예상 출력 값

<html>
<body>
<h1>Public Service</h1>
</body>
</html>

 

3. internal-service에 team-b에서 접근 시도 (차단됨)

kubectl exec -n team-b pod-c -- curl http://internal-service.team-a.svc.cluster.local

 

💡 예상 출력 값

curl: (7) Failed to connect to internal-service.team-a.svc.cluster.local port 80: Connection refused
728x90