在本地升级 Anthos Service Mesh

本指南说明了如何在 GKE on VMware 上将 Anthos Service Mesh 从版本 1.6.4+ 升级到版本 1.7.8。如需从 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 时也需要使用相同的自定义设置。如果您通过向 istioctl install 添加 --set values 标志自定义安装,我们建议您将这些设置添加到 IstioOperator YAML 文件中(尽管您可以继续使用 --set_values 标志)。要自定义安装,请在运行 istioctl install 命令时用 YAML 文件指定 -f 标志。

设置您的环境

在要安装 Anthos Service Mesh 的机器上,您需要以下工具。请注意,您只能在用户集群上安装 Anthos Service Mesh,不能在管理员集群上安装。

安装 Google Cloud CLI 后:

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

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    
  3. 安装 kubectl

    gcloud components install kubectl
    
  4. 安装所需的 kpt 版本:

       curl -L https://github.com/GoogleContainerTools/kpt/releases/download/v0.39.2/kpt_linux_amd64 > kpt_0_39_2
       chmod +x kpt_0_39_2
       alias kpt="$(readlink -f kpt_0_39_2)"
    
  5. 将上下文切换到用户集群:

    kubectl config use-context CLUSTER_NAME
  6. 向您的用户账号(您的 Google Cloud 登录电子邮件地址)授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user=USER_ACCOUNT

下载安装文件

    Linux

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

    预期输出为 Verified OK

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

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

    • 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.7.8-asm.10-osx.tar.gz
  6. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.7.8-asm.10-osx.tar.gz.1.sig istio-1.7.8-asm.10-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

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

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

    • 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.7.8-asm.10-win.zip
  10. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.7.8-asm.10-win.zip.1.sig istio-1.7.8-asm.10-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

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

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

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

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

升级 Anthos Service Mesh

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

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

更新控制层面

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

istioctl install \
  --set profile=asm-multicloud \
  --set revision=asm-178-10

--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-178-10-6d5cfd4b89-xztlr       1/1     Running   0          3m44s
istiod-fb7f746f4-wcntn                      1/1     Running   0          50m
promsd-579f9f9bf4-m65nc                     2/2     Running   1          50m

重新部署工作负载

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

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

    kubectl label namespace NAMESPACE istio-injection- istio.io/rev=asm-178-10 --overwrite

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

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

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

    kubectl get pods -n NAMESPACE -l istio.io/rev=asm-178-10

  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-178-10 -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 \
        --set profile=asm-multicloud \

完成升级

如果您确信应用正按预期运行,请移除旧的控制平面以完成升级:

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