Certificated 도전/CKAD- Kubernetes

[CKAD] NetworkPolicy 개념 잡기, 이것도 무조건 출제

지추월자 2025. 1. 23. 16:48
반응형

기본적으로 Kubernetes에서는 NetworkPolicy가 설정되지 않은 상태에서는 같은 클러스터 내의 모든 Pod들이 서로 통신이 가능합니다.

https://kubernetes.io/docs/concepts/cluster-administration/networking/
이는 클러스터 내의 Pod들이 동일한 가상 네트워크(Virtual Network)에 연결되어 있기 때문입니다.

 

Cluster Networking

Networking is a central part of Kubernetes, but it can be challenging to understand exactly how it is expected to work. There are 4 distinct networking problems to address: Highly-coupled container-to-container communications: this is solved by Pods and lo

kubernetes.io

 


1. NetworkPolicy란?

  • Pod 간 트래픽 제어:
    • Pod 간의 Ingress(들어오는 트래픽)와 Egress(나가는 트래픽)를 허용하거나 차단하는 역할.
  • Namespace 범위:
    • NetworkPolicy는 특정 Namespace 내에서 적용됩니다.
  • CNI 플러그인 지원 필요:
    • NetworkPolicy를 적용하려면 Kubernetes 클러스터에 CNI 플러그인(Calico, Cilium, Weave Net 등)이 설치되어야 합니다.
    • 기본적으로 네트워크 플러그인이 NetworkPolicy를 지원하지 않으면 동작하지 않습니다.

2. NetworkPolicy의 주요 필드

  1. podSelector:
    • 정책이 적용될 Pod을 라벨로 선택.
    • 선택된 Pod만 해당 NetworkPolicy의 규칙이 적용됩니다.
    • podSelector: {}는 모든 Pod을 의미.
  2. policyTypes:
    • 정책의 타입(트래픽 방향)을 지정:
      • Ingress: 들어오는 트래픽 제어.
      • Egress: 나가는 트래픽 제어.
      • 생략하면 Ingress만 포함.
  3. ingress / egress:
    • 허용할 트래픽의 규칙 정의.
    • 주요 필드:
      • from: 허용된 소스.
        • 특정 IP, Namespace, 또는 Pod 라벨을 기준으로 설정 가능.
      • to: 허용된 목적지 (Egress에서 사용).
      • ports: 허용된 포트와 프로토콜.
  4. namespaceSelector:
    • 특정 Namespace를 기준으로 트래픽을 허용.

3. NetworkPolicy 동작 규칙

  1. 정책이 없으면 기본적으로 모든 트래픽 허용:
    • Pod 간 트래픽은 제한 없이 모두 허용됩니다. 위에서 언급했던 내용이죠? 이건 아셔야합니다 기본 중에 기본! 
  2. NetworkPolicy를 적용하면 기본적으로 해당 Pod의 트래픽이 차단:
    • 명시적으로 허용된 트래픽만 통과.
  3. Ingress와 Egress는 별도로 정의:
    • 각각 독립적으로 설정 가능.
  4. 정책 적용 범위:
    • Pod의 라벨을 기준으로 선택되며, 선택되지 않은 Pod은 정책의 영향을 받지 않습니다.

4. NetworkPolicy 예제

1) 특정 Pod으로의 Ingress 허용

파일: allow-specific-pod-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-db-access
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: database
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: backend
      ports:
        - protocol: TCP
          port: 3306
  • 설명:
    • app=database 라벨을 가진 Pod에 대해 NetworkPolicy 적용.
    • app=backend 라벨을 가진 Pod에서 TCP 3306 포트로 들어오는 트래픽만 허용.
    • 이 외의 트래픽은 차단.

2) 특정 Namespace에서 오는 트래픽 허용

파일: allow-namespace-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-namespace-access
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: frontend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              env: dev
  • 설명:
    • app=frontend 라벨을 가진 Pod에 대해 NetworkPolicy 적용.
    • env=dev 라벨이 있는 Namespace의 Pod에서 들어오는 트래픽만 허용.

3) 모든 외부 트래픽 차단

파일: deny-all-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: secure-app
  policyTypes:
    - Ingress
  ingress: []
  • 설명:
    • app=secure-app 라벨을 가진 Pod에 대해 NetworkPolicy 적용.
    • Ingress 트래픽 전부 차단.

4) 특정 Egress 트래픽 허용

파일: allow-specific-egress.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: frontend
  policyTypes:
    - Egress
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 80
  • 설명:
    • app=frontend 라벨을 가진 Pod에서 나가는 트래픽에 대해 정책 적용.
    • 10.0.0.0/24 네트워크TCP 80 포트로 나가는 트래픽만 허용.

5) 모든 트래픽 허용

파일: allow-all-traffic.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-traffic
  namespace: default
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  • 설명:
    • 모든 Pod에 대해 모든 Ingress 및 Egress 트래픽을 허용.

5. 실습 절차

  1. 네임스페이스와 Pod 준비
    • frontend와 backend Pod을 준비:
      kubectl run frontend --image=nginx --labels="app=frontend"
      kubectl run backend --image=nginx --labels="app=backend"
      kubectl run database --image=nginx --labels="app=database"
      
  2. Pod 간 통신 테스트
    • NetworkPolicy 적용 전에는 모든 Pod 간 통신이 허용됩니다:
      kubectl exec -it frontend -- curl backend:80
      kubectl exec -it frontend -- curl database:80
      
  3. NetworkPolicy 적용
    • 예제 YAML 파일을 적용한 후, 다시 통신 테스트:
      kubectl apply -f allow-specific-pod-ingress.yaml
      kubectl exec -it frontend -- curl database:3306 # 성공
      kubectl exec -it backend -- curl database:3306  # 실패
      
  4. NetworkPolicy 상태 확인
  5. kubectl get networkpolicy kubectl describe networkpolicy allow-db-access

6. 작성 시 주의사항

  1. podSelector는 정책 적용 범위
    • podSelector에 해당되지 않는 Pod은 정책의 영향을 받지 않습니다.
  2. NetworkPolicy는 허용만 정의
    • NetworkPolicy는 허용할 트래픽만 정의합니다.
    • 명시적으로 허용되지 않은 트래픽은 차단됩니다.
  3. CNI 플러그인 확인
    • NetworkPolicy는 CNI 플러그인(예: Calico, Cilium 등)이 필요합니다. 플러그인이 없으면 정책이 적용되지 않습니다.
  4. Egress 정책은 명시적으로 설정해야 함
    • 기본적으로 Pod에서 나가는 트래픽은 제한이 없지만, Egress 정책을 명시하면 해당 트래픽도 제어됩니다.
  5. 다중 정책 적용
    • 여러 NetworkPolicy가 적용될 경우, 허용된 트래픽이 합쳐져서 동작합니다.

 

반응형