멀티 클러스터 인그레스로 멀티 클러스터 GKE 환경 업그레이드

Last reviewed 2022-12-15 UTC

이 튜토리얼에서는 멀티 클러스터 인그레스를 사용하여 멀티 클러스터 Google Kubernetes Engine(GKE) 환경을 업그레이드하는 방법을 설명합니다. 이 튜토리얼은 프로세스, 아키텍처, 용어를 자세히 설명하는 멀티 클러스터 인그레스를 사용한 멀티 클러스터 GKE 업그레이드 문서와 이어지는 내용입니다. 이 튜토리얼을 진행하기 전에 개념 문서를 읽는 것이 좋습니다.

멀티 클러스터 인그레스(MCI), 멀티 클러스터 게이트웨이(MCG), 독립형 네트워크 엔드포인트 그룹을 사용하는 부하 분산기(LB 및 독립형 NEG) 간의 자세한 비교는 GKE용 멀티 클러스터 부하 분산 API 선택을 참조하세요.

이 문서는 GKE 클러스터 그룹을 유지보수해야 하는 Google Cloud 관리자를 대상으로 합니다.

GKE 클러스터를 자동 업그레이드하는 것이 좋습니다. 자동 업그레이드는 Google Cloud에서 결정한 출시 일정에 따라 클러스터(제어 영역 및 노드)를 자동으로 업데이트하는 완전 관리형 방식입니다. 따라서 운영자의 개입이 필요하지 않습니다. 그러나 이 가이드에서는 클러스터를 업그레이드하는 방법과 시기를 세부적으로 관리할 수 있도록 앱이 모든 클러스터에서 실행되는 여러 클러스터를 업그레이드하는 방법을 단계별로 살펴봅니다. 그런 다음 업그레이드 전에 멀티 클러스터 인그레스를 사용하여 한 번에 하나의 클러스터를 드레이닝합니다.

아키텍처

이 가이드에서는 다음 아키텍처를 사용합니다. 총 3개의 클러스터가 있는데, 클러스터 2개(bluegreen)는 같은 앱이 배포된 동일한 클러스터 역할을 하고 나머지 클러스터 1개(ingress-config)는 멀티 클러스터 인그레스를 구성하는 제어 영역 클러스터 역할을 합니다. 이 튜토리얼에서는 앱 클러스터 2개(bluegreen 클러스터)에 샘플 앱을 배포합니다.

2개의 동일한 클러스터와 1개의 제어 영역 클러스터로 구성된 아키텍처

목표

  • GKE 클러스터를 3개 만들어 Fleet으로 등록합니다.
  • 하나의 GKE 클러스터(ingress-config)를 중앙 구성 클러스터로 구성합니다.
  • 다른 GKE 클러스터에 샘플 앱 배포
  • 두 앱 클러스터에서 실행 중인 앱으로 클라이언트 트래픽을 보내도록 멀티 클러스터 인그레스를 구성합니다.
  • 앱의 부하 생성기를 설정하고 모니터링을 구성합니다.
  • 멀티 클러스터 인그레스에서 하나의 앱 클러스터를 삭제 또는 드레이닝하고 드레이닝된 클러스터를 업그레이드합니다.
  • 멀티 클러스터 인그레스를 사용하여 업그레이드된 클러스터로 트래픽을 다시 보냅니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. 이 튜토리얼에서는 멀티 클러스터 인그레스를 설정하여 다음을 설정해야 합니다.
    • 네임스페이스, 배포, 서비스 등의 동일한 앱이 모든 클러스터에서 실행 중인 2개 이상의 클러스터
    • 모든 클러스터에서 자동 업그레이드가 사용 중지됨
    • 클러스터가 VPC 기반 클러스터로 별칭 IP 주소 범위를 사용함
    • HTTP 부하 분산이 사용 설정됨(기본적으로 사용 설정됨)
    • gcloud --version은 369 이상이어야 함 GKE 클러스터 등록 단계는 이 버전 이상에서 달라집니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

  5. 기본 프로젝트를 설정합니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gcloud config set project ${PROJECT}
    
  6. GKE, Hub, multiclusteringress API를 사용 설정합니다.

    gcloud services enable container.googleapis.com \
                           gkehub.googleapis.com \
                           multiclusteringress.googleapis.com \
                           multiclusterservicediscovery.googleapis.com
    

환경 설정

  1. Cloud Shell에서 저장소를 클론하여 이 가이드에 사용할 파일을 가져옵니다.

    cd ${HOME}
    git clone https://github.com/GoogleCloudPlatform/gke-multicluster-upgrades.git
    
  2. WORKDIR 디렉터리를 만듭니다.

    cd gke-multicluster-upgrades
    export WORKDIR=`pwd`
    

GKE 클러스터 만들기 및 허브 등록

이 섹션에서는 GKE 클러스터를 3개 만들어 GKE Enterprise 허브에 등록합니다.

GKE 클러스터 만들기

  1. Cloud Shell에서 GKE 클러스터를 3개 만듭니다.

    gcloud container clusters create ingress-config --zone us-west1-a \
    --release-channel=None --no-enable-autoupgrade --num-nodes=4 \
    --enable-ip-alias --workload-pool=${PROJECT}.svc.id.goog --quiet --async
    gcloud container clusters create blue --zone us-west1-b --num-nodes=3 \
    --release-channel=None --no-enable-autoupgrade --enable-ip-alias \
    --workload-pool=${PROJECT}.svc.id.goog --quiet --async
    gcloud container clusters create green --zone us-west1-c --num-nodes=3 \
    --release-channel=None --no-enable-autoupgrade --enable-ip-alias \
    --workload-pool=${PROJECT}.svc.id.goog --quiet
    

    이 튜토리얼에서는 us-west1-a, us-west1-b, us-west1-c의 세 영역에서 단일 리전에 클러스터를 만듭니다. 리전과 영역에 대한 자세한 내용은 위치 및 리전을 참조하세요.

  2. 클러스터가 모두 생성될 때까지 몇 분 정도 기다립니다. 클러스터가 실행 중인지 확인합니다.

    gcloud container clusters list
    

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

    NAME: ingress-config
    LOCATION: us-west1-a
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.233.186.135
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 4
    STATUS: RUNNING
    
    NAME: blue
    LOCATION: us-west1-b
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 34.82.35.222
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    
    NAME: green
    LOCATION: us-west1-c
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.185.204.26
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    
  3. kubeconfig 파일을 만든 후 모든 클러스터에 연결하여 kubeconfig 파일에 항목을 생성합니다.

    touch gke-upgrade-kubeconfig
    export KUBECONFIG=gke-upgrade-kubeconfig
    gcloud container clusters get-credentials ingress-config \
        --zone us-west1-a --project ${PROJECT}
    gcloud container clusters get-credentials blue --zone us-west1-b \
        --project ${PROJECT}
    gcloud container clusters get-credentials green --zone us-west1-c \
        --project ${PROJECT}
    

    kubeconfig 파일에서 각 클러스터의 사용자와 컨텍스트를 만들어 클러스터에 대한 인증을 만듭니다. kubeconfig 파일을 만든 후에는 클러스터 간에 컨텍스트를 빠르게 전환할 수 있습니다.

  4. kubeconfig 파일에 클러스터가 3개 있는지 확인합니다.

    kubectl config view -ojson | jq -r '.clusters[].name'
    

    출력은 다음과 같습니다.

    gke_gke-multicluster-upgrades_us-west1-a_ingress-config
    gke_gke-multicluster-upgrades_us-west1-b_blue
    gke_gke-multicluster-upgrades_us-west1-c_green
    
  5. 나중에 사용할 수 있도록 클러스터 3개의 컨텍스트를 가져옵니다.

    export INGRESS_CONFIG_CLUSTER=$(kubectl config view -ojson | jq \
        -r '.clusters[].name' | grep ingress-config)
    export BLUE_CLUSTER=$(kubectl config view -ojson | jq \
        -r '.clusters[].name' | grep blue)
    export GREEN_CLUSTER=$(kubectl config view -ojson | jq \
        -r '.clusters[].name' | grep green)
    echo -e "${INGRESS_CONFIG_CLUSTER}\n${BLUE_CLUSTER}\n${GREEN_CLUSTER}"
    

    출력은 다음과 같습니다.

    gke_gke-multicluster-upgrades_us-west1-a_ingress-config
    gke_gke-multicluster-upgrades_us-west1-b_blue
    gke_gke-multicluster-upgrades_us-west1-c_green
    

Fleet에 GKE 클러스터 등록

Fleet에 클러스터를 등록하면 하이브리드 환경에서 Kubernetes 클러스터를 운영할 수 있습니다. Fleet에 등록된 클러스터는 멀티 클러스터 인그레스와 같은 고급 GKE 기능을 사용할 수 있습니다. GKE 클러스터를 Fleet에 등록하려면 Google Cloud 서비스 계정을 직접 사용하거나 GKE 클러스터의 Kubernetes 서비스 계정이 Identity and Access Management 서비스 계정으로 작동하도록 허용하는 권장 워크로드 아이덴티티 방법을 사용하면 됩니다.

  1. 클러스터 3개를 Fleet으로 등록합니다.

    gcloud container fleet memberships register ingress-config \
        --gke-cluster=us-west1-a/ingress-config \
        --enable-workload-identity
    
    gcloud container fleet memberships register blue \
        --gke-cluster=us-west1-b/blue \
        --enable-workload-identity
    
    gcloud container fleet memberships register green \
        --gke-cluster=us-west1-c/green \
        --enable-workload-identity
    
  2. 클러스터가 등록되었는지 확인합니다.

    gcloud container fleet memberships list
    

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

    NAME: blue
    EXTERNAL_ID: 401b4f08-8246-4f97-a6d8-cf1b78c2a91d
    
    NAME: green
    EXTERNAL_ID: 8041c36a-9d42-40c8-a67f-54fcfd84956e
    
    NAME: ingress-config
    EXTERNAL_ID: 65ac48fe-5043-42db-8b1e-944754a0d725
    
  3. 허브를 통해 multiclusteringress 기능을 사용 설정하여 ingress-config 클러스터를 멀티 클러스터 인그레스의 구성 클러스터로 구성합니다.

    gcloud container fleet ingress enable --config-membership=ingress-config
    

    위의 명령어는 MulticlusterIngressMulticlusterService CRD(커스텀 리소스 정의)ingress-config 클러스터에 추가합니다. 이 명령어는 완료되는 데 몇 분 정도 걸립니다. 다음 단계로 진행하기 전에 기다립니다.

  4. ingress-cluster 클러스터가 멀티 클러스터 인그레스에 대해 성공적으로 구성되었는지 확인합니다.

    watch gcloud container fleet ingress describe
    

    다음과 비슷한 출력이 나타날 때까지 기다립니다.

    createTime: '2022-07-05T10:21:40.383536315Z'
    membershipStates:
      projects/662189189487/locations/global/memberships/blue:
        state:
          code: OK
          updateTime: '2022-07-08T10:59:44.230329189Z'
      projects/662189189487/locations/global/memberships/green:
        state:
          code: OK
          updateTime: '2022-07-08T10:59:44.230329950Z'
      projects/662189189487/locations/global/memberships/ingress-config:
        state:
          code: OK
          updateTime: '2022-07-08T10:59:44.230328520Z'
    name: projects/gke-multicluster-upgrades/locations/global/features/multiclusteringress
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/gke-multicluster-upgrades/locations/global/memberships/ingress-config
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2022-07-08T10:57:33.303543609Z'
    updateTime: '2022-07-08T10:59:45.247576318Z'
    

    watch 명령어를 종료하려면 Control+C를 누르세요.

블루 및 그린 클러스터에 샘플 애플리케이션 배포

  1. Cloud Shell에서 샘플 whereami 앱을 bluegreen 클러스터에 배포합니다.

    kubectl --context ${BLUE_CLUSTER} apply -f ${WORKDIR}/application-manifests
    kubectl --context ${GREEN_CLUSTER} apply -f ${WORKDIR}/application-manifests
    
  2. 몇 분 정도 기다린 후 bluegreen 클러스터의 모든 포드가 Running 상태인지 확인합니다.

    kubectl --context ${BLUE_CLUSTER} get pods
    kubectl --context ${GREEN_CLUSTER} get pods
    

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

    NAME                                   READY   STATUS    RESTARTS   AGE
    whereami-deployment-756c7dc74c-zsmr6   1/1     Running   0          74s
    NAME                                   READY   STATUS    RESTARTS   AGE
    whereami-deployment-756c7dc74c-sndz7   1/1     Running   0          68s.
    

멀티 클러스터 인그레스 구성

이 섹션에서는 bluegreen 클러스터 모두에서 실행되는 애플리케이션에 트래픽을 전송하는 멀티 클러스터 인그레스를 만듭니다. Cloud Load Balancing을 사용하여 bluegreen 클러스터 모두에서 whereami 앱을 백엔드로 사용하는 부하 분산기를 만듭니다. 부하 분산기를 만들려면 MultiClusterIngress와 1개 이상의 MultiClusterServices가 필요합니다. MultiClusterIngressMultiClusterService 객체는 단일 클러스터 컨텍스트에서 사용되는 기존 Kubernetes 인그레스 및 서비스 리소스의 멀티 클러스터 아날로그입니다.

  1. Cloud Shell에서 MulticlusterIngress 리소스를 ingress-config 클러스터에 배포합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mci.yaml
    

    출력은 다음과 같습니다.

    multiclusteringress.networking.gke.io/whereami-mci created
    
  2. MulticlusterService 리소스를 ingress-config 클러스터에 배포합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml
    

    출력은 다음과 같습니다.

    multiclusterservice.networking.gke.io/whereami-mcs created
    
  3. 두 리소스를 비교하려면 다음 안내를 따르세요.

    • MulticlusterIngress 리소스를 검사합니다.

      kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusteringress -o yaml
      

      출력에는 다음이 포함됩니다.

      spec:
        template:
          spec:
            backend:
              serviceName: whereami-mcs
              servicePort: 8080
      

      MulticlusterIngress 리소스는 MulticlusterService 사양이 serviceName 리소스를 가리킨다는 것을 제외하고 Kubernetes 인그레스 리소스와 비슷합니다.

    • MulticlusterService 리소스를 검사합니다.

      kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice -o yaml
      

      출력에는 다음이 포함됩니다.

      spec:
        clusters:
        - link: us-west1-b/blue
        - link: us-west1-c/green
        template:
          spec:
            ports:
            - name: web
              port: 8080
              protocol: TCP
              targetPort: 8080
            selector:
              app: whereami
      

      MulticlusterService 리소스는 clusters 사양이 있다는 것을 제외하고 Kubernetes 서비스 리소스와 비슷합니다. clusters 값은 MulticlusterService 리소스가 생성되는 등록된 클러스터 목록입니다.

    • MulticlusterIngress 리소스가 MulticlusterService 리소스를 가리키는 백엔드 서비스로 부하 분산기를 생성했는지 확인합니다.

      watch kubectl --context ${INGRESS_CONFIG_CLUSTER} \
            get multiclusteringress -o jsonpath="{.items[].status.VIP}"
      

      최대 10분 정도 걸릴 수 있습니다. 다음과 비슷한 출력이 나타날 때까지 기다립니다.

      34.107.246.9
      

      watch 명령어를 종료하려면 Control+C를 누르세요.

  4. Cloud Shell에서 Cloud Load Balancing VIP를 가져옵니다.

    export GCLB_VIP=$(kubectl --context ${INGRESS_CONFIG_CLUSTER} \
           get multiclusteringress -o json | jq -r '.items[].status.VIP') \
           && echo ${GCLB_VIP}
    

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

    34.107.246.9
    
  5. curl을 사용하여 부하 분산기와 배포된 애플리케이션에 액세스합니다.

    curl ${GCLB_VIP}
    

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

    {
      "cluster_name": "green",
      "host_header": "34.107.246.9",
      "pod_name": "whereami-deployment-756c7dc74c-sndz7",
      "pod_name_emoji": "😇",
      "project_id": "gke-multicluster-upgrades",
      "timestamp": "2022-07-08T14:26:07",
      "zone": "us-west1-c"
    }
    
  6. curl 명령어를 반복해서 실행합니다. 요청은 두 클러스터 bluegreen에 배포된 whereami 애플리케이션 간에 부하 분산됩니다.

부하 생성기 설정

이 섹션에서는 Cloud Load Balancing VIP에 대한 클라이언트 트래픽을 생성하는 loadgenerator 서비스를 설정합니다. 먼저 MulticlusterService 리소스가 bluegreen 클러스터에 트래픽을 보내도록 설정되어 있기 때문에 트래픽이 두 클러스터로 전송됩니다. 나중에 단일 클러스터로 트래픽을 전송하도록 MulticlusterService 리소스를 구성합니다.

  1. 클라이언트 트래픽을 Cloud Load Balancing으로 보내도록 loadgenerator 매니페스트를 구성합니다.

    TEMPLATE=loadgen-manifests/loadgenerator.yaml.templ && envsubst < ${TEMPLATE} > ${TEMPLATE%.*}
    
  2. ingress-config 클러스터에 loadgenerator을 배포합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/loadgen-manifests
    
  3. ingress-config 클러스터의 loadgenerator 포드가 모두 Running 상태인지 확인합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} get pods
    

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

    NAME                             READY   STATUS    RESTARTS   AGE
    loadgenerator-5498cbcb86-hqscp   1/1     Running   0          53s
    loadgenerator-5498cbcb86-m2z2z   1/1     Running   0          53s
    loadgenerator-5498cbcb86-p56qb   1/1     Running   0          53s
    

    포드 중 하나라도 Running 상태가 아니면 몇 분 정도 기다린 후 명령어를 다시 실행하세요.

트래픽 모니터링

이 섹션에서는 Google Cloud 콘솔을 사용하여 whereami 앱에 대한 트래픽을 모니터링합니다.

이전 섹션에서 Cloud Load Balancing VIP를 통해 whereami 앱에 액세스하여 클라이언트 트래픽을 시뮬레이션하는 loadgenerator 배포를 설정했습니다. Google Cloud 콘솔을 통해 이러한 측정항목을 모니터링할 수 있습니다. 업그레이드를 위해 클러스터를 드레이닝할 때 모니터링할 수 있도록 먼저 모니터링을 설정합니다(다음 섹션 참조).

  1. 멀티 클러스터 인그레스에 도달하는 트래픽을 표시할 대시보드를 만듭니다.

    export DASH_ID=$(gcloud monitoring dashboards create \
        --config-from-file=dashboards/cloud-ops-dashboard.json \
        --format=json | jq  -r ".name" | awk -F '/' '{print $4}')
    

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

    Created [721b6c83-8f9b-409b-a009-9fdf3afb82f8]
    
  2. Google Cloud 콘솔에서 Cloud Load Balancing의 측정항목을 사용할 수 있습니다. URL을 생성합니다.

    echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
    

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

    https://console.cloud.google.com/monitoring/dashboards/builder/721b6c83-8f9b-409b-a009-9fdf3afb82f8/?project=gke-multicluster-upgrades&timeDomain=1h"
    
  3. 브라우저에서 위의 명령어로 생성된 URL로 이동합니다.

    샘플 애플리케이션의 트래픽은 부하 생성기에서 bluegreen 클러스터로 이동합니다(클러스터가 있는 두 영역으로 표시됨). 타임라인 측정항목 차트는 두 백엔드로 이동하는 트래픽을 보여줍니다. k8s1- 마우스 오버 값은 두 프런트엔드 MulticlusterServices에 대한 네트워크 엔드포인트 그룹(NEG)이 bluegreen 클러스터에서 실행되고 있음을 나타냅니다.

    두 백엔드로 이동하는 트래픽을 보여주는 타임라인 측정항목 차트

blue 클러스터 드레이닝 및 업그레이드

이 섹션에서는 blue 클러스터를 드레이닝합니다. 클러스터를 드레이닝하면 부하 분산 풀에서 클러스터가 삭제됩니다. blue 클러스터를 드레이닝한 후에는 대상이 애플리케이션인 모든 클라이언트 트래픽이 green 클러스터로 이동합니다. 이전 섹션의 설명대로 이 프로세스를 모니터링할 수 있습니다. 클러스터가 드레이닝되면 드레이닝된 클러스터를 업그레이드할 수 있습니다. 업그레이드 후에는 부하 분산 풀에 다시 배치할 수 있습니다. 위의 단계를 반복하여 다른 클러스터도 업그레이드합니다(이 가이드에 표시되지 않음).

blue 클러스터를 드레이닝하려면 ingress-cluster 클러스터의 MulticlusterService 리소스를 업데이트하고 clusters 사양에서 blue 클러스터를 삭제합니다.

블루 클러스터 드레이닝

  1. Cloud Shell에서 ingress-config 클러스터의 MulticlusterService 리소스를 업데이트합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} \
              apply -f ${WORKDIR}/multicluster-manifests/mcs-green.yaml
    
  2. clusters 사양에 green 클러스터만 있는지 확인합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \
            -o json | jq '.items[].spec.clusters'
    

    출력은 다음과 같습니다.

    [
      {
        "link": "us-west1-c/green"
      }
    ]
    

    green 클러스터만 clusters 사양에 나열되므로 부하 분산 풀에는 green 클러스터만 있습니다.

  3. Google Cloud 콘솔에서 Cloud Load Balancing 측정항목의 측정항목을 볼 수 있습니다. URL을 생성합니다.

    echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
    
  4. 브라우저에서 이전 명령어로 생성된 URL로 이동합니다.

    차트에서는 green 클러스터만 트래픽을 수신하고 있음을 보여줍니다.

    `그린` 클러스터로만 이동하는 트래픽

blue 클러스터를 업그레이드합니다.

이제 blue 클러스터가 더 이상 클라이언트 트래픽을 수신하지 않으므로 클러스터(제어 영역 및 노드)를 업그레이드할 수 있습니다.

  1. Cloud Shell에서 클러스터의 현재 버전을 가져옵니다.

    gcloud container clusters list
    

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

    NAME: ingress-config
    LOCATION: us-west1-a
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.233.186.135
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 4
    STATUS: RUNNING
    
    NAME: blue
    LOCATION: us-west1-b
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 34.82.35.222
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    
    NAME: green
    LOCATION: us-west1-c
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.185.204.26
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    

    이 가이드를 완료하는 시기에 따라 클러스터 버전이 달라질 수 있습니다.

  2. 영역에서 사용 가능한 MasterVersions 버전 목록을 가져옵니다.

    gcloud container get-server-config --zone us-west1-b --format=json | jq \
    '.validMasterVersions[0:20]'
    

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

    [
      "1.24.1-gke.1400",
      "1.23.7-gke.1400",
      "1.23.6-gke.2200",
      "1.23.6-gke.1700",
      "1.23.6-gke.1501",
      "1.23.6-gke.1500",
      "1.23.5-gke.2400",
      "1.23.5-gke.1503",
      "1.23.5-gke.1501",
      "1.22.10-gke.600",
      "1.22.9-gke.2000",
      "1.22.9-gke.1500",
      "1.22.9-gke.1300",
      "1.22.8-gke.2200",
      "1.22.8-gke.202",
      "1.22.8-gke.201",
      "1.22.8-gke.200",
      "1.21.13-gke.900",
      "1.21.12-gke.2200",
      "1.21.12-gke.1700"
    ]
    
  3. 영역에서 사용 가능한 NodeVersions 버전 목록을 가져옵니다.

    gcloud container get-server-config --zone us-west1-b --format=json | jq \
    '.validNodeVersions[0:20]'
    

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

    [
      "1.24.1-gke.1400",
      "1.23.7-gke.1400",
      "1.23.6-gke.2200",
      "1.23.6-gke.1700",
      "1.23.6-gke.1501",
      "1.23.6-gke.1500",
      "1.23.5-gke.2400",
      "1.23.5-gke.1503",
      "1.23.5-gke.1501",
      "1.22.10-gke.600",
      "1.22.9-gke.2000",
      "1.22.9-gke.1500",
      "1.22.9-gke.1300",
      "1.22.8-gke.2200",
      "1.22.8-gke.202",
      "1.22.8-gke.201",
      "1.22.8-gke.200",
      "1.22.7-gke.1500",
      "1.22.7-gke.1300",
      "1.22.7-gke.900"
    ]
    
  4. MasterVersionsNodeVersions 목록에 있고 blue 클러스터의 현재 버전보다 높은 MasterVersionNodeVersion 버전에 대한 환경 변수를 설정합니다. 예를 들면 다음과 같습니다.

    export UPGRADE_VERSION="1.22.10-gke.600"
    

    이 가이드에서는 1.22.10-gke.600 버전을 사용합니다. 클러스터 버전은 이 가이드를 완료하는 시기에 사용 가능한 버전에 따라 달라질 수 있습니다. 업그레이드에 대한 자세한 내용은 클러스터 및 노드 풀 업그레이드를 참조하세요.

  5. blue 클러스터의 control plane 노드를 업그레이드합니다.

    gcloud container clusters upgrade blue \
        --zone us-west1-b --master --cluster-version ${UPGRADE_VERSION}
    

    업그레이드를 확인하려면 Y를 누르세요.

    과정을 완료하는 데 몇 분 정도 걸립니다. 업그레이드가 완료될 때까지 기다렸다가 계속 진행합니다.

    업데이트가 완료되면 출력은 다음과 같습니다.

    Updated
    [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue].
    
  6. blue 클러스터의 노드를 업그레이드합니다.

    gcloud container clusters upgrade blue \
        --zone=us-west1-b --node-pool=default-pool \
        --cluster-version ${UPGRADE_VERSION}
    

    업데이트를 확인하려면 Y를 누르세요.

    과정을 완료하는 데 몇 분 정도 걸립니다. 노드 업그레이드가 완료될 때까지 기다렸다가 계속 진행합니다.

    업그레이드가 완료되면 출력은 다음과 같습니다.

    Upgrading blue... Done with 3 out of 3 nodes (100.0%): 3 succeeded...done.
    Updated [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue].
    
  7. blue 클러스터가 업그레이드되었는지 확인합니다.

    gcloud container clusters list
    

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

    NAME: ingress-config
    LOCATION: us-west1-a
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.233.186.135
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 4
    STATUS: RUNNING
    
    NAME: blue
    LOCATION: us-west1-b
    MASTER_VERSION: 1.22.10-gke.600
    MASTER_IP: 34.82.35.222
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.10-gke.600
    NUM_NODES: 3
    STATUS: RUNNING
    
    NAME: green
    LOCATION: us-west1-c
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.185.204.26
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    

부하 분산 풀에 blue 클러스터 다시 추가

이 섹션에서는 blue 클러스터를 부하 분산 풀에 다시 추가합니다.

  1. Cloud Shell에서 부하 분산 풀에 다시 추가하기 전에 애플리케이션 배포가 blue 클러스터에서 실행 중인지 확인합니다.

    kubectl --context ${BLUE_CLUSTER} get pods
    

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

    NAME                                   READY   STATUS    RESTARTS   AGE
    whereami-deployment-756c7dc74c-xdnb6   1/1     Running   0          17m
    
  2. MutliclusterService 리소스를 업데이트하여 blue 클러스터를 부하 분산 풀에 다시 추가합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply \
            -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml
    
  3. 클러스터 사양에 bluegreen 클러스터가 모두 있는지 확인합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \
            -o json | jq '.items[].spec.clusters'
    

    출력은 다음과 같습니다.

    [
      {
        "link": "us-west1-b/blue"
      },
      {
        "link": "us-west1-c/green"
      }
    ]
    

    bluegreen 클러스터가 이제 clusters 사양에 있습니다.

  4. Google Cloud 콘솔에서 Cloud Load Balancing 측정항목의 측정항목을 사용할 수 있습니다. URL을 생성합니다.

    echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
    
  5. 브라우저에서 이전 명령어로 생성된 URL로 이동합니다.

    차트에서는 블루 및 그린 클러스터 모두 부하 분산기를 사용하여 부하 생성기에서 트래픽을 수신하고 있음을 보여줍니다.

    두 클러스터 모두 트래픽을 수신합니다.

    축하합니다 멀티 클러스터 인그레스를 사용하여 멀티 클러스터 아키텍처에서 GKE 클러스터를 업그레이드했습니다.

  6. green 클러스터를 업그레이드하려면 블루 클러스터를 드레이닝하고 업그레이드하는 프로세스를 반복합니다. 여기서 bluegreen으로 바꿉니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 Google Cloud 프로젝트를 삭제하는 것입니다. 또는 개별 리소스를 삭제할 수 있습니다.

클러스터 삭제

  1. Cloud Shell에서 bluegreen 클러스터를 등록 취소하고 삭제합니다.

    gcloud container fleet memberships unregister blue --gke-cluster=us-west1-b/blue
    gcloud container clusters delete blue --zone us-west1-b --quiet
    
    gcloud container fleet memberships unregister green --gke-cluster=us-west1-c/green
    gcloud container clusters delete green --zone us-west1-c --quiet
    
  2. ingress-config 클러스터에서 MuticlusterIngress 리소스를 삭제합니다.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} delete -f ${WORKDIR}/multicluster-manifests/mci.yaml
    

    이 명령어는 프로젝트에서 Cloud Load Balancing 리소스를 삭제합니다.

  3. ingress-config 클러스터를 등록 취소하고 삭제합니다.

    gcloud container fleet memberships unregister ingress-config --gke-cluster=us-west1-a/ingress-config
    gcloud container clusters delete ingress-config --zone us-west1-a --quiet
    
  4. 모든 클러스터가 삭제되었는지 확인합니다.

    gcloud container clusters list
    

    출력은 다음과 같습니다.

    *&lt;null&gt;*
    
  5. kubeconfig 파일을 재설정합니다.

    unset KUBECONFIG
    
  6. WORKDIR 폴더를 삭제합니다.

    cd ${HOME}
    rm -rf ${WORKDIR}
    

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계