GKE LoadBalancer 서비스의 사용자 관리형 방화벽 규칙


이 페이지에서는 GKE가 LoadBalancer 서비스에 대해 만드는 인그레스 허용 VPC 방화벽 규칙을 사용 중지하는 방법을 설명합니다.

LoadBalancer 서비스에 대해 자동으로 생성된 이러한 방화벽 규칙을 사용 중지하면 다음과 같은 경우에 유용할 수 있습니다.

LoadBalancer 서비스에 대해 자동으로 생성된 방화벽 규칙을 사용 중지하려면 클러스터를 만들거나 업데이트할 때 --disable-l4-lb-firewall-reconciliation 플래그를 지정해야 합니다. --disable-l4-lb-firewall-reconciliation 플래그는 노드 간 통신을 용이하게 하는 규칙이나 서비스의 상태 확인을 허용하는 규칙과 같이 자동으로 생성된 다른 VPC 방화벽 규칙에는 영향을 미치지 않습니다.

요구사항

  • LoadBalancer 서비스에 사용자 관리 방화벽 규칙을 사용하려면 GKE 클러스터에서 버전 1.31.3-gke.105600 이상을 사용해야 합니다.

제한사항

GKE는 다음 유형의 LoadBalancer 서비스에 대한 방화벽 규칙 자동 생성 사용 중지를 지원합니다.

다음 유형의 LoadBalancer 서비스에는 방화벽 규칙 자동 생성을 사용 중지할 수 없습니다.

  • GKE 하위 설정을 사용하지 않는 내부 LoadBalancer 서비스
  • 대상 풀 기반 외부 LoadBalancer 서비스

시작하기 전에

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

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

수동 방화벽 규칙 관리 전략

GKE 클러스터에서 LoadBalancer 서비스에 대한 VPC 방화벽 규칙의 자동 생성을 사용 중지하기 전에 보안 관리자와 협력하여 방화벽 규칙을 수동으로 구성하기 위한 전략을 수립하세요.

  1. 계층식 방화벽 정책, 전역 네트워크 방화벽 정책 또는 리전 네트워크 방화벽 정책 중 사용할 방화벽 정책 유형을 결정합니다. 방화벽 정책을 만드는 단계는 다음을 참고하세요.

    정책을 사용하지 않는 VPC 방화벽 규칙을 사용할 수도 있습니다.

  2. 묵시적 수신 거부 방화벽 규칙이 수신 트래픽을 금지하므로 수동으로 만든 방화벽 규칙은 수신 허용 규칙이어야 합니다. VPC 방화벽 규칙의 자동 생성을 사용 중지한 경우 LoadBalancer 서비스의 트래픽과 일치하는 인그레스 허용 방화벽 규칙을 만들지 않으면 수신 트래픽이 노드에 도달하지 않습니다.

    방화벽 규칙의 매개변수에 따라 하나의 인그레스 허용 방화벽 규칙이 하나 이상의 LoadBalancer 서비스에 적용될 수 있습니다. 만드는 각 인그레스 허용 방화벽 규칙에 대해 다음 매개변수를 정의합니다.

    • 타겟 매개변수: 방화벽 규칙에 LoadBalancer 서비스가 포함된 클러스터의 모든 노드가 포함되어 있는지 확인합니다. 지원되는 대상은 규칙이 있는 방화벽 정책의 유형 또는 VPC 방화벽 규칙을 사용하는지에 따라 다릅니다. 방화벽 정책의 규칙 타겟 매개변수에 대한 자세한 내용은 타겟을 참고하세요.

    • 프로토콜 및 포트: 방화벽 규칙을 적용해야 하는 LoadBalancer 서비스에서 사용하는 모든 프로토콜 및 대상 포트를 포함합니다.

    • 대상 매개변수: 대상 매개변수에 다음 전략 중 하나를 사용할 수 있습니다.

      • 방화벽 규칙이 적용되어야 하는 모든 LoadBalancer 서비스의 IP 주소를 대상 매개변수에 포함합니다. LoadBalancer 서비스의 IP 주소를 찾으려면 다음 명령어를 사용합니다.
         kubectl get svc LOADBALANCER_NAME \
            -n NAMESPACE_NAME \
            -o jsonpath='{.status.loadBalancer.ingress[0].ip}
      
      • 대상 매개변수를 생략할 수 있습니다. 대상 매개변수를 생략하면 대상 매개변수가 대상을 암시적으로 정의합니다. 자세한 내용은 인그레스 규칙의 대상 및 IP 주소를 참고하세요.
    • 소스 매개변수: 방화벽 규칙을 적용해야 하는 부하 분산기 서비스에 연결해야 하는 클라이언트에서 사용하는 소스 (예: IP 주소)를 지정합니다.

    방화벽 규칙을 만드는 단계는 다음을 참고하세요.

  3. 수동으로 만든 방화벽 규칙이 올바르게 작동하는지 확인하려면 Network Intelligence Center (NIC) 연결 테스트를 실행합니다. 연결 테스트를 실행할 때:

    • 대상을 LoadBalancer 서비스의 IP 주소로 설정합니다.
    • 소스를 클라이언트의 IP 주소로 설정합니다.

    자세한 내용은 연결 문제 해결을 참고하세요.

LoadBalancer 서비스에 대한 VPC 방화벽 규칙 생성 사용 중지

이 섹션에서는 LoadBalancer 서비스에 대한 VPC 방화벽 규칙의 자동 생성을 사용 중지하는 단계를 설명합니다.

VPC 방화벽 규칙 생성이 사용 중지된 새 GKE 클러스터 만들기

  1. 새로 만든 클러스터에서 LoadBalancer 서비스에 대해 자동으로 생성된 VPC 방화벽 규칙을 사용 중지하려면 --disable-l4-lb-firewall-reconciliation 플래그를 사용하여 클러스터를 만듭니다.

    Autopilot:

    gcloud container clusters create-auto CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --cluster-version=VERSION
    

    표준:

    gcloud container clusters create CLUSTER_NAME \
      --disable-l4-lb-firewall-reconciliation \
      --enable-l4-ilb-subsetting \
      --cluster-version=VERSION
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 새 클러스터의 이름
    • VERSION: GKE 버전입니다.
  2. 외부 또는 내부 LoadBalancer 서비스를 만듭니다.

  3. GKE가 LoadBalancer 서비스에 대한 인그레스 허용 방화벽 규칙을 만들지 않는지 확인합니다. 자동으로 생성된 인그레스 허용 방화벽 규칙의 이름은 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash] 형식입니다.

    다음 명령어는 k8s2가 포함된 방화벽 규칙 목록을 반환합니다.

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    externalTrafficPolicy 매개변수가 Local로 설정된 경우 응답은 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw 형식의 상태 확인 방화벽 규칙만 반환해야 합니다. spec.healthCheckNodePort 매개변수로 정의된 TCP 포트를 사용합니다. 지정되지 않은 경우 Kubernetes 제어 영역은 노드 포트 범위에서 상태 점검 포트를 할당합니다.

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    externalTrafficPolicy 매개변수가 Cluster로 설정된 경우 다음 상태 확인 방화벽 규칙이 대신 반환됩니다.

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    GKE 서비스에 생성된 방화벽 규칙에 관한 자세한 내용은 자동으로 생성되는 방화벽 규칙을 참고하세요.

VPC 방화벽 규칙 생성을 사용 중지하도록 기존 GKE 클러스터 업데이트

VPC 방화벽 규칙 생성을 사용 중지하기 전에 기존 클러스터 업데이트에 관한 다음 사항에 유의하세요.

  • VPC 방화벽 규칙 생성을 사용 중지하도록 기존 클러스터를 업데이트해도 GKE는 LoadBalancer 서비스에 대해 GKE가 자동으로 만든 기존 방화벽 규칙을 삭제하지 않습니다.
  • GKE는 기존 규칙의 업데이트를 중지하고 새 LoadBalancer 서비스에 대한 새 규칙을 만들지 않습니다.
  • VPC 방화벽 규칙 생성을 다시 사용 설정하려면 gcloud_name container clusters update 명령어와 함께 --enable-l4-lb-firewall-reconciliation 플래그를 사용하면 됩니다.

기존 클러스터에서 자동 방화벽 규칙 생성을 사용 중지하려면 다음 단계를 따르세요.

  1. LoadBalancer 서비스의 방화벽 규칙 자동 생성 및 관리를 사용 중지하도록 클러스터를 업데이트합니다.

    gcloud container clusters update CLUSTER_NAME \
    --disable-l4-lb-firewall-reconciliation \
    --cluster-version=supported_version
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 새 클러스터의 이름
    • VERSION: GKE 버전입니다.
  2. 외부 또는 내부 LoadBalancer 서비스를 만듭니다.

  3. GKE가 LoadBalancer 서비스에 대해 인그레스 허용 방화벽 규칙을 만들지 않는지 확인합니다. 자동으로 생성된 인그레스 허용 방화벽 규칙의 이름은 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash] 형식입니다.

    다음 명령어는 k8s2가 포함된 방화벽 규칙 목록을 반환합니다.

    gcloud compute firewall-rules list --format="value(name)" | grep "k8s2"
    

    externalTrafficPolicy 매개변수가 Local로 설정된 경우 응답은 k8s2-[cluster-id]-[namespace]-[service-name]-[suffixhash]-fw 형식의 상태 확인 방화벽 규칙만 반환해야 합니다. spec.healthCheckNodePort 매개변수로 정의된 TCP 포트를 사용합니다. 지정되지 않은 경우 Kubernetes 제어 영역은 노드 포트 범위에서 상태 점검 포트를 할당합니다.

    k8s2-rkdld6go-default-ilb-svc-dluvsefq-fw  default  INGRESS  1000  tcp:30868  False
    

    externalTrafficPolicy 매개변수가 Cluster로 설정된 경우 다음 상태 확인 방화벽 규칙이 대신 반환됩니다.

    k8s2-rkdld6go-l4-shared-hc-fw  default  INGRESS  1000  tcp:10256  False
    

    GKE 서비스에 생성된 방화벽 규칙에 관한 자세한 내용은 자동으로 생성되는 방화벽 규칙을 참고하세요.

연결 문제 해결하기

다음 예는 Network Intelligence Center 연결 테스트를 사용하여 외부 LoadBalancer Service:cluster에 대한 연결을 테스트하는 방법을 보여줍니다.

  • Network Intelligence Center:

    1. Google Cloud 콘솔에서 Network Intelligence Center로 이동하여 새 연결 테스트를 시작합니다.
    2. 드롭다운 메뉴에서 소스로 모든 외부 공개 IP 주소를 선택하고 대상에서 로드 밸런서를 선택합니다.
    3. 연결 테스트를 다시 실행합니다.
  • gcloud CLI:

    다음 명령어 예에서는 로컬 워크스테이션의 공개 IP 주소를 소스로, 외부 부하 분산기의 외부 IP 주소를 대상으로 테스트를 만들고 실행합니다.

    gcloud network-management connectivity-tests create TEST_NAME \
    --source-ip-address=SOURCE_IP_ADDRESS \
    --source-network-type=NON_GCP_NETWORK \
    --destination-ip-address=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.status.loadBalancer.ingress[0].ip}') \
    --destination-port=$(kubectl get svc LOADBALANCER_NAME -o jsonpath='{.spec.ports[0].targetPort}') \
    --destination-network=projects/PROJECT_ID/global/networks/NETWORK_NAME
    

    다음을 바꿉니다.

    • TEST_NAME: 연결 테스트의 이름입니다.
    • SOURCE_IP_ADDRESS: 외부 LoadBalancer 서비스에 연결해야 하는 시스템의 IP 주소입니다. 예를 들면 다음과 같습니다.
    • LOADBALANCER_NAME: 외부 LoadBalancer 서비스의 이름입니다.
    • PROJECT_ID: 클러스터의 VPC 네트워크가 포함된 프로젝트의 프로젝트 ID입니다. 클러스터에서 공유 VPC 네트워크를 사용하는 경우 호스트 프로젝트의 프로젝트 ID를 사용합니다.
    • NETWORK_NAME: 클러스터의 VPC 네트워크 이름입니다.

    테스트 결과를 확인합니다.

    gcloud network-management connectivity-tests describe TEST_NAME
    

다음 단계