멀티 클라우드 또는 하이브리드 메시 설정
이 페이지에서는 다음 플랫폼에 대해 멀티 클라우드 또는 하이브리드 메시를 설정하는 방법을 설명합니다.
- 하이브리드: Google Cloud의 GKE 및 VMware용 GKE(미리보기)
- 하이브리드: Google Cloud의 GKE 및 베어메탈용 GKE(미리보기)
- 멀티 클라우드: Google Cloud 기반 GKE 및 Amazon EKS(미리보기)
기본 요건
- 모든 클러스터는 동일한 Fleet 호스트 프로젝트에 등록해야 합니다.
- 모든 GKE 클러스터는 동일한 네트워크의 공유 VPC 구성 안에 위치해야 합니다.
- 클러스터의 Kubernetes 제어 영역 주소와 게이트웨이 주소는 메시의 모든 클러스터에서 연결할 수 있어야 합니다. GKE 클러스터가 있는 Google Cloud 프로젝트에서 외부 부하 분산 유형을 만들 수 있도록 허용되어야 합니다. 승인된 네트워크 및 VPC 방화벽 규칙을 사용해서 액세스를 제한하는 것이 좋습니다.
- GKE 비공개 클러스터를 포함한 비공개 클러스터는 지원되지 않습니다. VMware용 GKE 및 베어메탈용 GKE를 포함한 온프레미스 클러스터를 사용하는 경우 GKE 클러스터의 포드에서 Kubernetes 제어 영역 주소 및 게이트웨이 주소에 연결할 수 있어야 합니다. CloudVPN을 사용하여 GKE 클러스터의 서브넷을 온프레미스 클러스터 네트워크에 연결하는 것이 좋습니다.
- Istio CA를 사용하는 경우 모든 클러스터에 동일한 커스텀 루트 인증서를 사용합니다.
시작하기 전에
이 가이드에서는 asmcli
도구를 사용하여 Anthos Service Mesh를 설치했다고 가정합니다. asmcli install
을 실행할 때 asmcli
가 --output_dir에 지정된 디렉터리에 다운로드하는 구성 패키지 및 asmcli
가 필요합니다. 자세한 내용은 종속 도구 설치 및 클러스터 검증을 참조하세요.
메시에 설정하려는 모든 클러스터에 대해 kubeconfig 파일 액세스 권한이 필요합니다. GKE 클러스터의 경우 클러스터의 새 kubeconfig 파일을 만들려면 터미널의 값으로 파일 전체 경로가 있는 KUBECONFIG
환경을 내보내고 kubeconfig 항목을 생성할 수 있습니다.
환경 변수 및 자리표시자 설정
east-west 게이트웨이를 설치할 때는 다음 환경 변수가 필요합니다.
프로젝트 번호의 환경 변수를 만듭니다. 다음 명령어에서 FLEET_PROJECT_ID를 Fleet 호스트 프로젝트의 프로젝트 ID로 바꿉니다.
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID --format="value(projectNumber)")
메시 식별자의 환경 변수를 만듭니다.
export MESH_ID="proj-${PROJECT_NUMBER}"
네트워크 이름용 환경 변수를 만듭니다.
GKE 클러스터는 기본적으로 클러스터 네트워크 이름으로 지정됩니다.
export NETWORK_1="PROJECT_ID-CLUSTER_NETWORK"
다른 클러스터는
default
를 사용합니다.export NETWORK_2="default"
--network_id
에 다른 값을 사용해서 다른 클러스터에 Anthos Service Mesh를 설치한 경우 동일한 값을 NETWORK_2에 값으로 전달해야 합니다.
east-west 게이트웨이 설치
CLUSTER_2(멀티 클라우드 또는 온프레미스 클러스터)에 대한 east-west 트래픽 전용 클러스터인 CLUSTER_1(GKE 클러스터)에 게이트웨이를 설치합니다.
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_1} \ --revision asm-1157-23 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y -f -
이 게이트웨이는 기본적으로 인터넷에 공개되어 있습니다. 프로덕션 시스템에서는 외부 공격을 차단하기 위해 방화벽 규칙과 같은 추가 액세스 제한이 필요할 수 있습니다.
CLUSTER_2에 CLUSTER_1의 east-west 트래픽 전용 게이트웨이를 설치합니다.
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_2} \ --revision asm-1157-23 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 install -y -f -
서비스 노출
클러스터가 별도의 네트워크에 있으므로 두 클러스터의 east-west 게이트웨이에 모든 서비스(\*.local
)를 노출해야 합니다. 이 게이트웨이는 인터넷에서는 공개 상태지만, 마치 동일한 네트워크에 있는 것처럼 신뢰할 수 있는 mTLS 인증서와 워크로드 ID를 사용하는 서비스만 이러한 서비스에 액세스할 수 있습니다.
모든 클러스터의 east-west 게이트웨이를 통해 서비스 노출
kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
asm/istio/expansion/expose-services.yaml
kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \
asm/istio/expansion/expose-services.yaml
엔드포인트 검색 사용 설정
asmcli create-mesh
명령어를 실행하여 엔드포인트 검색을 사용 설정합니다. 이 예시에서는 클러스터 2개만 표시하지만 명령어를 실행하면 GKE 허브 서비스 한도에 따른 추가 클러스터에 엔드포인트 검색을 사용 설정할 수 있습니다.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
멀티 클러스터 연결 확인
이 섹션에서는 샘플 HelloWorld
및 Sleep
서비스를 멀티 클러스터 환경에 배포하여 클러스터 간 부하 분산 작동 방식을 확인하는 방법을 설명합니다.
사이드카 삽입 사용 설정
이후 단계에서 사용할 버전 라벨 값을 찾습니다. 이 단계는 Anthos Service Mesh 유형(관리형 또는 클러스터 내)에 따라 다릅니다.
관리형
다음 명령어를 사용하여 이후 단계에서 사용할 버전 라벨을 찾습니다.
kubectl get controlplanerevision -n istio-system
결과는 다음과 유사합니다.
NAME RECONCILED STALLED AGE asm-managed-rapid True False 89d
출력의
NAME
열 아래에서 버전 라벨 값을 확인합니다. 이 예시에서 값은asm-managed-rapid
입니다. 다음 섹션의 단계에서 버전 값을 사용하세요.클러스터 내
다음 명령어를 사용하여 이후 단계에서 사용할 버전 라벨을 찾습니다.
kubectl -n istio-system get pods -l app=istiod --show-labels
결과는 다음과 유사합니다.
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
출력의
LABELS
열 아래에서istio.io/rev=
프리픽스 다음에 있는istiod
버전 라벨의 값을 확인합니다. 이 예시에서 값은asm-173-3
입니다. 다음 섹션의 단계에서 버전 값을 사용하세요.
HelloWorld 서비스 설치
각 클러스터에서 샘플 네임스페이스와 서비스 정의를 만듭니다. 다음 명령어에서 REVISION을 이전 단계에서 기록한
istiod
버전 라벨로 대체합니다.for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite done
여기서 REVISION은 이전에 기록한
istiod
버전 라벨입니다.출력은 다음과 같습니다.
label "istio-injection" not found. namespace/sample labeled
label "istio-injection" not found.
를 안전하게 무시할 수 있습니다.두 클러스터에서 HelloWorld 서비스를 만듭니다.
kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
HelloWorld v1 및 v2를 각 클러스터에 배포
나중에 클러스터 간 부하 분산을 확인하는 데 도움이 되도록
HelloWorld v1
을CLUSTER_1
에,v2
를CLUSTER_2
에 배포합니다.kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
다음 명령어를 사용하여
HelloWorld v1
및v2
가 실행 중인지 확인합니다. 출력이 다음과 비슷한지 확인합니다.kubectl get pod --context=${CTX_1} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
Sleep 서비스 배포
두 클러스터에
Sleep
서비스를 배포합니다. 이 포드는 데모용으로 인위적인 네트워크 트래픽을 생성합니다.for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample done
각 클러스터에서
Sleep
서비스가 시작될 때까지 기다립니다. 출력이 다음과 비슷한지 확인합니다.kubectl get pod --context=${CTX_1} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
클러스터 간 부하 분산 확인
HelloWorld
서비스를 여러 번 호출하고 출력을 확인하여 v1과 v2에서 번갈아 응답을 보내는지 확인합니다.
HelloWorld
서비스를 호출합니다.kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
출력은 다음과 비슷합니다.
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
HelloWorld
서비스를 다시 호출합니다.kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
출력은 다음과 비슷합니다.
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
수고하셨습니다. 멀티 클러스터 Anthos Service Mesh의 부하 분산이 성공적으로 완료되었습니다.
삭제
부하 분산이 확인되면 클러스터에서 HelloWorld
및 Sleep
모드를 삭제하세요.
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}