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

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

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

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

요구사항

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

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

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

가격 책정

게이트웨이 컨트롤러를 통해 배포되는 모든 Compute Engine 리소스는 GKE 클러스터가 있는 프로젝트에 따라 비용이 청구됩니다. 멀티 클러스터 게이트웨이 컨트롤러는 미리보기 중 추가 비용 없이 사용될 수 있지만, 일반 안정화 버전으로 전환된 후에는 유료 제품으로 전환됩니다.

시작하기 전에

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

  • Cloud SDK 버전 337.0.0 이상을 설치합니다.
  • 클러스터 등록을 위한 Connect 기본 요건을 완료합니다.
  • 프로젝트에서 필요한 다음 API를 사용 설정합니다.
    • Google Kubernetes Engine API
    • GKE Hub API
    • 멀티 클러스터 서비스 API
    • 멀티 클러스터 인그레스 API
    • Traffic Director API

아직 사용 설정되지 않았으면 이 명령어를 실행하여 필요한 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 \
        --release-channel=rapid \
        --cluster-version=1.20 \
        --project=PROJECT_ID
    

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

  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 \
        --release-channel=rapid \
        --cluster-version=1.20 \
        --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 \
        --release-channel=rapid \
        --cluster-version=1.20 \
        --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로 바꿉니다.

허브에 등록

  1. 세 클러스터가 모두 성공적으로 생성되었으면 이 클러스터를 GKE 허브에 등록해야 합니다. 그러면 멀티 클러스터 게이트웨이에서 대상으로 지정된 GKE 클러스터를 포함하는 리소스인 프로젝트의 Fleet에 각 클러스터가 매핑됩니다.

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

    gcloud alpha container hub 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에서 등록된 클러스터에 대해 멀티 클러스터 서비스를 사용 설정합니다. 이렇게 하면 서비스 리슨 및 내보내기를 시작할 수 있도록 허브에 등록된 2개 클러스터에 대해 MCS 컨트롤러가 사용 설정됩니다.

    gcloud container hub 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 hub 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 kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.3.0" \
    | kubectl apply -f -
    

    다음 CRD가 설치됩니다.

    customresourcedefinition.apiextensions.k8s.io/backendpolicies.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/gatewayclasses.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/gateways.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/httproutes.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/tcproutes.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/tlsroutes.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/udproutes.networking.x-k8s.io created
    

다음 단계에서 컨트롤러를 사용 설정한 후 멀티 클러스터 게이트웨이를 배포할 수 있도록 클러스터에 멀티 클러스터 GatewayClasses를 설치합니다.

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

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

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

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

    gcloud alpha container hub ingress enable \
        --config-membership=/projects/PROJECT_ID/locations/global/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. 등록된 클러스터에 대해 전역 GKE 게이트웨이 컨트롤러가 사용 설정되었는지 확인합니다.

    gcloud alpha container hub 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. ingress 허브 기능이 사용 설정되었으면 멀티 클러스터 GatewayClass를 구성 클러스터에서 사용할 수 있습니다. 이제 GatewayClass를 나열하면 외부 멀티 클러스터 게이트웨이에 대해 gke-l7-gxlb-mc가 표시되고 내부 멀티 클러스터 게이트웨이에 대해 gke-l7-rilb-mc가 표시됩니다. 이제 이러한 GatewayClass를 사용하여 멀티 클러스터 게이트웨이를 만들 수 있습니다.

    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
    

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

다음 단계