Anthos Service Mesh 1.6 has reached end of life and is no longer supported. See Upgrading from earlier versions.

View the latest documentation or select another available version:

升级 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. 转到 Cloud Console
  2. 选择您的 Cloud 项目。
  3. 点击 Cloud Console 窗口顶部的激活 Cloud Shell 按钮。

    Google Cloud Platform Console

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

    Cloud Shell 会话

  4. 更新组件:

    gcloud components update
    

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

    ERROR: (gcloud.components.update)
    You cannot perform this action because the Cloud SDK 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. 安装 kubectl

    sudo apt-get install kubectl
    
  7. 安装 kpt

    sudo apt-get install google-cloud-sdk-kpt
    
  8. 请确保 Git 位于您的路径中,以便 kpt 能够找到它。

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

在本地机器上,安装并初始化 Cloud SDKgcloud 命令行工具)。

如果您已安装 Cloud SDK,请执行以下操作:

  1. 使用 Cloud SDK 进行身份验证:

    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. 转到 Cloud Console 中的信息中心页面

      转到“信息中心”页面

    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

    该命令会将规范化服务控制器部署到您的集群。规范化服务控制器按照所属的逻辑服务对工作负载进行分组,且您在 Cloud Console 的服务信息中心中需要其解锁额外功能。如需了解详情,请参阅启用和停用规范化服务控制器

后续步骤