멀티 클러스터 인그레스 설정

이 페이지에서는 서로 다른 리전의 여러 Google Kubernetes Engine(GKE) 클러스터에서 트래픽을 라우팅하도록 멀티 클러스터 인그레스를 구성하는 방법을 설명합니다.

멀티 클러스터 인그레스는 클러스터 및 리전 간 공유 부하 분산 리소스 배포를 지원하는 GKE 클러스터를 위해 클라우드에서 호스팅되는 멀티 클러스터 인그레스 컨트롤러입니다.

멀티 클러스터 인그레스에 대해 알아보려면 멀티 클러스터 인그레스를 참조하세요. 또한 클러스터 간 인그레스 배포에 대해 알아볼 수 있습니다.

요구사항

멀티 클러스터 인그레스는 다음에서 지원됩니다.

  • GKE 클러스터
  • VPC 기반(별칭 IP) 모드의 클러스터. 자세한 내용은 VPC 기반 클러스터 만들기를 참조하세요.
  • HTTP 부하 분산이 사용 설정된 클러스터(기본적으로 사용 설정됨). 멀티 클러스터 인그레스는 외부 HTTP(S) 부하 분산기만 지원합니다.
  • 워크로드 아이덴티티로 사용 설정된 GKE 클러스터
  • Cloud SDK 버전 290 이상(gcloud --version). 최신 버전으로 업데이트하려면 gcloud components update 명령어를 사용합니다.

시작하기 전에

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

다음 방법 중 하나를 사용하여 기본 gcloud 설정을 진행합니다.

  • gcloud init를 사용하여 기본값 설정 과정을 진행합니다.
  • gcloud config를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.

gcloud init 사용

One of [--zone, --region] must be supplied: Please specify location 오류가 표시되면 이 섹션을 완료합니다.

  1. gcloud init를 실행하고 다음 안내를 따르세요.

    gcloud init

    원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

    gcloud init --console-only
  2. 안내를 따라 gcloud에서 Google Cloud 계정을 사용하도록 승인합니다.
  3. 새 구성을 만들거나 기존 구성을 선택합니다.
  4. Google Cloud 프로젝트를 선택합니다.
  5. 영역 클러스터의 기본 Compute Engine 영역이나 리전 또는 Autopilot 클러스터의 리전을 선택합니다.

gcloud config 사용

  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project PROJECT_ID
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot 또는 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region COMPUTE_REGION
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

배포 연습

이 연습에서는 구성요소를 배포하고 멀티 클러스터 인그레스를 사용하는 데 필요한 인프라를 준비합니다. 이러한 단계는 해당 환경에서 멀티 클러스터 인그레스를 사용하기 위해 필요합니다. 이 단계는 승격된 권한이 필요하며 GKE 관리자가 수행해야 합니다.

이 연습의 단계를 요약하면 다음과 같습니다.

  1. 필요한 API를 사용 설정합니다.
  2. 워크로드를 호스팅하기 위해 GKE 클러스터를 배포합니다.
  3. 클러스터를 Fleet으로 그룹화합니다.
  4. 멀티 클러스터 인그레스 관리 설정을 구성합니다.

다음 그림은 연습을 완료한 후의 환경을 보여줍니다.

리전, Fleet, 프로젝트 사이의 관계를 보여주는 클러스터 토폴로지입니다.

다이어그램에는 europe-west1us-central1 영역에 gke-usgke-eu라는 2개의 GKE 클러스터가 있습니다. 클러스터는 멀티 클러스터 인그레스 컨트롤러가 인식할 수 있도록 Fleet로 그룹화됩니다.

API 사용 설정

멀티 클러스터 인그레스에 사용 설정하는 API는 사용되는 멀티 클러스터 인그레스 가격 책정에 따라 달라집니다.

멀티 클러스터 인그레스가 사용되는 유일한 Anthos 기능인 경우 독립형 가격 책정을 사용하는 것보다 더 비용 효율적일 수 있습니다. 프로젝트가 청구되는 방식은 Anthos API(anthos.googleapis.com)가 사용 설정되었거나 중지되었는지에 따라 달라집니다.

  • Anthos API가 사용 설정되었으면 클러스터 vCPU 및 Anthos 가격 책정 수에 따라 프로젝트가 청구됩니다.
  • Anthos API가 중지되었으면 프로젝트에서 백엔드 멀티 클러스터 인그레스 pod 수에 따라 프로젝트가 청구됩니다.

프로젝트에 다른 Anthos on Google Cloud 구성요소 또는 기능이 사용되는 경우 Anthos 라이선싱을 사용해야 합니다.

언제든지 멀티 클러스터 인그레스 리소스 또는 트래픽에 영향을 주지 않으면서 멀티 클러스터 인그레스 청구 모델을 독립형에서 Anthos로 변경하거나 또는 그 반대로 변경할 수 있습니다. 청구 모델을 변경하려면 아래 안내에 따라 Anthos API를 사용 설정 또는 중지합니다.

Anthos 가격 책정

Anthos 가격 책정을 사용 설정하려면 다음 단계를 수행합니다.

  1. Anthos, 멀티 클러스터 인그레스, Connect, GKE API를 프로젝트에서 사용 설정합니다.

    gcloud services enable \
        anthos.googleapis.com \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        container.googleapis.com \
        --project=PROJECT_ID
    

    프로젝트에서 anthos.googleapis.com이 사용 설정된 후 Connect에 등록된 클러스터는 Anthos 가격 책정에 따라 청구됩니다.

독립형 가격 책정

독립형 가격 책정을 사용 설정하려면 다음 단계를 수행합니다.

  1. 프로젝트에서 Anthos API가 중지되었는지 확인합니다.

    gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com
    

    PROJECT_ID를 GKE 클러스터가 실행되는 프로젝트 ID로 바꿉니다.

    출력이 빈 응답이면 프로젝트에서 Anthos API가 중지되고 멀티 클러스터 인그레스 리소스가 독립형 가격 책정을 사용하여 청구됩니다.

  2. 멀티 클러스터 인그레스, Connect, GKE API를 프로젝트에서 사용 설정합니다.

    gcloud services enable \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        container.googleapis.com \
        --project=PROJECT_ID
    

클러스터 배포

이 섹션에서는 gke-usgke-eu라는 2개의 GKE 클러스터를 europe-west1us-central1 영역에 만듭니다.

Google Cloud 서비스 계정 키를 다운로드, 수동 순환, 관리할 필요 없이 클러스터의 워크로드가 인증될 수 있게 해주기 때문에 워크로드 아이덴티티가 사용 설정된 클러스터를 만드는 것이 좋습니다. 워크로드 아이덴티티를 사용 설정하지 않고 클러스터를 만드는 경우에는 서비스 계정 키를 사용하여 클러스터를 Fleet에 수동으로 등록해야 합니다.

워크로드 아이덴티티

  1. us-central1-b 영역에서 gke-us 클러스터를 만듭니다.

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. europe-west1-b 영역에서 gke-eu 클러스터를 만듭니다.

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

수동

  1. us-central1-b 영역에서 gke-us 클러스터를 만듭니다.

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. europe-west1-b 영역에서 gke-eu 클러스터를 만듭니다.

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    

클러스터 사용자 인증 정보 구성

이 섹션에서는 기억하기 쉬운 이름을 사용하여 클러스터 사용자 인증 정보를 구성합니다. 이렇게 하면 여러 클러스터 간에 리소스를 배포할 때 클러스터 간에 쉽게 전환할 수 있습니다.

  1. 클러스터의 사용자 인증 정보를 검색합니다.

    gcloud container clusters get-credentials gke-us \
        --zone=us-central1-b \
        --project=PROJECT_ID
    
    gcloud container clusters get-credentials gke-eu \
        --zone=europe-west1-b \
        --project=PROJECT_ID
    

    kubectl 클라이언트를 사용하여 클러스터 API 서버에 액세스할 수 있도록 사용자 인증 정보가 로컬로 저장됩니다. 기본적으로 자동 생성된 이름이 사용자 인증 정보에 대해 생성됩니다.

  2. 클러스터 컨텍스트의 이름을 바꿉니다.

    kubectl config rename-context gke_PROJECT_ID_us-central1-b_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1-b_gke-eu gke-eu
    

Fleet에 클러스터 등록

Connect를 사용하여 Fleet에 클러스터를 등록해야 합니다. Google Cloud 서비스 계정 또는 워크로드 아이덴티티를 사용하여 수동으로 클러스터를 등록할 수 있습니다.

워크로드 아이덴티티

  1. 클러스터에 워크로드 아이덴티티를 사용 설정했으면 다음 명령어를 실행하여 클러스터를 등록합니다.

    gcloud container hub memberships register gke-us \
        --gke-cluster us-central1-b/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. 클러스터가 Connect에 성공적으로 등록되었는지 확인합니다.

    gcloud container hub memberships list --project=PROJECT_ID
    

    출력은 다음과 비슷합니다.

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

수동

클러스터에 워크로드 아이덴티티가 사용 설정되지 않았으면 다음 단계를 수행하여 클러스터를 등록합니다.

  1. 클러스터 등록을 위한 기본 요건을 완료했는지 확인합니다.

  2. 서비스 계정을 만들고 서비스 계정의 기본 키 JSON 파일을 다운로드합니다.

  3. 다운로드한 기본 키 JSON 파일을 사용하여 Fleet에 클러스터를 등록합니다.

    gcloud container hub memberships register gke-us \
         --gke-cluster us-central1-b/gke-us \
         --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
         --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
        --project=PROJECT_ID
    

    다음을 바꿉니다.

    • SERVICE_ACCOUNT_KEY_PATH: 등록 기본 요건에서 다운로드한 서비스 계정의 비공개 키 JSON 파일에 대한 로컬 파일 경로입니다. 이 서비스 계정 키는 gke-connect 네임스페이스에 creds-gcp라는 보안 비밀로 저장됩니다.
  4. 클러스터가 Connect에 성공적으로 등록되었는지 확인합니다.

    gcloud container hub memberships list --project=PROJECT_ID
    

    출력은 다음과 비슷합니다.

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

구성 클러스터 지정

구성 클러스터는 구성원 클러스터에서 인그레스의 중심 제어 지점으로 선택할 수 있는 GKE 클러스터입니다. GKE 인그레스와 달리, 멀티 클러스터 인그레스 컨트롤러는 단일 클러스터에 없지만 구성 클러스터의 리소스를 감시하는 Google 관리 서비스입니다. 이 GKE 클러스터는 MultiClusterIngressMultiClusterService와 같은 리소스를 저장하는 멀티 클러스터 API 서버로 사용됩니다. 모든 구성원 클러스터는 구성 클러스터가 될 수 있지만 한 번에 구성 클러스터 하나만 있을 수 있습니다.

구성 클러스터에 대한 자세한 내용은 클러스터 설계 구성을 참조하세요.

구성 클러스터가 작동 중지되거나 이 클러스터에 액세스할 수 없으면 구성원 클러스터에서 MultiClusterIngressMultiClusterService 객체를 업데이트할 수 없습니다. 부하 분산기와 트래픽은 장애 발생 시 구성 클러스터와는 별개로 계속 작동합니다.

멀티 클러스터 인그레스를 사용 설정하고 구성 클러스터를 선택하는 작업은 동일한 단계에서 수행됩니다. 구성 클러스터로 선택한 GKE 클러스터는 이미 플릿에 등록되어 있어야 합니다.

  1. 구성 클러스터로 지정할 클러스터의 URI를 식별합니다.

    gcloud container hub memberships list
    

    출력은 다음과 비슷합니다.

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    
  2. 멀티 클러스터 인그레스를 사용 설정하고 gke-us를 구성 클러스터로 선택합니다.

    gcloud beta container hub ingress enable \
      --config-membership=gke-us
    

    컨트롤러가 부트스트랩되는 동안 이 프로세스는 몇 분 정도 걸릴 수 있습니다. 성공하면 다음과 비슷한 결과가 표시됩니다.

    Waiting for Feature to be created...done.
    Waiting for controller to start...done.
    

    실패하면 명령어가 다음과 같이 시간 초과됩니다.

    Waiting for controller to start...failed.
    ERROR: (gcloud.alpha.container.hub.ingress.enable) Controller did not start in 2 minutes. Please use the `describe` command to check Feature state for debugging information.
    

    앞의 단계에서 오류가 발생했으면 기능 상태를 확인합니다. 정확히 어떤 문제가 발생했는지 표시되어야 합니다.

    gcloud beta container hub ingress describe
    

    출력은 다음과 비슷합니다.

    createTime: '2021-02-04T14:10:25.102919191Z'
    membershipStates:
      projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
        state:
          code: ERROR
          description: '...is not a VPC-native GKE Cluster.'
          updateTime: '2021-08-10T13:58:50.298191306Z'
      projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
        state:
          code: OK
          updateTime: '2021-08-10T13:58:08.499505813Z'
    

    이러한 오류 메시지에 대한 자세한 내용은 문제해결 및 작업을 참조하세요.

공유 VPC 배포

공유 VPC 네트워크의 클러스터에 멀티 클러스터 인그레스를 배포할 수 있지만 참여하는 모든 백엔드 GKE 클러스터는 동일한 프로젝트에 있어야 합니다. 동일한 Cloud Load Balancing VIP를 사용하는 서로 다른 프로젝트에 GKE 클러스터를 배치할 수 없습니다.

비공유 VPC 네트워크에서 멀티 클러스터 인그레스 컨트롤러는 방화벽 규칙을 관리하여 상태 확인을 Cloud Load Balancing에서 컨테이너 워크로드로 전달할 수 있습니다.

공유 VPC 네트워크에서는 멀티 클러스터 인그레스가 이러한 방화벽 규칙을 관리할 수 없습니다. 방화벽 설정은 서비스 프로젝트 관리자가 액세스할 수 없는 호스트 프로젝트에서 관리하기 때문입니다. 공유 VPC 네트워크의 중앙 집중식 보안 모델은 의도적으로 네트워크 제어를 중앙화합니다. 공유 VPC 네트워크에서 호스트 프로젝트 관리자는 멀티 클러스터 인그레스 대신 Cloud Load Balancing 트래픽에 필요한 방화벽 규칙을 수동으로 만들어야 합니다.

다음 명령어는 클러스터가 공유 VPC 네트워크에 있을 때 만들어야 하는 방화벽 규칙을 보여줍니다. 소스 범위는 Cloud Load Balancing이 트래픽을 Google Cloud의 백엔드로 전송하는 데 사용하는 범위입니다. 이 규칙은 멀티 클러스터 인그레스 작동 기간 동안 있어야 하며 GKE 부하 분산에 더 이상 멀티 클러스터 인그레스 또는 Cloud Load Balancing을 사용하지 않는 경우에만 삭제될 수 있습니다.

클러스터가 공유 VPC 네트워크에 있으면 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --project HOST_PROJECT \
    --network SHARED_VPC \
    --direction INGRESS \
    --allow tcp:0-65535 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16

다음을 바꿉니다.

  • FIREWALL_RULE_NAME: 새 방화벽 규칙의 이름입니다.
  • HOST_PROJECT: 공유 VPC 호스트 프로젝트의 프로젝트 ID입니다.
  • SHARED_VPC: 공유 VPC 네트워크 이름입니다.

알려진 문제

config_membership 필드의 InvalidValueError

알려진 문제로 인해 gcloud 명령줄 도구가 멀티 클러스터 인그레스와 상호작용할 수 없습니다. 이 문제는 버전 346.0.0에서 발생했으며 버전 348.0.0에서 해결되었습니다. 멀티 클러스터 인그레스에서 gcloud 도구 버전 346.0.0 및 347.0.0을 사용하지 않는 것이 좋습니다.

잘못된 '리소스' 필드 값

Google Cloud Armor가 다음 GKE 버전으로 실행되는 멀티 클러스터 인그레스 구성 클러스터와 통신할 수 없습니다.

  • 1.18.19-gke.1400 이상
  • 1.19.10-gke.700 이상
  • 1.20.6-gke.700 이상

Google Cloud Armor 보안 정책을 구성할 때 다음 메시지가 표시됩니다.

Invalid value for field 'resource': '{"securityPolicy": "global/securityPolicies/"}': The given policy does not exist

이 문제를 방지하려면 구성 클러스터를 버전 1.21 이상으로 업그레이드하거나 다음 명령어를 사용하여 BackendConfig CustomResourceDefinition을 업데이트합니다.

kubectl patch crd backendconfigs.cloud.google.com --type='json' -p='[{"op": "replace", "path": "/spec/versions/1/schema/openAPIV3Schema/properties/spec/properties/securityPolicy", "value":{"properties": {"name": {"type": "string"}}, "required": ["name" ],"type": "object"}}]'

다음 단계