Kubernetes Network Policy 공부하기 (1)

    728x90

    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로 지정할 경우 허용되는 규칙이 없기 때문에 모든 트래픽이 차단되게 됩니다. 

     

    다음 글 : https://sundlscha.tistory.com/14

     

    Kubernetes Network Policy 공부하기 (2)

    이전 글 : https://sundlscha.tistory.com/13 Kubernetes Network Policy 공부하기 (1) 1. Network Policy란? Kubernetes Cluster 내부에서 pod 간 통신 시 트래픽 규칙을 규정하는 역할을 하는 object입니다. 기본적으로 Network Pol

    sundlscha.tistory.com

     

    반응형

    댓글