TOPIC/Infra

Kubernetes Network Policy 공부하기 (1)

H-Y-E-N 2024. 1. 10. 17:01

안녕하세요. HYEN입니다.

이번에는 Kubernetes Network Policy에 대해서 공부해 보았습니다. 

먼저 이론적으로 Network Policy에 대해서 알아본 후 다음 글에서 실제 테스트한 내용을 다뤄보도록 하겠습니다. 🤩


 

Contents

     

    1. Network Policy란?

    • Kubernetes Cluster 내부에서 pod 간 통신 시 트래픽 규칙을 규정하는 역할을 하는 object입니다.

    • 기본적으로 Network Policy를 사용하지 않는 경우 Kubernetes Cluster 내부의 모든 pod는 서로 통신 가능하지만 Network Policy 사용 시 pod 간 통신을 제어할 수 있습니다.

    • Kubernetes Cluster가 Network Policy를 지원하는 네트워크 플러그인(CNI Plug-in)을 사용해야 Network Policy를 활성화할 수 있습니다.
    ✅ 물론, Kubernetes Cluster가 사용하는 CNI가 Network Policy를 지원하지 않더라도 Network Policy object 자체는 생성할 수 있습니다.
    ❌ 그러나 동작은 하지 않는 점! 주의하시길 바랍니다.

     

    • Network Policy는 Namespace Scoped 리소스로 Namespace 별로 생성해야 합니다. 

    • Azure Kubernetes Service의 경우 Network Policy를 구현하는 두 가지 방법을 제공하고 있습니다.

    1. Azure Network Policy Manager : Azure에서 자체적으로 구현한 정책
    2. Calico Network Policy : Tigera에서 만든 오픈 소스 네트워크 및 네트워크 보안 솔루션
     

    네트워크 정책을 사용하여 Pod 트래픽 보안 - Azure Kubernetes Service

    AKS(Azure Kubernetes Service)에서 Kubernetes 네트워크 정책을 사용하여 pod 안팎으로 흐르는 트래픽을 보호하는 방법 알아보기

    learn.microsoft.com

    • [AKS] > [설정] > [네트워킹] 탭에서 [네트워크 정책]을 확인할 수 있습니다.

     

     

    2. Network Policy를 통한 Kubernetes Cluster 내 pod 간 트래픽 제어 방식

    ✅ Ingress 트래픽 제어와 Egress 트래픽 제어는 독립적으로 선언됩니다.
          Ingress 트래픽과 Egress 트래픽 둘 다를 제어하고자 한다면 각각 규칙을 선언해 줘야 합니다.

    ✅ Network Policy는 충돌 되지 않으며 합산 되어 적용됩니다. 
          특정 방향에 대해 여러 개의 Policy가 존재할 경우에는 해당 Policy 모두가 적용됩니다.

     

     

    3. Network Policy 종류

    ✅ podSelector와 namespaceSelector는 Kubernetes Cluster 내부의 통신 제어 시 사용하는 것이 권장되고
          ipBlock의 경우 Kubernetes Cluster 외부 네트워크 제어에 사용하는 것이 권장됩니다.
          cf) pod ip는 임시적이고 예측할 수 없어 pod의 ip로 network를 통제하는 것이 비효율적이기 때문입니다. 

    ✅ podSelector와 namespaceSelector는 ingress/egress rule에서 두 종류를 함께 지정하여 사용할 수 있습니다. 

     

     

    Network Policy의 종류에 대해 좀 더 알아보도록 하겠습니다. 

     

    3.1 podSelector

    • 특정 pod에서 들어오는(Ingress), 특정 pod로 나가는(Egress) 통신을 제어하는 정책으로 Selector를 사용하여 Selector와 일치하는 pod에 대한 ingress/egress rule을 지정합니다. 

     

    3.2 namespaceSelector

    • 특정 Namespace 상에 있는 pod에서 들어오는(Ingress), 특정 Namespace 상에 있는 pod로 나가는(Egress) 통신을 제어하는 정책으로 Selector를 사용하여 Selector와 일치하는 pod에 대한 ingress/egress rule을 지정합니다.

     

    3.3 ipBlock

    • 특정 IP Block(CIDR 범위)에서 들어오는(Ingress), 특정 IP Block(CIDR 범위)로 나가는(Egress) 통신을 제어하는 정책입니다.

     

    4. Network Policy 예제

    4.1 Kubernetes 공식 문서 예제 

    (출처 : https://kubernetes.io/docs/concepts/services-networking/network-policies/)

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      namespace: default
    spec:
      podSelector: # Network Policy를 적용할 pod 명시 
        matchLabels:
          role: db # Label Selector를 사용하기 때문에 여러 pod를 대상으로 할 수 있음 
      policyTypes:
        - Ingress
        - Egress
      ingress:
        - from:
            - ipBlock:
                cidr: 172.17.0.0/16
                except:
                  - 172.17.1.0/24
            - namespaceSelector:
                matchLabels:
                  project: myproject # Namespace에 Label 먼저 지정해 줘야 함 
            - podSelector: 
                matchLabels:
                  role: frontend
          ports:
            - protocol: TCP
              port: 6379
      egress:
        - to:
            - ipBlock:
                cidr: 10.0.0.0/24
          ports:
            - protocol: TCP
              port: 5978
              endPort: 6000
    • spec section 하위 ingress / egress는 규칙들의 집합입니다. 
      • ingress의 경우 from field를 사용하고 egress의 경우 to field를 사용합니다.

    • policyTypes
      • 선택한 pod에 대한 Policy를 적용할 것인지 그 여부를 나타내는 field입니다. 

      • policyTypes가 명시되지 않은 경우 기본적으로 Ingress와 관련된 정책으로 인식하게 되며, Egress는 명시해 주어야 합니다.
         
      • cf) ingress와 egress를 모두 차단하고자 할 경우 policyTypes에 ingress와 egress를 모두 명시해 주어야 합니다. 

    • endPort field를 사용하여 단일 포트 대신 포트 범위를 대상으로 지정할 수 있습니다.
      •  이 field를 지원하는 CNI Plug-in에서만 사용할 수 있으며, 만약 endPort field를 지원하지 않는 Plug-in인 경우 endPort field를 사용하여도 port field만 적용됩니다. 

     

    4.2 Ingress나 Egress를 모두 허용하고자 할 경우

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: np-allow-all
      namespace: default
    spec:
      podSelector: {}
      egress:
      - {}
      ingress:
      - {}
      policyTypes:
      - Ingress
      - Egress
    • {}는 모두 포함한다는 의미입니다. (빈칸으로 놔두는 셈이죠.)

    • 지정한 Namespace에 배포된 모든 pod에 대해 egress/ingress를 허용하겠다라는 의미입니다. 

     

    4.3 Ingress나 Egress를 모두 차단하고자 할 경우

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: np-deny-all
      namespace: default
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
    • spec section 하위에 ingress/egress 규칙을 지정한 field 없이 policyTypes를 Ingress/Egress로 지정할 경우 허용되는 규칙이 없기 때문에 모든 트래픽이 차단되게 됩니다. 

    이렇게 Network Policy의 이론적인 내용에 대해 다뤄 보았는데요. 

    다음에는 실제로 Azure Kubernetes Service 내에서 Network Policy를 통해서 pod 간의 트래픽을 제어하는 방식에 대해 테스트한 내용으로 돌아 오겠습니다. 👻

    728x90
    320x100
    SMALL