升级 GKE 上的 Anthos Service Mesh

本指南介绍了如何在 GKE 上将 Anthos Service Mesh 从版本 1.5.4+ or 1.6.4+ 升级到版本 1.6.14。如需从 Anthos Service Mesh 1.4.5 及更高版本升级,您必须先升级到 Anthos Service Mesh 1.5。不支持从 Anthos Service Mesh 1.4 直接升级到 1.6。

升级时,我们建议您执行双控制层面升级(也称为 Canary 版升级),在使用较小百分比的工作负载测试新版本时,新版本和先前版本的控制层面均会运行。此方法比就地升级更安全,因为新版本的控制层面会替换先前版本。请注意,istio-ingressgateway 已就地升级,因此您应该规划好集群中断。

重新部署 Anthos Service Mesh 控制层面组件大约需要 5 到 10 分钟才能完成。此外,您需要在所有工作负载中注入新的 Sidecar 代理,以便这些 Sidecar 代理通过当前 Anthos Service Mesh 版本进行更新。更新 Sidecar 代理所需的时间取决于多种因素,例如 Pod 数量、节点数量、部署扩缩设置、Pod 中断预算和其他配置设置。更新 Sidecar 代理所需的时间估计约为每分钟 100 个 Pod。

准备升级

本部分概述了准备升级 Anthos Service Mesh 的步骤。

  1. 查看支持的功能和本指南,熟悉这些功能和升级流程。

  2. 如果您在安装以前版本的 Anthos Service Mesh 时启用了可选功能,则需要在升级时启用相同的功能。如需启用可选功能,您可以添加 --set values 标志,或在运行 istioctl install 命令时通过 YAML 文件指定 -f 标志。

  3. 如果您要在专用集群上安装 Anthos Service Mesh,则必须在防火墙中打开端口 15017,以获取与自动 Sidecar 注入搭配使用的网络钩子,以便正常运行。如需了解详情,请参阅在专用集群上打开端口

  4. 如果要从 Anthos Service Mesh 1.5 版升级,请执行以下步骤以防需要回滚:

    1. 创建名为 asm-1-5 的目录。

    2. 下载 1.5 安装文件asm-1-5 目录。

    3. 将文件内容提取到 asm-1-5 目录。

    4. 确保您位于 Anthos Service Mesh 1.5 安装根目录下。

    5. 下载 1.5 kpt 软件包并配置 1.5 istio-operator.yaml

设置您的环境

如需在 Google Kubernetes Engine 上进行安装,您可以使用 Cloud Shell、Google Cloud 资源的浏览器内置命令行界面或您自己运行 Linux 或 macOS 的计算机,按照安装指南操作。

选项 A:使用 Cloud Shell

Cloud Shell 预配一个运行基于 Debian 的 Linux 操作系统的 g1-small Compute Engine 虚拟机 (VM)。使用 Cloud Shell 的优势如下:

  • Cloud Shell 包含您需要的 gcloudkubectlhelm 命令行工具。

  • 您的 Cloud Shell $HOME 目录具有 5GB 永久性存储空间。

  • 您可以选择文本编辑器

    • 代码编辑器,可通过点击 Cloud Shell 窗口顶部的 来访问。

    • Emac、Vim 或 Nano,可从 Cloud Shell 中的命令行访问。

如需使用 Cloud Shell,请执行以下操作:

  1. 前往 Google Cloud 控制台
  2. 选择您的 Google Cloud 项目。
  3. 点击 Google Cloud 控制台窗口顶部的激活 Cloud Shell 按钮。

    Google Cloud Platform 控制台

    一个 Cloud Shell 会话随即会在 Google Cloud 控制台底部的新框内打开,并显示命令行提示符。

    Cloud Shell 会话

  4. 更新组件:

    gcloud components update
    

    该命令会以如下所示的输出作为响应:

    ERROR: (gcloud.components.update)
    You cannot perform this action because the gcloud CLI component manager
    is disabled for this installation. You can run the following command
    to achieve the same result for this installation:
    
    sudo apt-get update && sudo apt-get --only-upgrade install ...
  5. 复制并粘贴长命令以更新组件。

  6. 请确保 Git 位于您的路径中,以便 kpt 能够找到它。

选项 B:在本地使用命令行工具

在本地机器上,安装并初始化 gcloud CLI

如果您已安装 gcloud CLI,请执行以下操作:

  1. 使用 gcloud CLI 进行身份验证:

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    
  3. 安装 kubectl

    gcloud components install kubectl
    
  4. 安装 kpt

    gcloud components install kpt
    
  5. 请确保 Git 位于您的路径中,以便 kpt 能够找到它。

设置环境变量

  1. 获取创建集群的项目的 ID 和队列宿主项目的编号。

    gcloud

    运行以下命令:

    gcloud projects list
    

    控制台

    1. 前往 Google Cloud 控制台中的信息中心页面

      前往“信息中心”页面

    2. 点击页面顶部的从以下列表中选择:下拉列表。在随即显示的从以下列表中选择:窗口中,选择您的项目。

      项目 ID 会显示在项目信息中心的项目信息卡片上。

  2. 为在其中创建集群的项目的 ID 创建环境变量:

    export PROJECT_ID=YOUR_PROJECT_ID

  3. 为队列宿主项目的项目编号创建环境变量:

    export FLEET_PROJECT_NUMBER=YOUR_FLEET_PROJECT_NUMBER

  4. 创建以下环境变量:

    • 设置集群名称:

      export CLUSTER_NAME=YOUR_CLUSTER_NAME
    • CLUSTER_LOCATION 设置为您的集群区域或集群地区:

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION

(可选)更改集群上的网格 ID

如果您的服务网格包含或将包含不同项目中的多个集群,则所有集群都必须具有相同的网格 ID,该 ID 取决于队列宿主项目的项目编号。在集群上设置的网格 ID 必须与您配置 Anthos Service Mesh 以使用的网格 ID 相符。

如果您只有一个集群,或者您的服务网格包含或将包含同一项目中的多个集群,请跳过以下步骤并继续执行设置凭据和权限

如需在集群上设置新的网格 ID 标签,请执行以下操作:

  1. 为网格 ID 创建环境变量:

    export MESH_ID="proj-${FLEET_PROJECT_NUMBER}"

  2. 如果您的集群已有要保留的标签,则在添加 mesh_id 标签时必须将这些标签包含在内。

    1. 如需查看您的集群是否已有标签,请执行以下操作:

      gcloud container clusters describe ${CLUSTER_NAME} \
        --project ${PROJECT_ID}

      在输出中查找 resourceLabels 字段。每个标签都存储在 resourceLabels 字段下的单独的一行中,例如:

      resourceLabels:
        csm: ''
        env: dev
        release: stable

      您无需保留现有的 mesh_id。请使用新的 mesh_id 标签将其覆盖。

      为方便起见,您可以向环境变量添加标签。在以下命令中,请将 YOUR_EXISTING_LABELS 替换为集群上以英文逗号分隔的现有标签列表,格式为 KEY=VALUE,例如:env=dev,release=stable

      export EXISTING_LABELS="YOUR_EXISTING_LABELS"
    2. 设置 mesh_id 标签:

      • 如果您的集群已有要保留的标签,请使用 mesh_id 和现有标签更新集群:

        gcloud container clusters update ${CLUSTER_NAME} \
          --project ${PROJECT_ID}
          --update-labels=mesh_id=${MESH_ID},${EXISTING_LABELS}
      • 如果您的集群没有任何现有标签,请仅使用新的 mesh_id 标签更新集群:

        gcloud container clusters update ${CLUSTER_NAME} \
          --project=${PROJECT_ID} \
          --update-labels=mesh_id=${MESH_ID}

设置凭据和权限

  1. 获取身份验证凭据以便与集群进行交互:

    gcloud container clusters get-credentials ${CLUSTER_NAME} \
        --project=${PROJECT_ID}
    
  2. 向当前用户授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"

如果看到 "cluster-admin-binding" already exists 错误,您可以放心地忽略该错误并继续采用现有集群管理员绑定。

下载安装文件

    Linux

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.6.14-asm.2-linux-amd64.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.6.14-asm.2-linux-amd64.tar.gz.1.sig
    openssl dgst -verify /dev/stdin -signature istio-1.6.14-asm.2-linux-amd64.tar.gz.1.sig istio-1.6.14-asm.2-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.6.14-asm.2-linux-amd64.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.6.14-asm.2 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 manifests/profiles 目录中。

  4. Mac OS

  5. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.6.14-asm.2-osx.tar.gz
  6. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.6.14-asm.2-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.6.14-asm.2-osx.tar.gz.1.sig istio-1.6.14-asm.2-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  7. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.6.14-asm.2-osx.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.6.14-asm.2 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 manifests/profiles 目录中。

  8. Windows

  9. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.6.14-asm.2-win.zip
  10. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.6.14-asm.2-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.6.14-asm.2-win.zip.1.sig istio-1.6.14-asm.2-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  11. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.6.14-asm.2-win.zip

    该命令会在当前工作目录中创建一个名为 istio-1.6.14-asm.2 的安装目录,其中包含:

    • samples 目录中的示例应用。
    • 用于安装 Anthos Service Mesh 的 istioctl 命令行工具位于 bin 目录中。
    • Anthos Service Mesh 配置文件位于 manifests/profiles 目录中。

  12. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.6.14-asm.2
  13. 为方便起见,请将 /bin 目录中的工具添加到 PATH:
    export PATH=$PWD/bin:$PATH

准备资源配置文件

运行 istioctl install 命令时,请在命令行中指定 -f istio-operator.yaml。此文件包含 Anthos Service Mesh 所需的项目和集群的相关信息。您需要下载包含 istio-operator.yaml 和其他资源配置文件的软件包,以便设置项目和集群信息。

首先,根据您要使用的证书授权机构 (CA) 选择要下载的软件包:

  • asm此软件包可启用 Mesh CA(建议用于新安装)。

  • asm-citadel:您可以选择启用 Citadel 作为 CA。在选择此软件包之前,请参阅选择证书授权机构以了解详情。

如需准备资源配置文件,请执行以下操作:

  1. 为 Anthos Service Mesh 软件包资源配置文件创建一个新目录。我们建议您使用集群名称作为目录名称。

  2. 切换到您要在其中下载 Anthos Service Mesh 软件包的目录。

  3. 根据 CA 下载您要使用的软件包

    Mesh CA

    下载 asm 软件包以启用 Mesh CA:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.6-asm asm
    

    Citadel

    下载 asm-citadel 软件包,以启用 Citadel 作为 CA:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm-citadel@release-1.6-asm asm
    
  4. 为在其中创建集群的项目设置项目 ID:

    kpt cfg set asm gcloud.core.project ${PROJECT_ID}
    
  5. 为舰队宿主项目设置项目编号:

    kpt cfg set asm gcloud.project.environProjectNumber ${FLEET_PROJECT_NUMBER}
    
  6. 设置集群名称:

    kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME}
    
  7. 设置默认区域或地区:

    kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION}
    
  8. 设置您计划使用的配置文件

    • 如果您的所有集群都在同一项目中,请设置 asm-gcp 配置文件:

      kpt cfg set asm anthos.servicemesh.profile asm-gcp
      
    • 如果您的服务网格包含或将包含不同项目中的多个集群,请设置 asm-gcp-multiproject 配置文件(Beta 版):

      kpt cfg set asm anthos.servicemesh.profile asm-gcp-multiproject
      
  9. 如果您设置了 asm-gcp-multiproject 配置文件并下载了 asm 软件包以启用 Mesh CA,则需要为将形成多集群/多项目服务网格的其他项目配置信任网域别名。否则,请跳过此步骤。

    1. 获取将进入多集群/多项目网格的所有集群的项目 ID

    2. 针对每个集群的项目 ID,设置信任网域别名。例如,如果 3 个项目中存在集群,请运行以下命令,并将 PROJECT_ID_1PROJECT_ID_2PROJECT_ID_3 替换为每个集群的项目 ID。

      kpt cfg set asm anthos.servicemesh.trustDomainAliases PROJECT_ID_1.svc.id.goog PROJECT_ID_2.svc.id.goog PROJECT_ID_3.svc.id.goog

      在其他项目中配置集群时,您可以使用相同的命令。

      通过信任网域别名,Mesh CA 可对其他项目中的集群上的工作负载进行身份验证。除了设置信任网域别名之外,在安装 Anthos Service Mesh 之后,您还必须启用跨集群负载均衡

  10. 输出 kpt setter 的值:

      kpt cfg list-setters asm
    

    在命令的输出中,验证以下 setter 的值是否正确:

    • gcloud.compute.location
    • gcloud.container.cluster
    • gcloud.core.project
    • gcloud.project.environProjectNumber

升级 Anthos Service Mesh

如需安装新版本的 Anthos Service Mesh,我们建议您按照双控制平面升级过程(在 Istio 文档中称为 Canary 版升级)操作。通过双控制层面升级,您可以在现有控制层面的基础上安装新版本控制层面。安装新版本时,您要添加可标识新控制平面版本的 revision 标签。每个修订版本都是一个完整的 Anthos Service Mesh 控制平面实现,具有自己的 Deployment 和 Service。

然后,通过在工作负载上设置相同的 revision 标签以指向新的控制平面,并执行滚动重启以使用新的 Anthos Service Mesh 版本重新注入代理,从而迁移到新版本。通过这种方法,您可以监控升级对一小部分工作负载的影响。测试应用后,您可以将所有流量迁移到新版本。此方法比执行就地升级更安全,因为新控制平面会替换先前版本的控制平面。

更新控制平面

运行以下命令,使用您在 istio-operator.yaml 文件中设置的配置文件部署新的控制平面。如果您要启用支持的可选功能,请在以下命令行中添加 -f 和 YAML 文件名。如需了解详情,请参阅启用可选功能

  istioctl install \
    -f asm/cluster/istio-operator.yaml \
    --set revision=asm-1614-2

--set revision 参数会向 istiod 添加一个 istio.io/rev 标签。运行该命令后,您将并排运行两个控制层面 Deployment 和 Service:

kubectl get pods -n istio-system

输出示例:

NAME                                        READY   STATUS    RESTARTS   AGE
istio-ingressgateway-c56675fcd-86zdn        1/1     Running   0          2m9s
istio-ingressgateway-c56675fcd-vn4nv        1/1     Running   0          2m21s
istiod-asm-1614-2-6d5cfd4b89-xztlr           1/1     Running   0          3m44s
istiod-fb7f746f4-wcntn                      1/1     Running   0          50m

重新部署工作负载

安装新修订版本对现有 Sidecar 代理没有影响。如需升级这些代理,您必须将其配置为指向新控制层面。这会在 Sidecar 注入期间根据命名空间标签 istio.io/rev 进行控制。

  1. 更新工作负载以注入新的 Anthos Service Mesh 版本:

    kubectl label namespace NAMESPACE istio-injection- istio.io/rev=asm-1614-2 --overwrite

    istio-injection 标签必须移除,因为它优先于 istio.io/rev 标签。

  2. 重启 pod 以触发重新注入:

    kubectl rollout restart deployment -n NAMESPACE
  3. 验证 pod 是否配置为指向 istiod-asm-1614-2 控制平面:

    kubectl get pods -n NAMESPACE -l istio.io/rev=asm-1614-2

  4. 测试您的应用,验证工作负载是否正常工作。

  5. 如果您在其他命名空间中存在工作负载,请对每个命名空间重复上述步骤。

  6. 如果您确信应用正在按预期运行,请跳至完成升级。否则,请按照以下步骤操作,回滚到以前的版本。

    1. 更新要用控制平面的先前版本注入的工作负载,请运行以下命令:

       kubectl label namespace NAMESPACE istio.io/rev- istio-injection=enabled --overwrite

    2. 重启 Pod 以触发重新注入,以便代理具有以前的版本:

       kubectl rollout restart deployment -n NAMESPACE

    3. 回滚控制平面组件,请执行以下操作:

      回滚到之前的 1.6 版

      1. 重新部署旧版 istio-ingressgateway

        kubectl -n istio-system rollout undo deploy istio-ingressgateway
        
      2. 移除新的控制层面:

        kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-asm-1614-2 -n istio-system --ignore-not-found=true
        

      回滚到 1.5

      1. 切换到下载 1.5 Anthos Service Mesh 安装文件的目录。

      2. 重新安装旧版 Anthos Service Mesh。在以下命令中,如果您已启用可选功能,请务必添加适用的 --set values 标志或带有 YAML 文件名的 -f 标志。

        bin/istioctl install \
        -f asm/cluster/istio-operator.yaml

完成升级

如果您确信应用正在按预期工作,请按以下步骤完成升级:

  1. 移除旧的控制层面:

    kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod -n istio-system --ignore-not-found=true
    
  2. 运行以下命令以部署规范化服务控制器:

    kubectl apply -f asm/canonical-service/controller.yaml

    该命令会将规范化服务控制器部署到您的集群。规范化服务控制器会对属于同一逻辑服务的工作负载进行分组,且您必须使用它解锁 Google Cloud 控制台的服务信息中心中的额外功能。如需了解详情,请参阅启用和停用规范化服务控制器

后续步骤