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

Last reviewed 2022-12-15 UTC

本教程介绍了如何使用多集群 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. 在 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 集群并将其注册到 Hub

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

创建 GKE 集群

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

    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-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 \
        --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 文件中有三个集群:

    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 方法,此方法允许 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 --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 指标的指标。生成网址:

    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 --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,然后点击关闭以删除项目。

后续步骤