使用多集群 Ingress 升级多集群 GKE 环境

本教程介绍了如何使用多集群 Ingress 升级多集群 Google Kubernetes Engine (GKE) 环境。本教程是使用多集群 Ingress 升级多集群 GKE 文档的延续,更详细地介绍了步骤、架构和术语。我们建议您先阅读概念文档,然后再学习本教程。

如需查看多集群 Ingress (MCI)、多集群网关 (MCG) 与使用独立网络端点组(LB 和独立 NEG)的负载均衡器之间的详细比较,请参阅选择适用于 GKE 的多集群负载均衡 API

本文档适用于负责维护 GKE 集群舰队的 Google Cloud 管理员。

我们建议自动升级 GKE 集群。自动升级是一种全托管式方法,使集群(控制平面和节点)根据由Google Cloud确定的发布时间表自动更新。无需操作者进行任何干预。但是,如果您想要更好地控制集群的升级方式和时间,本教程将介绍升级应用在其上运行的所有集群的方法。然后,它使用多集群 Ingress 在升级前一次排空一个集群。

架构

本教程使用以下架构。总共有三个集群:两个集群(bluegreen)充当部署了同一应用的相同集群,另一个集群 (ingress-config) 充当配置多集群 Ingress 的控制平面集群。在本教程中,您需要将示例应用部署到两个应用集群(bluegreen 集群)。

两个相同的集群和一个控制平面集群的架构。

目标

  • 创建三个 GKE 集群,并将其注册为舰队。
  • 配置一个 GKE 集群 (ingress-config) 作为中央配置集群。
  • 将示例应用部署到其他 GKE 集群。
  • 配置多集群 Ingress,将客户端流量发送到同时在这两个应用集群上运行的应用。
  • 为应用设置负载生成器并配置监控。
  • 从多集群 Ingress 中移除(排空)一个应用集群,并升级排空的集群。
  • 使用多集群 Ingress 将流量退回到升级后的集群。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

如需根据您的预计使用量来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 本教程要求您设置多集群 Ingress,以完成以下设置:
    • 两个或更多集群,相同的应用(例如命名空间、Deployment 和 Service)在所有集群上运行。
    • 关闭所有集群的自动升级。
    • 集群是使用别名 IP 地址范围的 VPC 原生集群
    • 启用 HTTP 负载均衡(默认启用)。
    • gcloud --version 必须为 369 或更高。GKE 集群注册步骤依赖于此版本或更高版本。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, activate Cloud Shell.

    Activate 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
    
  7. 设置环境

    1. 在 Cloud Shell 中,克隆代码库以获取本教程的文件:

      cd ${HOME}
      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
      
    2. 创建 WORKDIR 目录:

      cd kubernetes-engine-samples/networking/gke-multicluster-upgrade-mci/
      export WORKDIR=`pwd`
      

    创建 GKE 集群并将其注册到 Hub

    在本部分中,您将创建三个 GKE 集群,并将它们注册到 GKE Hub。

    创建 GKE 集群

    1. 在 Cloud Shell 中,创建三个 GKE 集群:

      gcloud container clusters create ingress-config --location 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 --location 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 --location us-west1-c --num-nodes=3 \
      --release-channel=None --no-enable-autoupgrade --enable-ip-alias \
      --workload-pool=${PROJECT}.svc.id.goog --quiet
      

      在本教程中,您将在单个区域的三个不同可用区中创建集群:us-west1-aus-west1-bus-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 \
          --location us-west1-a --project ${PROJECT}
      gcloud container clusters get-credentials blue --location us-west1-b \
          --project ${PROJECT}
      gcloud container clusters get-credentials green --location us-west1-c \
          --project ${PROJECT}
      

      使用 kubeconfig 文件为每个集群创建用户和上下文,从而创建针对集群的身份验证。创建 kubeconfig 文件后,您可以快速切换集群之间的上下文。

    4. 验证 kubeconfig 文件中有三个集群:

      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. 获取三个集群的上下文供稍后使用:

      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
      

    将 GKE 集群注册到舰队

    通过将集群注册到舰队,您可以在混合环境中运维 Kubernetes 集群。注册到舰队的集群可以使用高级 GKE 功能,例如多集群 Ingress。如需向舰队注册 GKE 集群,您可以直接使用 Google Cloud服务账号,也可以使用推荐的 Workload Identity Federation for GKE 方法,该方法允许 GKE 集群中的Kubernetes 服务账号充当 Identity and Access Management 服务账号。

    1. 将三个集群注册为舰队:

      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. 通过 Hub 启用 multiclusteringress 功能,将 ingress-config 集群配置为多集群 Ingress 的配置集群:

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

      上述命令将 MulticlusterIngressMulticlusterService CRD(自定义资源定义)添加到 ingress-config 集群。此命令需要几分钟才能完成。请等待命令完成,然后再继续下一步。

    4. 验证是否为多集群 Ingress 成功配置了 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 集群中的所有 pod 都为 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.
      

    配置多集群 Ingress

    在本部分中,您将创建一个多集群 Ingress,以将流量发送到 bluegreen 集群上运行的应用。您可以使用 Cloud Load Balancing 创建负载均衡器,以将 bluegreen 集群中的 whereami 用作后端。如需创建负载均衡器,您需要两个资源:一个 MultiClusterIngress 以及一个或多个 MultiClusterServicesMultiClusterIngressMultiClusterService 对象是多集群模拟,类似于在单个集群上下文中使用的现有 Kubernetes Ingress 和 Service 资源。

    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 资源与 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: 8080
                protocol: TCP
                targetPort: 8080
              selector:
                app: whereami
        

        MulticlusterService 资源与 Kubernetes 服务资源类似,但它有 clusters 规范。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 应用之间进行负载均衡。

    设置负载生成器

    在本部分中,您将设置 loadgenerator Service,以向 Cloud Load Balancing VIP 生成客户端流量。首先,流量会被发送到 bluegreen 集群,因为 MulticlusterService 资源被设置为同时向这两个集群发送流量。稍后,您将配置 MulticlusterService 资源以将流量发送到单个集群。

    1. 配置 loadgenerator 清单以将客户端流量发送到 Cloud Load Balancing:

      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 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,请等待几分钟,然后再次运行该命令。

    监控流量

    在本部分中,您将使用Google Cloud 控制台监控发送到 whereami 应用的流量。

    在上一部分中,您设置了 loadgenerator 部署,以通过 Cloud Load Balancing VIP 访问 whereami 应用来模拟客户端流量。您可以通过Google Cloud 控制台监控这些指标。您首先设置监控,以便可以在排空集群以进行升级时进行监控(下一部分会对此进行说明)。

    1. 创建信息中心以显示到达多集群 Ingress 的流量:

      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 的指标。生成网址:

      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. 在浏览器中,转到上述命令生成的网址。

      流向示例应用的流量将从负载生成器传输到 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"
        }
      ]
      

      clusters 规范中仅列出了 green 集群,因此只有 green 集群在负载均衡池中。

    3. 您可以在Google Cloud 控制台中查看来自 Cloud Load Balancing 指标的指标。生成网址:

      echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
      
    4. 在浏览器中,转到上一个命令生成的网址。

      图表显示只有 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 --location 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 --location 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 \
          --location 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 \
          --location=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 指标的指标。生成网址:

      echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
      
    5. 在浏览器中,转到上一个命令生成的网址。

      该图表显示蓝色和绿色集群都使用负载均衡器接收来自负载生成器的流量。

      两个集群都接收流量。

      恭喜!您使用多集群 Ingress 在多集群架构中成功升级了 GKE 集群。

    6. 如需升级 green 集群,请重复排空和升级蓝色集群的步骤,在整个过程中将 blue 替换为 green

    清理

    为避免因本教程中使用的资源导致您的 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 --location us-west1-b --quiet
      
      gcloud container fleet memberships unregister green --gke-cluster=us-west1-c/green
      gcloud container clusters delete green --location 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 --location us-west1-a --quiet
      
    4. 验证所有集群是否已删除:

      gcloud container clusters list
      

      输出如下所示:

      *&lt;null&gt;*
      
    5. 重置 kubeconfig 文件:

      unset KUBECONFIG
      
    6. 移除 WORKDIR 文件夹:

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

    删除项目

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    后续步骤