Ingress for Anthos を使用した複数クラスタ GKE 環境のアップグレード

このチュートリアルでは、Ingress を使用して複数クラスタの Google Kubernetes Engine(GKE)環境をアップグレードする方法について説明します。このチュートリアルは、プロセス、アーキテクチャ、用語について解説している Ingress ドキュメントを使用した複数クラスタ GKE のアップグレードの後続チュートリアルです。このチュートリアルをお読みになる前に、コンセプト ドキュメントを確認することをおすすめします。このドキュメントは、GKE クラスタのフリートを管理する Google Cloud 管理者を対象としています。

GKE クラスタは自動アップグレードすることをおすすめします。自動アップグレードは、Google Cloud によって決定されるリリース スケジュールで、クラスタ(コントロール プレーンとノード)を自動的に更新する、フルマネージドの方法です。オペレーターの介入は不要です。ただし、クラスタのアップグレードの方法とタイミングを詳細に管理する必要がある場合は、このチュートリアルで、アプリがすべてのクラスタで実行される複数のクラスタをアップグレードする方法をご確認ください。Ingress を使用して、アップグレード前に一度に 1 つのクラスタをドレインします。

アーキテクチャ

このチュートリアルでは、次のアーキテクチャを使用します。クラスタは 3 つあり、2 つのクラスタ(bluegreen)は、同じアプリがデプロイされている同一クラスタとして機能し、残り 1 つのクラスタ(ingress-config)は、Ingress を構成するコントロール プレーン クラスタとして機能します。このチュートリアルでは、2 つのアプリクラスタ(blue クラスタと green クラスタ)に Online Boutique アプリというサンプルアプリをデプロイします。

Online Boutique アプリは、e コマースアプリをシミュレートする 10 個のマイクロサービスで構成されるサンプル マイクロサービス アプリです。このアプリは、(クライアントがアクセスできる)ウェブ フロントエンドと、複数のバックエンド サービス(ショッピング カート、商品カタログ、電子小売業者をシミュレートする推奨サービスなど)で構成されます。

2 つの同一クラスタと 1 つのコントロール プレーン クラスタのアーキテクチャ

目標

  • 3 つの GKE クラスタを作成して、ハブに登録します。
  • 1 つの GKE クラスタ(ingress-config)を中央構成クラスタとして構成します。
  • Online Boutique をサンプルアプリとして他の GKE クラスタにデプロイします。
  • 両方のアプリクラスタで実行されている Online Boutique アプリにクライアント トラフィックを送信するように Ingress を構成します。
  • Online Boutique アプリに負荷生成ツールを設定し、モニタリングを構成します。
  • 複数クラスタ Ingress から 1 つのアプリクラスタを削除(ドレイン)し、ドレインされたクラスタをアップグレードします。
  • Ingress を使用して、アップグレードされたクラスタにトラフィックを戻します。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. このチュートリアルでは、以下の環境を構成するように Ingress を設定する必要があります。
    • すべてのクラスタで実行される同じアプリ(Namespace、Deployment、Service など)がデプロイされたクラスタを 2 つ以上用意します。
    • すべてのクラスタで自動アップグレードをオフにします。
    • GKE 静的バージョン 1.14.10-gke.17 以降、もしくは Rapid または Regular リリース チャンネルの GKE クラスタ。
    • クラスタは、エイリアス IP アドレス範囲を使用する VPC ネイティブ クラスタです。
    • HTTP 負荷分散を有効にします(デフォルトで有効になっています)。
    • gcloud --version は 281 以上である必要があります。GKE クラスタの登録手順は、このバージョンかそれ以降のバージョンによって異なります。
  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Console で、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
    

環境の設定

  1. Cloud Shell で、このチュートリアルのファイルを取得するリポジトリのクローンを作成します。

    cd ${HOME}
    git clone https://github.com/ameer00/gke-multicluster-upgrades.git
    
  2. WORKDIR ディレクトリを作成します。

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

GKE クラスタを作成して Hub に登録する

このセクションでは 3 つの GKE クラスタを作成し、それを Anthos Hub に登録します。

GKE クラスタを作成する

  1. Cloud Shell で、次の 3 つの GKE クラスタを作成します。

    gcloud container clusters create ingress-config --zone us-west1-a \
        --num-nodes=3 --enable-ip-alias --async
    gcloud container clusters create blue --zone us-west1-b --num-nodes=4 \
        --enable-ip-alias --async
    gcloud container clusters create green --zone us-west1-c --num-nodes=4 \
        --enable-ip-alias
    

    このチュートリアルでは、3 つのリージョン(us-west1-aus-west1-bus-west1-c)にクラスタを作成します。リージョンの詳細については、地域とリージョンをご覧ください。

  2. すべてのクラスタが作成されるまで数分かかります。クラスタが実行されていることを確認します。

    gcloud container clusters list
    

    出力は次のようになります。

    NAME            LOCATION    MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION    NUM_NODES  STATUS
    ingress-config  us-west1-a  1.14.10-gke.24  35.203.165.186  n1-standard-1  1.14.10-gke.24  3          RUNNING
    blue            us-west1-b  1.14.10-gke.24  34.82.76.141    n1-standard-1  1.14.10-gke.24  4          RUNNING
    green           us-west1-c  1.14.10-gke.17  35.197.46.200   n1-standard-1  1.14.10-gke.17  4          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
    

Hub に GKE クラスタを登録する

Hub を使用すると、ハイブリッド環境で Kubernetes クラスタを操作できます。また、登録済みクラスタで、Ingress などの GKE の高度な機能を使用できるようになります。GKE クラスタを Hub に登録する場合、Google Cloud サービス アカウントを使用して、Identity and Access Management(IAM)権限をそのサービス アカウントに付与します。

  1. Cloud Shell でサービス アカウントを作成し、その認証情報をダウンロードします。

    gcloud iam service-accounts create ingress-svc-acct
    gcloud projects add-iam-policy-binding ${PROJECT} \
        --member="serviceAccount:ingress-svc-acct@${PROJECT}.iam.gserviceaccount.com" \
        --role="roles/gkehub.connect"
    gcloud iam service-accounts keys \
        create ${WORKDIR}/ingress-svc-acct.json \
        --iam-account=ingress-svc-acct@${PROJECT}.iam.gserviceaccount.com
    
  2. GKE クラスタから URI を取得します。

    export INGRESS_CONFIG_URI=$(gcloud container clusters list --uri | grep ingress-config)
    export BLUE_URI=$(gcloud container clusters list --uri | grep blue)
    export GREEN_URI=$(gcloud container clusters list --uri | grep green)
    echo -e "${INGRESS_CONFIG_URI}\n${BLUE_URI}\n${GREEN_URI}"
    

    次のような出力が表示されます。

    https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-a/clusters/ingress-config
    https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue
    https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-c/clusters/green
    
  3. 3 つのクラスタを Hub に登録します。

    gcloud container hub memberships register ingress-config \
        --project=${PROJECT} \
        --gke-uri=${INGRESS_CONFIG_URI} \
        --service-account-key-file=${WORKDIR}/ingress-svc-acct.json
    
    gcloud container hub memberships register blue \
        --project=${PROJECT} \
        --gke-uri=${BLUE_URI} \
        --service-account-key-file=${WORKDIR}/ingress-svc-acct.json
    
    gcloud container hub memberships register green \
        --project=${PROJECT} \
        --gke-uri=${GREEN_URI} \
        --service-account-key-file=${WORKDIR}/ingress-svc-acct.json
    
  4. クラスタが登録されていることを確認します。

    gcloud container hub memberships list
    

    出力は次のようになります。

    NAME            EXTERNAL_ID
    blue            d40521d9-693f-11ea-a26c-42010a8a0010
    green           d3027ecd-693f-11ea-ad5f-42010a8a00a9
    ingress-config  bb778338-693f-11ea-a053-42010a8a016a
    
  5. Hub で multiclusteringress 機能を有効にして、ingress-config クラスタを Ingress の構成クラスタとして構成します。

    gcloud alpha container hub ingress enable \
        --config-membership=projects/${PROJECT}/locations/global/memberships/ingress-config
    

    上記のコマンドにより、MulticlusterIngressMulticlusterServiceCRD(カスタム リソース定義)config クラスタに追加されます。このコマンドが完了するまでに数分かかります。このまま待ってから次のステップに進みます。

  6. ingress-cluster クラスタが Ingress 用に正常に構成されていることを確認します。

    watch gcloud alpha container hub ingress describe
    

    出力が次のようになるまで待ちます。

    createTime: '2020-03-18T18:13:46.530713607Z'
    
    featureState:
      details:
        code: OK
        description: Multicluster Ingress requires Anthos license enablement. Unlicensed
          usage is unrestricted for the MCI Beta API. Note that licensing will be enforced
          for use of the Generally Available MCI API.
      detailsByMembership:
        projects/960583074711/locations/global/memberships/blue:
          code: OK
        projects/960583074711/locations/global/memberships/green:
          code: OK
        projects/960583074711/locations/global/memberships/ingress-config:
          code: OK
      lifecycleState: ENABLED
    multiclusteringressFeatureSpec:
      configMembership: projects/gke-multicluster-upgrades/locations/global/memberships/ingress-config
    name:
    projects/gke-multicluster-upgrades/locations/global/features/multiclusteringress
    

    watch コマンドを終了するには、Control+C キーを押します。

Online Boutique アプリを blue クラスタと green クラスタにデプロイする

  1. Cloud Shell で、Online Boutique アプリを blue クラスタと green クラスタにデプロイします。

    kubectl --context ${BLUE_CLUSTER} apply -f ${WORKDIR}/hipster-shop
    kubectl --context ${GREEN_CLUSTER} apply -f ${WORKDIR}/hipster-shop
    
  2. 数分待ってから、blue クラスタと green クラスタ内のすべての Pod のステータスが Running になっていることを確認します。

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

    出力は次のようになります。

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-86f5dfb995-nlm5w               1/1     Running   0          10m
    cartservice-76cf9686b6-rxf7b             1/1     Running   0          10m
    checkoutservice-7766b946f5-qszvc         1/1     Running   0          10m
    currencyservice-76975c7847-vmwn7         1/1     Running   0          10m
    emailservice-c55cd96f-74rxs              1/1     Running   0          10m
    frontend-f4b7cd95-lk4k8                  1/1     Running   0          10m
    loadgenerator-6784bc5f77-bkx4c           1/1     Running   0          10m
    paymentservice-696f796545-8sjp5          1/1     Running   0          10m
    productcatalogservice-7975f8588c-blrbq   1/1     Running   0          10m
    recommendationservice-6d44459d79-xxb8w   1/1     Running   0          10m
    redis-cart-6448dcbdcc-8qcb4              1/1     Running   0          10m
    shippingservice-767f84b88c-8f26h         1/1     Running   0          10m
    

複数クラスタ Ingress を構成する

このセクションでは、Online Boutique のフロントエンドから blue クラスタと green クラスタの両方にトラフィックを送信する複数クラスタ Ingress を作成します。Cloud Load Balancing を使用して、blue クラスタと green クラスタの両方でフロントエンド サービスをバックエンドとして使用するロードバランサを作成します。ロードバランサを作成するには、MultiClusterIngress と 1 つ以上の MultiClusterServices からなる 2 つのリソースが必要です。MultiClusterIngress オブジェクトと MultiClusterService オブジェクトには、単一クラスタ コンテキストで使用される既存の Kubernetes Ingress およびサービス リソースとのマルチクラスタ類似性があります。

  1. Cloud Shell で、MulticlusterIngress リソースを ingress-config クラスタにデプロイします。

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f mci.yaml
    

    次のような出力が表示されます。

    multiclusteringress.networking.gke.io/frontend-multicluster-ingress created
    
  2. MulticlusterService リソースを ingress-config クラスタにデプロイします。

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f mcs-blue-green.yaml
    

    次のような出力が表示されます。

    multiclusterservice.networking.gke.io/frontend-multicluster-svc created
    
  3. 2 つのリソースを比較する手順は次のとおりです。

    • MulticlusterIngress リソースを検査します。

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

      次のような出力が表示されます。

      spec:
          template:
            spec:
              backend:
                serviceName: frontend-multicluster-svc
                servicePort: 80
      

      MulticlusterIngress リソースは Kubernetes Ingress リソースと似ていますが、serviceName 仕様が MulticlusterService リソースを指している点が異なります。

    • 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: 80
                protocol: TCP
                targetPort: 8080
              selector:
                app: frontend
      

      MulticlusterService リソースは Kubernetes Service リソースと似ていますが、clusters 仕様がある点が異なります。clusters の値は、MulticlusterService リソースが作成される登録済みクラスタの一覧です。

    • MulticlusterIngress リソースが、MulticlusterService リソースを指すバックエンド サービスを使用してロードバランサを作成したことを確認します。

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

      出力が次のようになるまで待ちます。

      34.107.246.9
      

      仮想 IP アドレス(VIP)をメモしておきます。

      watch コマンドを終了するには、Control+C を押します。

  4. Online Boutique アプリにアクセスする場合、ブラウザで仮想 IP アドレスにアクセスします。

    404 エラー メッセージが表示された場合は、さらに少し待ってから、Online Boutique のフロントエンドが表示されるまでページを更新してください。

    アプリをブラウジングして、購入をいくつか試します。この時点で、Online Boutique アプリは blue クラスタと green クラスタの両方にデプロイされ、両方のクラスタにトラフィックを送信するように MulticlusterIngress リソースが設定されています。

負荷生成ツールの設定

このセクションでは、Cloud Load Balancing VIP へのクライアント トラフィックを生成する loadgenerator サービスを設定します。両方のクラスタにトラフィックを送信するように MulticlusterService リソースが設定されているため、最初に blue クラスタと green クラスタにトラフィックが送信されます。その後、単一のクラスタにトラフィックを送信するように MulticlusterService リソースを構成します。

  1. 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
    
  2. クライアント トラフィックを Cloud Load Balancing に送信するように loadgenerator サービスを構成します。

    sed -i 's/GCLB_VIP/'${GCLB_VIP}'/g' ${WORKDIR}/load-generator/loadgenerator.yaml
    
  3. ingress-config クラスタに loadgenerator をデプロイします。

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/load-generator
    
  4. ingress-config クラスタの loadgenerator Pod のステータスが 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
    

    いずれかの Pod のステータスが Running でない場合は、数分待ってからコマンドを再度実行します。

トラフィックのモニタリング

このセクションでは、Cloud Console を使用して Online Boutique アプリへのトラフィックをモニタリングします。

前のセクションで、Cloud Load Balancing VIP を介してアクセスすることで Online Boutique のクライアント トラフィックをシミュレートする loadgenerator デプロイメントを設定します。このような指標は Cloud Console からモニタリングできます。モニタリングしてアップグレードのクラスタをドレインできるよう、まずモニタリングを設定します(次のセクションで説明します)。

  1. Cloud Shell で、frontend-multicluster-ingress MulticlusterIngress リソースの転送ルールの名前を取得します。

    export INGRESS_LB_RULE=$(gcloud compute forwarding-rules list | grep frontend-multicluster-ingress | awk '{print $4}')
    echo ${INGRESS_LB_RULE}
    

    出力は次のようになります。

    mci-h8zu63-default-frontend-multicluster-ingress
    
  2. アプリの URL を生成します。

    echo "https://console.cloud.google.com/net-services/loadbalancing/details/http/${INGRESS_LB_RULE}?project=${PROJECT}&tab=monitoring&duration=PT1H"
    

    出力は次のようになります。

    https://console.cloud.google.com/net-services/loadbalancing/details/http/mci-h8zu63-default-frontend-multicluster-ingress?project=gke-multicluster-upgrades&tab=monitoring&duration=PT1H`
    
  3. ブラウザで、上記のコマンドで生成された URL に移動します。[バックエンド] プルダウン リストで、mci で始まるバックエンドを選択します。

    バックエンドの選択

    Online Boutique アプリへのトラフィックは、blue クラスタと green クラスタ(クラスタが含まれる 2 つのゾーンで示されます)の両方に送信されます。タイムライン指標グラフには、両方のバックエンドに送信されるトラフィックが表示されます。[バックエンド] 列の k8s1- 値は、2 つのフロンドエンド MulticlusterServices のネットワーク エンドポイント グループ(NEG)が blue クラスタと green クラスタで実行されていることを示します。

    両方のバックエンドに流れるトラフィックを示すタイムライン指標グラフ

green クラスタのドレインとアップグレード

このセクションでは、green クラスタをドレインします。ドレインされたクラスタは、負荷分散プールから削除されます。green クラスタをドレインすると、Online Boutique アプリ宛てのすべてのクライアント トラフィックは blue クラスタに移動します。前のセクションで説明したように、このプロセスをモニタリングできます。クラスタのドレイン後に、ドレインされたクラスタをアップグレードできます。クラスタのアップグレードが完了すると、負荷分散プールに戻すことができます。上記の手順を繰り返して他のクラスタをアップグレードします(このチュートリアルでは示していません)。

green クラスタをドレインするには、ingress-cluster クラスタの MulticlusterService リソースを更新し、clusters 仕様から green クラスタを削除します。

green クラスタのドレイン

  1. Cloud Shell で、ingress-config クラスタの MulticlusterService リソースを更新します。

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f mcs-blue.yaml
    
  2. clusters 仕様に blue クラスタのみがあることを確認します。

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

    次のような出力が表示されます。

    {
    
    ```
        "link": "us-west1-b/blue"
    }
    ```
    

    clusters 仕様に blue クラスタのみが表示されるため、blue クラスタのみが負荷分散プールに含まれます。

  3. 指標は、Cloud Console で Cloud Load Balancing の指標から確認できます。次の URL を生成します。

    echo "https://console.cloud.google.com/net-services/loadbalancing/details/http/${INGRESS_LB_RULE}?project=${PROJECT}&tab=monitoring&duration=PT1H"
    
  4. ブラウザで、前のコマンドで生成された URL に移動します。

    次のグラフは、blue クラスタのみが Online Boutique アプリからトラフィックを受信していることを示しています。

    「blue」クラスタにのみ流れるトラフィック

green クラスタのアップグレード

これで green クラスタがクライアント トラフィックを受信できなくなったので、このクラスタ(コントロール プレーンとノード)をアップグレードできます。

  1. Cloud Shell で、クラスタの現在のバージョンを取得します。

    gcloud container clusters list
    

    出力は次のようになります。

    NAME            LOCATION    MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION    NUM_NODES  STATUS
    ingress-config  us-west1-a  1.14.10-gke.24  35.203.165.186  n1-standard-1  1.14.10-gke.24  3          RUNNING
    blue            us-west1-b  1.14.10-gke.24  34.82.76.141    n1-standard-1  1.14.10-gke.24  4          RUNNING
    green           us-west1-c  1.14.10-gke.24  35.197.46.200   n1-standard-1  1.14.10-gke.24  4          RUNNING
    
    

    このチュートリアルを完了するタイミングによって、クラスタのバージョンが異なる場合があります。

  2. ゾーン内で使用可能な MasterVersions のバージョンのリストを取得します。

    gcloud container get-server-config --zone us-west1-c --format=json | jq
    '.validMasterVersions'
    

    出力は次のようになります。

    [
      "1.15.9-gke.22",
      "1.15.9-gke.12",
      "1.15.9-gke.9",
      "1.15.9-gke.8",
      "1.15.8-gke.3",
      "1.14.10-gke.27",
      "1.14.10-gke.24",
      "1.14.10-gke.22",
      "1.14.10-gke.21",
      "1.14.10-gke.17",
      "1.13.12-gke.30"
    ]
    
  3. ゾーン内で使用可能な NodeVersions のバージョンのリストを取得します。

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

    出力は次のようになります。

    [
      "1.15.9-gke.22",
      "1.15.9-gke.12",
      "1.15.9-gke.9",
      "1.15.9-gke.8",
      "1.15.8-gke.3",
      "1.15.8-gke.2",
      "1.15.7-gke.23",
      "1.15.7-gke.2",
      "1.15.4-gke.22",
      "1.14.10-gke.27",
      "1.14.10-gke.24",
      "1.14.10-gke.22",
      "1.14.10-gke.21",
      "1.14.10-gke.17",
      "1.14.10-gke.0",
      "1.14.9-gke.23",
      "1.14.9-gke.2",
      "1.14.9-gke.0",
      "1.14.8-gke.33",
      "1.14.8-gke.21"
    ]
    
  4. green クラスタの現在のバージョンよりも新しい MasterVersionNodeVersion のバージョンの環境変数を設定します。

    export UPGRADE_VERSION="1.16.13-gke.401"
    

    このチュートリアルでは、1.16.13-gke.401 バージョンを使用します。クラスタのバージョンは、このチュートリアルを完了するタイミングで使用可能になるバージョンによって、異なる場合があります。アップグレードの詳細については、クラスタとノードプールのアップグレードをご覧ください。すべてのノードで同じバージョンを選択することをおすすめします。使用可能なバージョンをリストから選択します。

  5. green クラスタの control plane ノードをアップグレードします。

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

    アップグレードを確認するには、Y を押します。

    このプロセスが完了するまでに数分かかります。アップグレードが完了するまで待ってから、処理を続行します。

    更新が完了すると、次のように出力されます。

    Updated
    [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-c/clusters/green].
    
  6. green クラスタのノードをアップグレードします。

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

    更新を確認するには、Y を押します。

    このプロセスが完了するまでに数分かかります。ノードのアップグレードが完了するまで待ってから、処理を続行します。

    アップグレードが完了すると、次のように出力されます。

    Upgrading green... Done with 4 out of 4 nodes (100.0%): 4 succeeded...done.
    Updated [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-c/clusters/green].
    
  7. green クラスタがアップグレードされていることを確認します。

    gcloud container clusters list
    

    出力は次のようになります。

    NAME            LOCATION    MASTER_VERSION   MASTER_IP       MACHINE_TYPE   NODE_VERSION     NUM_NODES  STATUS
    ingress-config  us-west1-a  1.14.10-gke.24   35.203.165.186  n1-standard-1  1.14.10-gke.24   3          RUNNING
    blue            us-west1-b  1.14.10-gke.24   34.82.76.141    n1-standard-1  1.14.10-gke.24   4          RUNNING
    green           us-west1-c  1.16.13-gke.401  35.197.46.200   n1-standard-1  1.16.13-gke.401  4          RUNNING
    

green クラスタを負荷分散プールに追加する

このセクションでは、green クラスタを負荷分散プールに追加し直します。

  1. Cloud Shell で、green クラスタですべての Online Boutique アプリのデプロイが実行されていることを確認してから、このクラスタを負荷分散プールに再び追加します。

    kubectl --context ${GREEN_CLUSTER} get pods
    

    出力は次のようになります。

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-86f5dfb995-2b25h               1/1     Running   0          16m
    cartservice-76cf9686b6-ws7b7             1/1     Running   1          13m
    checkoutservice-7766b946f5-6fhjh         1/1     Running   0          9m50s
    currencyservice-76975c7847-rf8r7         1/1     Running   0          13m
    emailservice-c55cd96f-pht8h              1/1     Running   0          13m
    frontend-f4b7cd95-wxdsh                  1/1     Running   0          13m
    loadgenerator-6784bc5f77-6b4cd           1/1     Running   6          6m34s
    paymentservice-696f796545-9wrl7          1/1     Running   0          9m49s
    productcatalogservice-7975f8588c-kbm5k   1/1     Running   0          6m33s
    recommendationservice-6d44459d79-km8vm   1/1     Running   0          9m49s
    redis-cart-6448dcbdcc-sjg69              1/1     Running   0          13m
    shippingservice-767f84b88c-gh9m4         1/1     Running   0          9m49s
    
  2. MutliclusterService リソースを更新して、green クラスタを負荷分散プールに再び追加します。

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f mcs-blue-green.yaml
    
  3. クラスタ仕様に blue クラスタと green クラスタの両方があることを確認します。

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

    次のような出力が表示されます。

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

    blue クラスタと green クラスタが clusters 仕様に含まれるようになりました。

  4. Cloud Load Balancing の指標は Cloud Console で使用できます。次の URL を生成します。

    echo "https://console.cloud.google.com/net-services/loadbalancing/details/http/${INGRESS_LB_RULE}?project=${PROJECT}&tab=monitoring&duration=PT1H"
    
  5. ブラウザで、前のコマンドで生成された URL に移動します。

    次のグラフは、blue クラスタと green クラスタの両方が Online Boutique アプリからトラフィックを受信していることを示しています。

    トラフィックを受信する両方のクラスタ

    これで操作は完了です。Ingress を使用して、複数クラスタ アーキテクチャで GKE クラスタを正常にアップグレードしました。

  6. blue クラスタをアップグレードするには、green クラスタをドレインしてアップグレードするプロセスを繰り返します。その際、greenblue にすべて置き換えてください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

課金を停止する最も簡単な方法は、チュートリアル用に作成した Cloud プロジェクトを削除することです。また、リソースを個別に削除することもできます。

クラスタを削除する

  1. Cloud Shell で、blue クラスタと green クラスタの登録を解除して削除します。

    gcloud container hub memberships unregister green \
        --project=${PROJECT} \
        --gke-uri=${GREEN_URI}
    
    gcloud container clusters delete green --zone us-west1-c --quiet
    
    gcloud container hub memberships unregister blue \
        --project=${PROJECT} \
        --gke-uri=${BLUE_URI}
    
    gcloud container clusters delete blue --zone us-west1-b --quiet
    
  2. ingress-config クラスタから MuticlusterIngress リソースを削除します。

    kubectl --context ${INGRESS_CONFIG_CLUSTER} delete -f mci.yaml
    

    このコマンドにより、プロジェクトから Cloud Load Balancing リソースが削除されます。

  3. ingress-config クラスタの登録を解除して削除します。

    gcloud container hub memberships unregister ingress-config \
        --project=${PROJECT} \
        --gke-uri=${INGRESS_CONFIG_URI}
    gcloud container clusters delete ingress-config --zone us-west1-a --quiet
    
  4. すべてのクラスタが削除されたことを確認します。

    gcloud container clusters list
    

    次のような出力が表示されます。

    *<null>*
    
  5. kubeconfig ファイルをリセットします。

    unset KUBECONFIG
    
  6. WORKDIR フォルダを削除します。

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

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ