네트워크 정책을 사용하여 클러스터 전체 통신 제어


이 페이지에서는 Google Kubernetes Engine(GKE)에 대해 클러스터 전체 네트워크 정책을 구성하는 방법을 설명합니다.

네트워크 정책 및 FQDN 네트워크 정책은 포드 간 통신 트래픽 규칙을 정의하는 데 도움이 됩니다. 네트워크 정책은 포드가 애플리케이션 내에서 서로 그리고 외부 엔드포인트와 통신하는 방법을 제어합니다.

클러스터 관리자는 클러스터 전체의 작업 트래픽 관리를 위해 네트워크 정책 제한을 극복하는 Cilium 클러스터 전체 네트워크 정책(CCNP)을 구성할 수 있습니다. Cilium 클러스터 전체 네트워크 정책은 애플리케이션 특정 규칙을 재정의하고 전체 클러스터 및 네임스페이스 간의 모든 워크로드에 대해 엄격한 네트워크 규칙을 적용합니다.

GKE의 Cilium 클러스터 전체 네트워크 정책은 GKE에서 적용된 정책을 지정하는 클러스터 범위의 커스텀 리소스 정의(CRD)입니다. GKE에서 Cilium 클러스터 전체 네트워크 정책을 사용 설정하여 전체 클러스터의 네트워크 규칙을 중앙에서 관리할 수 있습니다. 클러스터에 들어오고 나가는 트래픽에 대한 기본 레이어 3(IP 수준) 및 레이어 4(포트 수준) 액세스를 제어할 수 있습니다.

이점

Cilium 클러스터 전체 네트워크 정책의 이점은 다음과 같습니다.

  • 중앙 집중식 보안 시행: CCNP를 사용하면 전체 네트워크에 적용되는 네트워크 액세스 규칙을 정의할 수 있습니다. 이러한 CCNP 규칙은 최상위 보안 레이어로 작동하면서 네임스페이스 수준에서 잠재적으로 충돌 가능한 정책을 재정의합니다.
  • 멀티 테넌시 보호: 클러스터에 여러 팀 또는 테넌트가 호스팅되는 경우 네트워크 트래픽 제어에 집중된 CCNP 규칙을 구현하여 공유 클러스터 내에서 격리 환경을 안전하게 보호할 수 있습니다. 네임스페이스 또는 네임스페이스 그룹을 특정 팀에 할당하여 네트워크 수준 분리를 시행할 수 있습니다.
  • 유연한 기본 정책 정의: CCNP를 사용하면 전체 클러스터에 대해 기본 네트워크 규칙을 정의할 수 있습니다. 전체 클러스터 보안을 훼손하지 않고 필요에 따라 이러한 규칙을 맞춤설정할 수 있습니다.

CCNP를 구현하려면 클러스터에서 GKE Dataplane V2를 사용 설정합니다. CCNP CRD가 사용 설정되었는지 확인한 후 클러스터의 네트워크 액세스 규칙을 정의하는 정책을 만듭니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

요구사항

Cilium 클러스터 전체 네트워크 정책의 요구사항은 다음과 같습니다.

  • Google Cloud CLI 버전 465.0.0 이상
  • 다음 버전 중 하나를 실행하는 GKE 클러스터가 있어야 합니다.
    • 1.28.6-gke.1095000 이상
    • 1.29.1-gke.1016000 이상
  • 클러스터가 GKE Dataplane V2를 사용해야 합니다.
  • Cilium 클러스터 전체 네트워크 정책 CRD를 사용 설정해야 합니다.

제한사항

Cilium 클러스터 전체 네트워크 정책의 제한사항은 다음과 같습니다.

  • 레이어 7 정책이 지원되지 않습니다.
  • 노드 선택기가 지원되지 않습니다.
  • 클러스터당 최대 CiliumClusterwideNetworkPolicy 수는 1,000입니다.

새 클러스터에 Cilium 클러스터 전체 네트워크 정책 사용 설정

Google Cloud CLI 또는 Google Kubernetes Engine API를 사용하여 새 클러스터에서 Cilium 클러스터 전체 네트워크 정책을 사용 설정할 수 있습니다.

gcloud

새 클러스터에서 Cilium 클러스터 전체 네트워크 정책을 사용 설정하려면 --enable-cilium-clusterwide-network-policy 플래그를 사용해서 새 클러스터를 만듭니다.

Autopilot

gcloud container clusters create-auto CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름
  • COMPUTE_LOCATION: 클러스터 위치

Standard

gcloud container clusters create CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy \
    --enable-dataplane-v2

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름
  • COMPUTE_LOCATION을 클러스터 위치로 바꿉니다.

API

Cilium 클러스터 전체 네트워크 정책을 사용 설정하려면 새 클러스터를 만드는 동안 다음 옵션을 지정해야 합니다.

networkConfig 객체datapathProvider 필드

{
  "cluster": {
    ...
    "networkConfig": {
      "datapathProvider": "ADVANCED_DATAPATH",
      "enableCiliumClusterwideNetworkPolicy": true
    }
  }
}

ciliumclusterwidenetworkpolicies.cilium.io가 다음 명령어 출력에 있는지 확인합니다.

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

출력은 다음과 비슷하게 표시됩니다.

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

기존 클러스터에서 Cilium 클러스터 전체 네트워크 정책 사용 설정

Google Cloud CLI 또는 Google Kubernetes Engine API를 사용하여 기존 클러스터에서 Cilium 클러스터 전체 네트워크 정책을 사용 설정할 수 있습니다.

gcloud

  1. 클러스터에 GKE Dataplane V2가 사용 설정되었는지 확인합니다.

    gcloud container clusters describe CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --format="value(networkConfig.datapathProvider)" \
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터 이름
    • COMPUTE_LOCATION: 클러스터 위치
  2. --enable-cilium-clusterwide-network-policy 플래그를 사용하여 클러스터를 업데이트합니다.

    gcloud container clusters update CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --enable-cilium-clusterwide-network-policy
    
  3. anetd DaemonSet를 다시 시작합니다.

    kubectl rollout restart ds -n kube-system anetd && \
        kubectl rollout status ds -n kube-system anetd
    

API

GKE Dataplane V2에 대해 클러스터가 사용 설정되었는지 확인합니다.

{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  },
  "name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  }
  "name": "cluster"
}

ciliumclusterwidenetworkpolicies.cilium.io가 다음 명령어 출력에 있는지 확인합니다.

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

출력은 다음과 비슷하게 표시됩니다.

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

Cilium 클러스터 전체 네트워크 정책 사용

이 섹션에서는 Cilium 클러스터 전체 네트워크 정책을 구성하기 위한 예시를 보여줍니다.

예시 1: 워크로드에 대한 인그레스 트래픽 제어

다음 예시에서는 role=backend 라벨의 모든 엔드포인트가 role=frontend 라벨의 엔드포인트에서 포트 80으로 인그레스 연결을 수신하도록 사용 설정합니다. role=backend 라벨의 엔드포인트는 이 정책으로 허용되지 않는 모든 인그레스 연결을 거부합니다.

  1. 다음 매니페스트를 l4-rule-ingress.yaml로 저장합니다.

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-ingress"
    spec:
      endpointSelector:
        matchLabels:
          role: backend
      ingress:
        - fromEndpoints:
            - matchLabels:
                role: frontend
          toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f l4-rule-ingress.yaml
    

예시 2: 지정된 포트에서 워크로드의 이그레스 트래픽 제한

다음 규칙은 app=myService 라벨의 모든 엔드포인트가 모든 레이어 3 대상에 대해 포트 80으로 TCP를 사용해서 패킷을 전송할 수 있도록 제한합니다.

  1. 다음 매니페스트를 l4-rule-egress.yaml로 저장합니다.

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-egress"
    spec:
      endpointSelector:
        matchLabels:
          app: myService
      egress:
        - toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f l4-rule-egress.yaml
    

예시 3: 지정된 포트 및 CIDR에서 워크로드의 이그레스 트래픽 제한

다음 예시에서는 role=crawler 라벨의 모든 엔드포인트가 대상 CIDR 192.10.2.0/24에 대해 포트 80으로 TCP 프로토콜을 사용해서 패킷을 전송할 수 있도록 제한합니다.

  1. 다음 매니페스트를 cidr-l4-rule.yaml로 저장합니다.

     apiVersion: "cilium.io/v2"
     kind: CiliumClusterwideNetworkPolicy
     metadata:
       name: "cidr-l4-rule"
     spec:
       endpointSelector:
         matchLabels:
           role: crawler
       egress:
         - toCIDR:
             - 192.0.2.0/24
           toPorts:
             - ports:
                 - port: "80"
                   protocol: TCP
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f cidr-l4-rule.yaml
    

네트워크 트래픽 모니터링 및 문제 해결

네트워크 정책 로깅GKE Dataplane V2 관측 가능성에 따라 Cilium 클러스터 전체 네트워크 정책의 영향을 받는 네트워크 트래픽을 모니터링 및 문제 해결할 수 있습니다.

레이어 7 정책 또는 노드 선택기 사용 시도

증상

GKE Dataplane V2에 GKE를 사용 중이고 레이어 7 규칙(예: HTTP 필터링) 및 노드 선택기를 포함하는 CCNP 정책을 정의하려고 시도하면 다음과 비슷한 오류 메시지가 표시될 수 있습니다.

오류

Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'user@example.com', groups: 'system:authenticated'.

잠재적 원인

GKE에 CCNP에 대한 특정 제한사항이 있습니다. 애플리케이션 수준 데이터(예: HTTP 헤더) 기반의 필터링을 허용하는 레이어 7 정책과 노드 선택기는 GKE의 Cilium 통합 내에서 지원되지 않습니다.

해결 방법

GKE 클러스터에 고급 레이어 7 필터링 기능이 필요한 경우 Anthos Service Mesh를 사용하는 것이 좋습니다. 이렇게 하면 애플리케이션 수준의 트래픽 제어를 보다 세분화할 수 있습니다.

Cilium 클러스터 전체 네트워크 정책이 사용 설정되지 않음

증상

이 기능이 명시적으로 사용 설정되지 않은 클러스터에 Cilium 클러스터 전체 네트워크 정책(CCNP)을 구성하려고 시도할 때 이를 구성할 수 없고 다음과 비슷한 오류 메시지가 표시될 수 있습니다.

오류

error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first

잠재적 원인

Cilium 클러스터 전체 네트워크 정책에는 커스텀 리소스 정의(CRD)가 사용됩니다. 이 오류 메시지는 CRD가 클러스터에 없음을 나타냅니다.

해결 방법

CCNP를 사용하기 전에 Cilium 클러스터 전체 네트워크 정책 CRD를 사용 설정합니다.

다음 단계