멀티 클러스터 게이트웨이 사용 설정


이 페이지에서는 GKE 클러스터에 외부 및 내부 부하 분산기를 프로비저닝하는 Google에서 호스팅되는 컨트롤러인 멀티 클러스터 GKE Gateway Controller를 사용 설정하는 방법을 보여줍니다. 컨테이너 부하 분산에 대해 게이트웨이 리소스를 사용하는 방법을 알아보려면 게이트웨이 배포 또는 멀티 클러스터 게이트웨이 배포를 참조하세요.

멀티 클러스터 GKE Gateway Controller는 클러스터에 다음 멀티 클러스터 GatewayClass를 설치합니다.

  • 전역 외부 멀티 클러스터 게이트웨이의 경우 gke-l7-global-external-managed-mc
  • 리전 외부 멀티 클러스터 게이트웨이의 경우 gke-l7-regional-external-managed-mc
  • 리전 내부 멀티 클러스터 게이트웨이의 경우 gke-l7-rilb-mc
  • 전역 외부 기본 멀티 클러스터 게이트웨이의 경우 gke-l7-gxlb-mc

GKE의 여러 GatewayClass의 기능에 대해 자세히 알아보세요.

가격 책정

게이트웨이 컨트롤러를 통해 배포되는 모든 Compute Engine 리소스는 GKE 클러스터가 있는 프로젝트에 따라 비용이 청구됩니다. 단일 클러스터 게이트웨이 컨트롤러는 GKE Standard 및 Autopilot 가격 책정에 따라 추가 비용 없이 제공됩니다. 멀티 클러스터 게이트웨이의 가격 책정은 멀티 클러스터 인그레스 및 게이트웨이 가격 책정 페이지에 설명되어 있습니다.

시작하기 전에

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

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

GKE Gateway Controller 요구사항

  • 표준인 경우 GKE 버전 1.24 이상
  • Autopilot의 경우 GKE 버전 1.26 이상
  • Google Cloud CLI 버전 407.0.0 이상
  • Gateway API는 VPC 기반 클러스터에서만 지원됩니다.
  • 내부 GatewayClasses를 사용하는 경우 프록시 전용 서브넷을 사용 설정해야 합니다.
  • 클러스터에 HttpLoadBalancing 부가기능이 사용 설정되어 있어야 합니다.
  • Istio를 사용하는 경우 Istio를 다음 버전 중 하나로 업그레이드해야 합니다.
    • 1.15.2 이상
    • 1.14.5 이상
    • 1.13.9 이상
  • 공유 VPC를 사용하는 경우 호스트 프로젝트에서 서비스 프로젝트에 대해 GKE 서비스 계정에 Compute Network User 역할을 할당해야 합니다.

멀티 클러스터 게이트웨이 요구사항

멀티 클러스터 게이트웨이 배포의 경우 GKE 게이트웨이 컨트롤러 요구사항 외에도 다음 작업을 수행해야 합니다.

  • 구성 클러스터에서 Gateway API를 사용 설정하기
  • 클러스터에 GKE용 워크로드 아이덴티티 제휴를 사용 설정하기
  • 클러스터 등록을 위한 Fleet 일반 기본 요건 완료하기
  • 프로젝트에서 다음 멀티 클러스터 게이트웨이 필수 API를 사용 설정합니다.

    • Traffic Director API
    • 멀티 클러스터 서비스 API
    • 멀티 클러스터 인그레스 API

    아직 사용 설정되지 않았으면 이 명령어를 실행하여 필요한 API를 사용 설정합니다.

    gcloud services enable \
      trafficdirector.googleapis.com \
      multiclusterservicediscovery.googleapis.com \
      multiclusteringress.googleapis.com \
      --project=PROJECT_ID
    

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

제한 및 한도

단일 클러스터 게이트웨이의 제한사항 및 알려진 문제가 멀티 클러스터 게이트웨이에도 동일하게 적용됩니다.

멀티 클러스터 게이트웨이에는 단일 클러스터 게이트웨이 제한사항 외에도 다음 제한사항이 적용됩니다.

  • 리전 내부 GatewayClass gke-l7-rilb-mc에는 다른 리전의 백엔드에 대한 부하 분산이 지원되지 않습니다. 각 GatewayClass에서 지원되는 다양한 기능에 대한 자세한 내용은 GatewayClass 기능을 참조하세요.

  • 멀티 클러스터 게이트웨이에서 ServicebackendRefs로 지원되지 않습니다. 멀티 클러스터 게이트웨이는 유효한 backendRefsServiceImport만을 지원합니다.

  • 프로젝트 간 부하 분산은 지원되지 않습니다. 동일한 멀티 클러스터 게이트웨이에 연결된 모든 클러스터(구성 클러스터 및 대상 클러스터)가 동일한 공유 VPC 호스트 프로젝트 또는 서비스 프로젝트에 배포되어야 합니다. 멀티 클러스터 게이트웨이에서 지원되는 공유 VPC 토폴로지에 대한 자세한 내용은 공유 VPC와 함께 멀티 클러스터 게이트웨이 사용을 참조하세요.

  • 멀티 클러스터 게이트웨이는 클러스터 간 서비스 검색을 처리하기 위해 MCS를 사용합니다. 따라서 멀티 클러스터 게이트웨이가 노출하는 서비스에는 모든 멀티 클러스터 서비스 요구사항이 적용됩니다.

할당량

GKE 게이트웨이는 Cloud Load Balancing 할당량을 사용하여 게이트웨이 컨트롤러가 GKE 클러스터로 라우팅된 인그레스 트래픽을 관리하기 위해 만들 수 있는 리소스 수를 제한합니다.

멀티 클러스터 게이트웨이의 환경 설정

멀티 GKE 클러스터에서 멀티 클러스터 게이트웨이 배포의 예시를 완료해야 합니다. 모든 클러스터가 동일한 Fleet에 등록되므로 멀티 클러스터 게이트웨이 및 서비스가 서로 작동할 수 있습니다.

다음 단계에서는 프로젝트의 두 가지 서로 다른 리전 간에 3개의 GKE 클러스터를 배포합니다.

  • us-west1-a/gke-west-1
  • us-west1-a/gke-west-2
  • us-east1-b/gke-east-1

그러면 다음 클러스터 토폴로지가 생성됩니다.

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

이러한 GKE 클러스터는 외부 및 내부 게이트웨이를 사용하여 멀티 리전 부하 분산블루-그린, 멀티 클러스터 트래픽 분할을 보여주기 위해 사용됩니다.

클러스터 배포

이 단계에서는 3개의 GKE 클러스터를 us-east1us-west1 리전에 배포합니다.

  1. gke-west-1이라는 us-west1에 GKE 클러스터를 만듭니다.

    gcloud container clusters create gke-west-1 \
        --gateway-api=standard \
        --zone=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

    다음을 바꿉니다.

    • PROJECT_ID: GKE 클러스터가 실행되는 프로젝트 ID입니다.
    • VERSION: GKE 버전으로서 1.24 이상입니다.
  2. us-west1(또는 이전 클러스터 gke-west-2와 동일한 리전)에 또 다른 GKE 클러스터를 만듭니다.

    gcloud container clusters create gke-west-2 \
        --gateway-api=standard \
        --zone=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    
  3. us-east1(또는 이전 항목과 다른 리전)에 gke-east-1이라는 GKE 클러스터를 만듭니다.

    gcloud container clusters create gke-east-1 \
        --gateway-api=standard \
        --zone=us-east1-b \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

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

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

  1. gke-west-1, gke-west-2, gke-east-1 클러스터에 대해 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials gke-west-1 --zone=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-west-2 --zone=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-east-1 --zone=us-east1-b --project=PROJECT_ID
    

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

  2. 나중에 쉽게 참조할 수 있도록 클러스터 컨텍스트 이름을 바꿉니다.

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-1 gke-west-1
    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-2 gke-west-2
    kubectl config rename-context gke_PROJECT_ID_us-east1-b_gke-east-1 gke-east-1
    

    PROJECT_ID를 클러스터가 배포된 프로젝트 ID로 바꿉니다.

Fleet에 클러스터 등록

  1. 세 클러스터가 모두 성공적으로 생성되었으면 이 클러스터를 프로젝트의 Fleet에 등록해야 합니다. GKE 클러스터를 Fleet에 하나의 그룹으로 묶으면 멀티 클러스터 게이트웨이에서 대상으로 지정할 수 있습니다.

    gcloud container fleet memberships register gke-west-1 \
         --gke-cluster us-west1-a/gke-west-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-west-2 \
         --gke-cluster us-west1-a/gke-west-2 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-east-1 \
         --gke-cluster us-east1-b/gke-east-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
  2. 클러스터가 Fleet에 성공적으로 등록되었는지 확인합니다.

    gcloud container fleet memberships list --project=PROJECT_ID
    

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

    NAME        EXTERNAL_ID                           LOCATION
    gke-east-1  45a80b37-4b00-49aa-a68b-b430fce1e3f0  us-east1
    gke-west-2  ac7087a5-f5ee-401e-b430-57f3af141239  us-west1
    gke-west-1  549efe3a-b18e-4eb9-8796-e50b7967cde2  us-west1
    

Fleet에서 멀티 클러스터 서비스 사용 설정

  1. Fleet에서 등록된 클러스터에 대해 멀티 클러스터 서비스를 사용 설정합니다. 이렇게 하면 서비스 리슨 및 내보내기를 시작할 수 있도록 Fleet에 등록된 3개 클러스터에 대해 MCS 컨트롤러가 사용 설정됩니다.

    gcloud container fleet multi-cluster-services enable \
        --project PROJECT_ID
    
  2. MCS 컨트롤러에 필요한 Identity and Access Management(IAM) 권한을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role "roles/compute.networkViewer" \
        --project=PROJECT_ID
    

    PROJECT_ID를 클러스터가 배포된 프로젝트 ID로 바꿉니다.

  3. 등록된 클러스터에 대해 MCS가 사용 설정되었는지 확인합니다. 등록된 3개 클러스터에 대해 멤버십이 표시됩니다. 클러스터가 모두 표시되려면 몇 분 정도 걸릴 수 있습니다.

    gcloud container fleet multi-cluster-services describe --project=PROJECT_ID
    

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

    createTime: '2023-10-12T06:14:33.466903587Z'
    membershipStates:
      projects/441323991697/locations/us-east1/memberships/gke-east-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:28.395318091Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:30.534594027Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-2:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:29.110582109Z'
    name: projects/pierre-louis-playground/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2023-10-12T06:15:31.027276757Z'
    

Fleet에서 멀티 클러스터 게이트웨이 사용 설정

멀티 클러스터 GKE Gateway Controller는 멀티 클러스터 게이트웨이의 배포를 제어합니다.

멀티 클러스터 게이트웨이 컨트롤러를 사용 설정할 때는 구성 클러스터를 선택해야 합니다. 구성 클러스터는 게이트웨이 리소스(게이트웨이, 경로, 정책)가 배포되는 GKE 클러스터입니다. 클러스터 전체의 라우팅을 제어하는 중앙 위치입니다. 구성 클러스터로 선택할 클러스터를 결정하려면 구성 클러스터 설계를 참조하세요.

  1. 멀티 클러스터 게이트웨이를 사용 설정하고 Fleet에서 구성 클러스터를 지정합니다. 나중에 언제든지 구성 클러스터를 업데이트할 수 있습니다. 이 예시에서는 멀티 클러스터 게이트웨이에 대해 리소스를 호스팅하는 구성 클러스터로 gke-west-1을 지정합니다.

    gcloud container fleet ingress enable \
        --config-membership=projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. 멀티 클러스터 게이트웨이 컨트롤러에 필요한 Identity and Access Management(IAM) 권한을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
        --role "roles/container.admin" \
        --project=PROJECT_ID
    

    PROJECT_IDPROJECT_NUMBER를 해당 클러스터가 배포된 프로젝트 ID 및 프로젝트 번호로 바꿉니다.

  3. Fleet에 대해 GKE Gateway Controller가 사용 설정되었는지 확인합니다.

    gcloud container fleet ingress describe --project=PROJECT_ID
    

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

    createTime: '2023-10-12T06:23:06.732858524Z'
    membershipStates:
      projects/441323991697/locations/us-east1/memberships/gke-east-1:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815839024Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-1:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815837031Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-2:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815840985Z'
    name: projects/pierre-louis-playground/locations/global/features/multiclusteringress
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/pierre-louis-playground/locations/us-west1/memberships/gke-west-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2023-10-12T06:23:51.317464415Z'
    updateTime: '2023-10-12T06:30:09.439319551Z'
    
  4. 구성 클러스터에 GatewayClasses가 존재하는지 확인합니다.

    kubectl get gatewayclasses --context=gke-west-1
    

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

    NAME                                  CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed        networking.gke.io/gateway   True       78m
    gke-l7-global-external-managed-mc     networking.gke.io/gateway   True       4m22s
    gke-l7-gxlb                           networking.gke.io/gateway   True       78m
    gke-l7-gxlb-mc                        networking.gke.io/gateway   True       4m23s
    gke-l7-regional-external-managed      networking.gke.io/gateway   True       78m
    gke-l7-regional-external-managed-mc   networking.gke.io/gateway   True       4m22s
    gke-l7-rilb                           networking.gke.io/gateway   True       78m
    gke-l7-rilb-mc                        networking.gke.io/gateway   True       4m22s
    

    이 출력에는 외부 멀티 클러스터 게이트웨이용 GatewayClass gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-gxlb-mc, 내부 멀티 클러스터 게이트웨이용 GatewayClass gke-l7-rilb-mc가 포함됩니다.

  5. kubectl 컨텍스트를 구성 클러스터로 전환합니다.

    kubectl config use-context gke-west-1
    

이제 구성 클러스터에서 멀티 클러스터 게이트웨이 배포를 시작할 준비가 되었습니다.

문제 해결

이 섹션에서는 멀티 클러스터 게이트웨이 컨트롤러 사용 설정과 관련된 문제를 해결하는 방법을 보여줍니다.

구성 클러스터에서 GatewayClass를 사용할 수 없음

kubectl get gatewayclasses 명령어를 실행할 때 다음 오류가 발생할 수 있습니다.

error: the server doesn't have a resource type "gatewayclasses"

이 문제를 해결하려면 클러스터에 Gateway API를 설치합니다.

gcloud container clusters update CLUSTER_NAME \
    --gateway-api=standard \
    --region=COMPUTE_REGION

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름
  • COMPUTE_REGION: 클러스터의 Compute Engine 리전. 영역 클러스터의 경우 --zone=COMPUTE_ZONE을 사용합니다.

알려진 문제

  • 멀티 클러스터 게이트웨이 컨트롤러에서 시작하는 데 실패할 수 있는 알려진 문제가 있습니다. 이 문제를 방지하려면 구성 클러스터에서 Gateway API를 사용 설정하고 Fleet 인그레스 기능을 사용 설정하기 전에 CRD를 포함합니다.
  • 멀티 클러스터 게이트웨이는 다음 시나리오에서 부하 분산기 리소스를 유출할 수 있습니다.
    • Fleet 인그레스 기능은 현재 구성 클러스터에 존재하는 모든 Gateway 리소스가 없는 새 구성 클러스터로 업데이트됩니다.
    • Fleet 인그레스 기능은 중지되지만 멀티 클러스터 GatewayClass를 참조하는 Gateway 리소스는 구성 클러스터에 존재합니다.
  • 멀티 클러스터 게이트웨이는 전역 서비스로 실행됩니다. 멀티 클러스터 게이트웨이 컨트롤러에 리전 Fleet(허브) 제어 영역 오류가 발생하면 리전이 서비스 상태로 돌아올 때까지 정적으로 실패하고 더 이상 부하 분산기를 변경하지 않는 방식으로 대응합니다.

다음 단계