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

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

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

멀티 클러스터 GKE Gateway Controller는 외부 멀티 클러스터 게이트웨이를 위한 gke-l7-gxlb-mc와 내부 멀티 클러스터 게이트웨이를 위한 gke-l7-rilb-mc의 두 가지 멀티 클러스터 GatewayClass를 설치합니다.

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

요구사항

멀티 클러스터 게이트웨이를 사용하려면 다음이 필요합니다.

내부 멀티 클러스터 게이트웨이에는 추가로 다음이 필요합니다.

  • 프로젝트에서 프록시 전용 서브넷을 사용 설정해야 합니다.
  • 동일한 게이트웨이를 공유하는 GKE 클러스터가 모두 동일한 Google Cloud 리전에 있어야 합니다.

가격 책정

게이트웨이 컨트롤러를 통해 배포되는 모든 Compute Engine 리소스는 GKE 클러스터가 있는 프로젝트에 따라 비용이 청구됩니다. 단일 클러스터 게이트웨이 컨트롤러는 GKE Standard 및 Autopilot 가격 책정에 따라 추가 비용 없이 제공됩니다. 미리보기 중에는 추가 요금 없이 멀티 클러스터 게이트웨이 컨트롤러를 사용할 수 있습니다. 정식 버전에서는 멀티 클러스터 게이트웨이 요금이 멀티 클러스터 인그레스 및 게이트웨이 가격 책정에 따라 청구됩니다.

시작하기 전에

멀티 클러스터 게이트웨이 배포를 시작하기 전 다음 태스크를 완료합니다.

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

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

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

환경 준비

멀티 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 \
        --zone=us-west1-a \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

    다음을 바꿉니다.

    • PROJECT_ID: GKE 클러스터가 실행되는 프로젝트 ID입니다.
    • VERSION: GKE 버전이며 1.20 이상이어야 합니다. --release-channel 플래그를 사용하여 출시 채널을 선택할 수도 있습니다. 출시 채널에는 기본 버전 1.20 이상이 있어야 합니다.
  2. us-west1(또는 이전 클러스터 gke-west-2와 동일한 리전)에 또 다른 GKE 클러스터를 만듭니다.

    gcloud container clusters create gke-west-2 \
        --zone=us-west1-a \
        --enable-ip-alias \
        --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 \
        --zone=us-east1-b \
        --enable-ip-alias \
        --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
    gke-east-1  657e835d-3b6b-4bc5-9283-99d2da8c2e1b
    gke-west-2  f3727836-9cb0-4ffa-b0c8-d51001742f19
    gke-west-1  93de69c0-859e-4ddd-bf3a-e3d62ef5090b
    

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

  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: '2021-04-02T19:34:57.832055223Z'
    membershipStates
      projects/381015962062/locations/global/memberships/gke-east-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T11:03:07.770208064Z'
      projects/381015962062/locations/global/memberships/gke-west-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T09:32:14.401508987Z'
      projects/381015962062/locations/global/memberships/gke-west-2:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T13:53:27.628109510Z'
    name: projects/PROJECT_ID/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2021-04-02T19:34:58.983512446Z'
    

Gateway API CRD 설치

GKE에서 게이트웨이 리소스를 사용하기 전 클러스터에 Gateway API 커스텀 리소스 정의(CRD)를 설치해야 합니다.

  1. 게이트웨이 리소스를 배포하려는 GKE 클러스터에서 다음 명령어를 실행합니다.

    kubectl --context gke-west-1 apply -k "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.5.0"
    

    이 명령어는 v1beta1 CRD를 설치합니다.

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

    customresourcedefinition.apiextensions.k8s.io/gatewayclasses.gateway.networking.k8s.io configured
    customresourcedefinition.apiextensions.k8s.io/gateways.gateway.networking.k8s.io configured
    customresourcedefinition.apiextensions.k8s.io/httproutes.gateway.networking.k8s.io configured
    

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

멀티 클러스터 GKE Gateway Controller는 멀티 클러스터 게이트웨이(및 또한 MulticlusterIngress 리소스)의 배포를 제어합니다. gcloud container fleet ingress enable 명령어로 사용 설정됩니다.

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

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

    gcloud container fleet ingress enable \
        --config-membership=/projects/PROJECT_ID/locations/global/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. Fleet에 대해 전역 GKE Gateway Controller가 사용 설정되었는지 확인합니다.

    gcloud container fleet ingress describe --project=PROJECT_ID
    

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

    createTime: '2021-05-26T13:27:37.460383111Z'
    membershipStates:
      projects/381015962062/locations/global/memberships/gke-east-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896080Z'
      projects/381015962062/locations/global/memberships/gke-west-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397895711Z'
      projects/381015962062/locations/global/memberships/gke-west-2:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896293Z'
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/PROJECT_ID/locations/global/memberships/gke-west-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2021-05-26T13:27:37.899549111Z'
    updateTime: '2021-05-27T15:08:19.397895711Z'
    
  3. 게이트웨이 컨트롤러에 필요한 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 및 프로젝트 번호로 바꿉니다.

  4. 클러스터에 GatewayClasses가 존재하는지 확인합니다.

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

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

    NAME             CONTROLLER
    gke-l7-gxlb      networking.gke.io/gateway
    gke-l7-gxlb-mc   networking.gke.io/gateway
    gke-l7-rilb      networking.gke.io/gateway
    gke-l7-rilb-mc   networking.gke.io/gateway
    

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

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

    kubectl config use-context gke-west-1
    

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

다음 단계