멀티 클라우드 또는 하이브리드 메시 설정

이 페이지에서는 다음 플랫폼에 대해 멀티 클라우드 또는 하이브리드 메시를 설정하는 방법을 설명합니다.

  • 하이브리드: 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 게이트웨이를 설치할 때는 다음 환경 변수가 필요합니다.

  1. 프로젝트 번호의 환경 변수를 만듭니다. 다음 명령어에서 FLEET_PROJECT_IDFleet 호스트 프로젝트의 프로젝트 ID로 바꿉니다.

    export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID --format="value(projectNumber)")
    
  2. 메시 식별자의 환경 변수를 만듭니다.

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. 네트워크 이름용 환경 변수를 만듭니다.

    • GKE 클러스터는 기본적으로 클러스터 네트워크 이름으로 지정됩니다.

      export NETWORK_1="PROJECT_ID-CLUSTER_NETWORK"

    • 다른 클러스터는 default를 사용합니다.

      export NETWORK_2="default"

    --network_id에 다른 값을 사용해서 다른 클러스터에 Anthos Service Mesh를 설치한 경우 동일한 값을 NETWORK_2에 값으로 전달해야 합니다.

east-west 게이트웨이 설치

  1. 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 -
    

    이 게이트웨이는 기본적으로 인터넷에 공개되어 있습니다. 프로덕션 시스템에서는 외부 공격을 차단하기 위해 방화벽 규칙과 같은 추가 액세스 제한이 필요할 수 있습니다.

  2. 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

멀티 클러스터 연결 확인

이 섹션에서는 샘플 HelloWorldSleep 서비스를 멀티 클러스터 환경에 배포하여 클러스터 간 부하 분산 작동 방식을 확인하는 방법을 설명합니다.

사이드카 삽입 사용 설정

  1. 이후 단계에서 사용할 버전 라벨 값을 찾습니다. 이 단계는 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 서비스 설치

  1. 각 클러스터에서 샘플 네임스페이스와 서비스 정의를 만듭니다. 다음 명령어에서 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.를 안전하게 무시할 수 있습니다.

  2. 두 클러스터에서 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를 각 클러스터에 배포

  1. 나중에 클러스터 간 부하 분산을 확인하는 데 도움이 되도록 HelloWorld v1CLUSTER_1에, v2CLUSTER_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
  2. 다음 명령어를 사용하여 HelloWorld v1v2가 실행 중인지 확인합니다. 출력이 다음과 비슷한지 확인합니다.

    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 서비스 배포

  1. 두 클러스터에 Sleep 서비스를 배포합니다. 이 포드는 데모용으로 인위적인 네트워크 트래픽을 생성합니다.

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl apply --context=${CTX} \
            -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample
    done
    
  2. 각 클러스터에서 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에서 번갈아 응답을 보내는지 확인합니다.

  1. 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
    ...
  2. 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의 부하 분산이 성공적으로 완료되었습니다.

삭제

부하 분산이 확인되면 클러스터에서 HelloWorldSleep 모드를 삭제하세요.

kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}