이 페이지에서는 2개 클러스터를 사용하는 예시로 멀티 클러스터 인그레스를 사용하여 여러 리전의 여러 Google Kubernetes Engine(GKE) 클러스터 간에 트래픽을 라우팅하는 방법을 보여줍니다.
멀티 클러스터 인그레스(MCI), 멀티 클러스터 게이트웨이(MCG), 독립형 네트워크 엔드포인트 그룹을 사용하는 부하 분산기(LB 및 독립형 NEG) 간의 자세한 비교는 GKE용 멀티 클러스터 부하 분산 API 선택을 참조하세요.
멀티 클러스터 인그레스 배포에 대한 자세한 내용은 클러스터 간 인그레스 배포를 참조하세요.
이 단계는 승격된 권한이 필요하며 GKE 관리자가 수행해야 합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
요구사항 및 제한사항
멀티 클러스터 인그레스에는 다음과 요구사항이 있습니다.
- Google Cloud CLI 버전 290.0.0 이상이어야 합니다.
Standard 모드 클러스터를 사용하는 경우 다음 요구사항을 충족하는지 확인합니다. Autopilot 클러스터는 이미 이러한 요구사항을 충족합니다.
- 클러스터에 사용 설정된
HttpLoadBalancing
부가기능이 있어야 합니다. 이 부가기능은 기본적으로 사용 설정되어 있으며 중지하면 안 됩니다. - 클러스터는 VPC 기반이어야 합니다.
- 클러스터에 GKE용 워크로드 아이덴티티 제휴가 사용 설정되어 있어야 합니다.
멀티 클러스터 인그레스에는 다음과 같은 제한사항이 있습니다.
- 외부 애플리케이션 부하 분산기에서만 지원됩니다.
- 멀티 클러스터 인그레스에서 관리하지 않는
mci-
프리픽스가 있는 동일한 프로젝트에 Compute Engine 부하 분산기를 만들지 마세요. Google Cloud는mci-[6 char hash]
프리픽스를 사용하여 멀티 클러스터 인그레스에서 배포하는 Compute Engine 리소스를 관리합니다. - HTTPS를 구성하려면 사전 할당된 고정 IP 주소가 필요합니다. HTTPS는 임시 IP 주소에서 지원되지 않습니다.
개요
이 연습에서는 다음 단계를 수행합니다.
- 사용할 가격 책정을 선택합니다.
- 클러스터를 배포합니다.
- 클러스터 사용자 인증 정보를 구성합니다.
- Fleet에 클러스터를 등록합니다.
- 구성 클러스터를 지정합니다. 이 클러스터는 전용 제어 영역에 속하거나 다른 워크로드를 실행할 수 있습니다.
다음 그림은 연습을 완료한 후의 환경을 보여줍니다.
다이어그램에는 europe-west1
및 us-central1
리전에 gke-us
및 gke-eu
라는 2개의 GKE 클러스터가 있습니다. 클러스터는 멀티 클러스터 인그레스 컨트롤러가 인식할 수 있도록 Fleet에 등록됩니다. Fleet을 사용하면 GKE 클러스터를 논리적으로 그룹화 및 정규화하여 인프라 관리를 쉽게 수행하고 멀티 클러스터 인그레스와 같은 멀티 클러스터 기능 사용을 지원할 수 있습니다. Fleet 관리 문서에서 Fleet의 이점과 만드는 방법에 대해 자세히 알아보세요.
가격 책정 선택
멀티 클러스터 인그레스가 사용 중인 유일한 GKE Enterprise 기능인 경우 독립형 가격 책정을 사용하는 것이 좋습니다. 프로젝트에 다른 Google Cloud용 GKE Enterprise 구성요소 또는 기능이 사용되는 경우 전체 GKE Enterprise 플랫폼을 사용 설정해야 합니다. 이렇게 하면 단일 vCPU별 요금으로 모든 GKE Enterprise 기능을 사용할 수 있습니다.
사용 설정해야 하는 API는 사용하는 멀티 클러스터 인그레스 가격 책정에 따라 다릅니다.
- GKE Enterprise API(
anthos.googleapis.com
)가 사용 설정되었으면 클러스터 vCPU 수 및 GKE Enterprise 가격 책정에 따라 프로젝트 요금이 청구됩니다. - GKE Enterprise API가 사용 중지되었으면 프로젝트의 백엔드 멀티 클러스터 인그레스 포드 수에 따라 프로젝트 요금을 청구합니다.
언제든지 멀티 클러스터 인그레스 리소스 또는 트래픽에 영향을 주지 않으면서 멀티 클러스터 인그레스 청구 모델을 독립형에서 GKE Enterprise로 변경하거나 GKE Enterprise에서 독립형으로 변경할 수 있습니다.
독립형 가격 책정
독립형 가격 책정을 사용 설정하려면 다음 단계를 수행합니다.
프로젝트에서 GKE Enterprise API가 사용 중지되었는지 확인합니다.
gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com
PROJECT_ID
를 GKE 클러스터가 실행되는 프로젝트 ID로 바꿉니다.출력이 빈 응답이면 프로젝트에서 GKE Enterprise API가 사용 중지되고 멀티 클러스터 인그레스 리소스가 독립형 가격 책정을 사용하여 청구됩니다.
프로젝트에 필요한 API 사용 설정:
gcloud services enable \ multiclusteringress.googleapis.com \ gkehub.googleapis.com \ container.googleapis.com \ multiclusterservicediscovery.googleapis.com \ --project=PROJECT_ID
GKE Enterprise 가격 책정
GKE Enterprise 가격을 사용 설정하려면 프로젝트에 필요한 API를 사용 설정합니다.
gcloud services enable \
anthos.googleapis.com \
multiclusteringress.googleapis.com \
gkehub.googleapis.com \
container.googleapis.com \
multiclusterservicediscovery.googleapis.com \
--project=PROJECT_ID
프로젝트에서 anthos.googleapis.com
이 사용 설정되면 Connect에 등록된 클러스터는 GKE Enterprise 가격 책정에 따라 청구됩니다.
클러스터 배포
europe-west1
및 us-central1
리전에 gke-us
및 gke-eu
라는 GKE 클러스터 2개를 만듭니다.
Autopilot
us-central1
리전에gke-us
클러스터를 만듭니다.gcloud container clusters create-auto gke-us \ --region=us-central1 \ --release-channel=stable \ --project=PROJECT_ID
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.europe-west1
리전에gke-eu
클러스터를 만듭니다.gcloud container clusters create-auto gke-eu \ --region=europe-west1 \ --release-channel=stable \ --project=PROJECT_ID
표준
GKE용 워크로드 아이덴티티 제휴가 사용 설정된 클러스터 2개를 만듭니다.
us-central1
리전에gke-us
클러스터를 만듭니다.gcloud container clusters create gke-us \ --region=us-central1 \ --enable-ip-alias \ --workload-pool=PROJECT_ID.svc.id.goog \ --release-channel=stable \ --project=PROJECT_ID
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.europe-west1
리전에gke-eu
클러스터를 만듭니다.gcloud container clusters create gke-eu \ --region=europe-west1 \ --enable-ip-alias \ --workload-pool=PROJECT_ID.svc.id.goog \ --release-channel=stable \ --project=PROJECT_ID
클러스터 사용자 인증 정보 구성
리소스를 배포할 때 클러스터 간의 전환이 간편해지도록 클러스터의 사용자 인증 정보를 구성하고 클러스터 컨텍스트 이름을 바꿉니다.
클러스터의 사용자 인증 정보를 검색합니다.
gcloud container clusters get-credentials gke-us \ --region=us-central1 \ --project=PROJECT_ID gcloud container clusters get-credentials gke-eu \ --region=europe-west1 \ --project=PROJECT_ID
kubectl 클라이언트를 사용하여 클러스터 API 서버에 액세스할 수 있도록 사용자 인증 정보가 로컬로 저장됩니다. 기본적으로 자동 생성된 이름이 사용자 인증 정보에 대해 생성됩니다.
클러스터 컨텍스트의 이름을 바꿉니다.
kubectl config rename-context gke_PROJECT_ID_us-central1_gke-us gke-us kubectl config rename-context gke_PROJECT_ID_europe-west1_gke-eu gke-eu
Fleet에 클러스터 등록
다음과 같이 클러스터를 프로젝트 Fleet에 등록합니다.
클러스터를 등록합니다.
gcloud container fleet memberships register gke-us \ --gke-cluster us-central1/gke-us \ --enable-workload-identity \ --project=PROJECT_ID gcloud container fleet memberships register gke-eu \ --gke-cluster europe-west1/gke-eu \ --enable-workload-identity \ --project=PROJECT_ID
클러스터가 Fleet에 성공적으로 등록되었는지 확인합니다.
gcloud container fleet memberships list --project=PROJECT_ID
출력은 다음과 비슷합니다.
NAME EXTERNAL_ID gke-us 0375c958-38af-11ea-abe9-42010a800191 gke-eu d3278b78-38ad-11ea-a846-42010a840114
클러스터를 등록하면 GKE가 gke-mcs-importer
포드를 클러스터에 배포합니다.
Fleet에 GKE 클러스터 등록에서 클러스터 등록에 대해 자세히 알아보세요.
구성 클러스터 지정
구성 클러스터는 구성원 클러스터에서 인그레스의 중심 제어 지점으로 선택할 수 있는 GKE 클러스터입니다. 이 클러스터는 이미 Fleet에 등록되어 있어야 합니다. 자세한 내용은 클러스터 설계 구성을 참조하세요.
멀티 클러스터 인그레스를 사용 설정하고 gke-us
를 구성 클러스터로 선택합니다.
gcloud container fleet ingress enable \
--config-membership=gke-us \
--location=us-central1 \
--project=PROJECT_ID
구성 클러스터를 등록하는 데 최대 15분이 걸립니다. 성공한 출력은 다음과 비슷합니다.
Waiting for Feature to be created...done.
Waiting for controller to start...done.
실패한 출력은 다음과 비슷합니다.
Waiting for controller to start...failed.
ERROR: (gcloud.container.fleet.ingress.enable) Controller did not start in 2 minutes. Please use the `describe` command to check Feature state for debugging information.
앞의 단계에서 오류가 발생했으면 기능 상태를 확인합니다.
gcloud container fleet ingress describe \
--project=PROJECT_ID
성공적인 출력은 다음과 비슷합니다.
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'
멀티 클러스터 인그레스 관련 오류 문제 해결에 대한 자세한 내용은 문제 해결 및 운영을 참조하세요.
라이브 클러스터에 미치는 영향
다운타임이나 클러스터의 트래픽에 영향을 주지 않으므로 라이브 클러스터에서 gcloud container fleet ingress enable
을 사용하여 멀티 클러스터 인그레스를 안전하게 사용 설정할 수 있습니다.
공유 VPC
공유 VPC 네트워크의 클러스터에 MultiClusterIngress
리소스를 배포할 수 있지만 참여하는 모든 백엔드 GKE 클러스터가 같은 프로젝트에 있어야 합니다. 동일한 Cloud Load Balancing VIP를 사용하는 서로 다른 프로젝트에 GKE 클러스터를 배치할 수 없습니다.
비공유 VPC 네트워크에서 멀티 클러스터 인그레스 컨트롤러는 방화벽 규칙을 관리하여 상태 점검을 부하 분산기에서 컨테이너 워크로드로 전달할 수 있습니다.
공유 VPC 네트워크에서 호스트 프로젝트 관리자는 멀티 클러스터 인그레스 컨트롤러를 대신하여 부하 분산기 트래픽에 대한 방화벽 규칙을 수동으로 만들어야 합니다.
다음 명령어는 클러스터가 공유 VPC 네트워크에 있을 때 만들어야 하는 방화벽 규칙을 보여줍니다. 소스 범위는 부하 분산기가 트래픽을 백엔드로 전송하는 데 사용하는 범위입니다. 이 규칙은 MultiClusterIngress
리소스의 작동 기간 동안 존재해야 합니다.
클러스터가 공유 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
알려진 문제로 인해 Google Cloud CLI가 멀티 클러스터 인그레스와 상호작용할 수 없습니다. 이 문제는 버전 346.0.0에서 발생했으며 버전 348.0.0에서 해결되었습니다. 멀티 클러스터 인그레스에서 gcloud CLI 버전 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"}}]'