GKE Gateway API 설정 준비

이 가이드에서는 Traffic Director와 함께 Google Kubernetes Engine Gateway API를 사용하기 위한 환경을 준비하는 방법을 설명합니다. 개략적으로 다음 단계를 수행해야 합니다.

  1. 필요한 Google Cloud 서비스를 사용 설정합니다.
  2. GKE 클러스터를 배포합니다.
  3. IAM 권한을 구성합니다.
  4. 필수 커스텀 리소스 정의(CRD)를 설치합니다.
  5. Fleet에 클러스터를 등록합니다.
  6. [선택사항] 멀티 클러스터 서비스(멀티 클러스터 서비스 검색)를 사용 설정합니다.
  7. 서비스 메시를 사용 설정합니다.

GKE를 사용하지 않는 경우 서비스 라우팅 API를 사용하고 Mesh 리소스를 만듭니다.

시작하기 전에

배포 구성요소가 다음 요구사항을 충족하는지 확인합니다.

  • GKE는 버전 1.20 이상이어야 합니다.
  • xDS 버전 3 API 이상의 데이터 영역만 지원됩니다.
    • 최소 Envoy 버전 1.20.0
    • 최소 gRPC 부트스트랩 생성기 버전 v0.14.0.
  • GKE 클러스터는 VPC 기반(별칭 IP) 모드여야 합니다.
  • GKE와 달리 Compute Engine의 자체 관리형 Kubernetes 클러스터는 지원되지 않습니다.
  • GKE의 게이트웨이 기능에 나열된 추가 제한사항은 GKE Gateway API와의 Traffic Director 통합에 적용됩니다.
  • GKE 노드 및 포드의 서비스 계정에 Traffic Director API 액세스 권한이 있어야 합니다. 필요한 권한에 대한 자세한 내용은 서비스 계정에 Traffic Director API 액세스 권한 부여를 참조하세요.
  • 프로젝트당 리소스 사용량 및 백엔드 서비스 할당량 제한사항이 적용됩니다.

필요한 Google Cloud 서비스 사용 설정

  1. 프로젝트에서 아직 사용 설정되지 않은 경우 다음 명령어를 실행하여 필요한 API를 사용 설정합니다.

    gcloud services enable --project=PROJECT_ID \
      container.googleapis.com \
      gkehub.googleapis.com \
      multiclusteringress.googleapis.com \
      trafficdirector.googleapis.com \
      networkservices.googleapis.com
    
  2. Fleet에 클러스터를 두 개 이상 포함하려면 multiclusterservicediscovery API를 사용 설정합니다.

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

GKE 클러스터 배포하기

다음 안내에 따라 GKE 클러스터를 배포합니다.

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

    gcloud container clusters create gke-1 \
      --zone=us-west1-a \
      --enable-ip-alias \
      --workload-pool=PROJECT_ID.svc.id.goog \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --enable-mesh-certificates \
      --release-channel=regular \
      --project=PROJECT_ID
    
    • --enable-ip-alias: 이 플래그는 VPC 기반 클러스터를 만들고 포드의 IP 주소를 VPC 네트워크 내에서 라우팅할 수 있게 합니다.
    • --workload-pool: 이 플래그를 사용하면 클러스터가 프로젝트의 워크로드 아이덴티티 풀에 참여할 수 있습니다.
    • --scopes: 이 플래그는 클러스터 노드에 할당된 OAuth 범위를 지정합니다.
    • --release-channel: 이 플래그는 regular 채널을 지정합니다.
    • --enable-mesh-certificates: 이 플래그는 추후 Traffic Director의 자동 mTLS 기능을 사용할 수 있게 되는 경우 사용 설정합니다.
  2. 클러스터 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials gke-1 --zone=us-west1-a
    
  3. 클러스터 컨텍스트 이름을 바꿉니다.

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-1 gke-1
    

데이터 영역의 IAM 권한 구성

이 데모 배포에서는 GKE 클러스터의 모든 서비스 계정을 포함한 인증된 모든 사용자에게 Traffic Director 클라이언트 역할 roles/trafficdirector.client를 부여합니다. 이 IAM 역할은 Envoy와 같은 데이터 영역의 Traffic Director 클라이언트가 Traffic Director에서 구성을 수신하도록 승인하는 데 필요합니다.

인증된 모든 사용자에게 클라이언트 역할을 부여하지 않고 역할을 서비스 계정으로 제한하려는 경우 GKE 워크로드 아이덴티티 가이드를 참조하여 서비스에 대한 roles/trafficdirector.client 역할이 있는 특수 Kubernetes 서비스 계정을 선택합니다.

  1. 서비스 계정에 client 역할을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/" \
      --role "roles/trafficdirector.client"
    

필수 커스텀 리소스 정의 설치

  1. Traffic Director에서 Gateway API를 사용하는 데 필요한 커스텀 리소스 정의(CRD)를 설치합니다.

    kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.6.0"
    
    kubectl kustomize "https://github.com/GoogleCloudPlatform/gke-networking-recipes.git/gateway-api/config/mesh/crd" \
    | kubectl apply -f -
    
  2. 다음 명령어를 실행하여 필수 CRD가 클러스터에 자동으로 설치되는지 확인합니다.

    kubectl get crds
    

    출력에는 다음 CRD 및 Gateway API와 관련이 없는 기타 CRD가 나열됩니다(생성 날짜는 모두 다름).

    NAME                                             CREATED AT
    gatewayclasses.gateway.networking.k8s.io                           2023-08-08T05:29:03Z
    gateways.gateway.networking.k8s.io                                 2023-08-08T05:29:03Z
    grpcroutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    httproutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    referencegrants.gateway.networking.k8s.io                          2023-08-08T05:29:04Z
    tcproutes.gateway.networking.k8s.io                                2023-08-08T05:29:04Z
    tdgrpcroutes.net.gke.io                                            2023-08-08T05:29:23Z
    tdmeshes.net.gke.io                                                2023-08-08T05:29:23Z
    tlsroutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    udproutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    

커스텀 리소스 tdmeshes.net.gke.iotdgrpcroutes.net.gke.io는 이전 단계에서 설치됩니다.

net.gke.io API 그룹에 속하는 CRD는 GKE에 따라 다릅니다. 이러한 리소스는 networking.k8s.io API 그룹에 있는 OSS 게이트웨이 API 구현에 포함되지 않습니다.

Fleet에 클러스터 등록

클러스터가 성공적으로 생성되면 클러스터를 Fleet에 등록해야 합니다. 클러스터를 Fleet에 등록하면 등록된 클러스터에서 기능을 선택적으로 사용 설정할 수 있습니다.

  1. Fleet에 클러스터를 등록합니다.

    gcloud container hub memberships register gke-1 \
      --gke-cluster us-west1-a/gke-1 \
      --location global \
      --project=PROJECT_ID
    
  2. 클러스터가 Fleet에 등록되었는지 확인합니다.

    gcloud container hub memberships list --project=PROJECT_ID
    

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

    NAME   EXTERNAL_ID
    gke-1  657e835d-3b6b-4bc5-9283-99d2da8c2e1b
    

(선택사항) 멀티 클러스터 서비스 검색 사용 설정

멀티 클러스터 서비스 검색 기능을 사용하면 클러스터 로컬 서비스를 Fleet에 등록된 모든 클러스터로 내보낼 수 있습니다. Fleet에 클러스터를 두 개 이상 포함하지 않으려는 경우 이 단계는 선택사항입니다.

  1. 멀티 클러스터 서비스 검색을 사용 설정합니다.

    gcloud container hub multi-cluster-services enable \
      --project PROJECT_ID
    
  2. 멀티 클러스터 서비스 검색에 필요한 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"
    
  3. 등록된 클러스터에 멀티 클러스터 서비스 검색이 사용 설정되어 있는지 확인합니다. 모든 클러스터가 표시되는 데 몇 분 정도 걸릴 수 있습니다.

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

    다음과 비슷한 gke-1의 멤버십이 표시됩니다.

    createTime: '2021-04-02T19:34:57.832055223Z'
    membershipStates
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T11:03:07.770208064Z'
    name: projects/PROJECT_NUM/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2021-04-02T19:34:58.983512446Z'
    

Traffic Director GKE 서비스 메시 사용 설정

이 섹션에서는 서비스 메시를 사용 설정합니다.

  1. Fleet에 등록한 클러스터에서 Traffic Director GKE 서비스 메시를 사용 설정합니다.

    gcloud container hub ingress enable \
    --config-membership=projects/PROJECT_ID/locations/global/memberships/gke-1 \
      --project=PROJECT_ID
    
  2. 이 기능이 사용 설정되어 있는지 확인합니다.

    gcloud container hub ingress describe --project=PROJECT_ID
    

    다음과 비슷한 출력이 표시됩니다.

    createTime: '2021-05-26T13:27:37.460383111Z'
    membershipStates:
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896080Z'
    resourceState:
     state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/PROJECT_ID/locations/global/memberships/gke-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2021-05-26T13:27:37.899549111Z'
    updateTime: '2021-05-27T15:08:19.397895711Z'
    
  3. 게이트웨이 API 컨트롤러에 필요한 다음 Identity and Access Management(IAM) 역할을 부여합니다.

    • roles/container.developer — 이 역할을 사용하면 컨트롤러가 클러스터 내 Kubernetes 리소스를 관리할 수 있습니다.
    • roles/compute.networkAdmin — 이 역할을 사용하면 컨트롤러가 Traffic Director 서비스 메시 구성을 관리할 수 있습니다.
    export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value (projectNumber)")
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/container.developer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/compute.networkAdmin"
    

다음 단계

배포 예시를 설정하려면 다음 가이드를 참조하세요.