版本 1.10

升级本地的 Anthos Service Mesh

准备升级

在升级之前,您应检查配置是否与新版本的 Anthos Service Mesh 兼容。使用随新 Anthos Service Mesh 版本分发的 istioctl 二进制文件,然后运行 istioctl experimental precheck 检查 Kubernetes 集群是否符合 Istio 安装和升级要求。

如果您自定义了先前的安装,在升级至新的 Anthos Service Mesh 版本或从 Istio 迁移时,需要相同的自定义。如果您通过向 istioctl install 添加 --set values 标志来自定义安装,则必须将这些设置添加到 IstioOperator YAML 文件(称为 叠加文件。您可以在运行脚本时使用 --custom_overlay 选项和文件名来指定叠加文件。脚本将叠加文件传递给 istioctl install

脚本遵循修订版本升级过程(在 Istio 文档中称为“Canary”升级)。使用基于修订版本的升级时,该脚本会安装新版本的控制层面,与现有控制层面并排。安装新版本时,该脚本包含用于标识新控制层面的 revision 标签。

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

设置您的环境

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

  • curl 命令行工具。
  • Cloud SDKgcloud 命令行工具)。

安装 Cloud SDK 后:

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

    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.10.2-asm.3-linux-amd64.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.2-asm.3-linux-amd64.tar.gz.1.sig
    openssl dgst -verify /dev/stdin -signature istio-1.10.2-asm.3-linux-amd64.tar.gz.1.sig istio-1.10.2-asm.3-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,若要将内容提取到当前工作目录,请运行以下命令:

     tar xzf istio-1.10.2-asm.3-linux-amd64.tar.gz

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

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

    cd istio-1.10.2-asm.3

Mac OS

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.2-asm.3-osx.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.2-asm.3-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.10.2-asm.3-osx.tar.gz.1.sig istio-1.10.2-asm.3-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,若要将内容提取到当前工作目录,请运行以下命令:

    tar xzf istio-1.10.2-asm.3-osx.tar.gz

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

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

    cd istio-1.10.2-asm.3

Windows

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.2-asm.3-win.zip
  2. 下载签名文件并使用 openssl 验证签名:

    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.2-asm.3-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.10.2-asm.3-win.zip.1.sig istio-1.10.2-asm.3-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. 将文件内容提取到文件系统上的任意位置。例如,若要将内容提取到当前工作目录,请运行以下命令:

    tar xzf istio-1.10.2-asm.3-win.zip

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

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

    cd istio-1.10.2-asm.3

准备资源配置文件

运行 istioctl install 命令时,应在命令行中包含 revisioned-custom-ingressgateway.yaml 文件。您可以使用此文件来控制升级后切换到 istio-ingressgateway 的新版本。如要下载并配置此文件,请执行以下步骤:

  1. 切换到您要在其中下载 anthos-service-mesh 软件包的目录。

  2. 下载软件包:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.10-asm asm
    
  3. 将标记设置为您要安装的 Anthos Service Mesh 版本:

    kpt cfg set asm anthos.servicemesh.tag 1.10.2-asm.3
    
  4. 设置验证网络钩子以使用修订版本标签:

    kpt cfg set asm anthos.servicemesh.rev asm-1102-3
    

    安装 Anthos Service Mesh 时,您可以在 istiod 上设置修订版本标签。您需要在验证网络钩子上设置相同的修订版本。

升级 Anthos Service Mesh

如需安装新版本的 Anthos Service Mesh,建议您遵循基于修订版本的升级过程(也称为“Canary 升级”)。使用基于修订版本的升级时,您将同时安装新版控制层面和现有控制层面。安装新版本时,您要添加可标识新控制平面版本的 revision 标签。每个修订版本都是一个完整的 Anthos Service Mesh 控制平面实现,具有自己的 Deployment 和 Service。

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

更新控制平面

  1. 如果需要,请切换到 istio-1.10.2-asm.3 目录。istioctl 客户端依赖于版本。请确保使用 istio-1.10.2-asm.3/bin 目录中的版本。

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

    bin/istioctl install \
      --set profile=asm-multicloud \
      -f asm/istio/options/revisioned-istio-ingressgateway.yaml \
      --set revision=asm-1102-3

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

kubectl get pods -n istio-system

部署和重新部署工作负载

  1. 获取 istiodistio-ingressgateway 上的修订版本标签。

    kubectl get pod -n istio-system -L istio.io/rev
    

    此命令的输出类似如下所示。

    NAME                                             READY   STATUS    RESTARTS   AGE   REV
    istio-ingressgateway-65d884685d-6hrdk            1/1     Running   0          67m
    istio-ingressgateway-65d884685d-94wgz            1/1     Running   0          67m
    istio-ingressgateway-asm-182-2-8b5fc8767-gk6hb   1/1     Running   0          5s    asm-1102-3
    istio-ingressgateway-asm-182-2-8b5fc8767-hn4w2   1/1     Running   0          20s   asm-1102-3
    istiod-asm-176-1-67998f4b55-lrzpz                1/1     Running   0          68m   asm-196-1
    istiod-asm-176-1-67998f4b55-r76kr                1/1     Running   0          68m   asm-196-1
    istiod-asm-182-2-5cd96f88f6-n7tj9                1/1     Running   0          27s   asm-1102-3
    istiod-asm-182-2-5cd96f88f6-wm68b                1/1     Running   0          27s   asm-1102-3
    1. 在输出中的 REV 列下,记下新版本的修订版标签的值。在此示例中,该值为 asm-1102-3

    2. 另请注意旧版 istiod 的修订版本标签中的值。 将工作负载移至新版本后,您需要使用此值删除旧版本的 istiod。在示例输出中,旧版本的修订版本标签值为 asm-196-1

  2. istio-ingressgateway 切换到新的修订版本。在以下命令中,将 REVISION 的值更改为新版本修订版本标签的值。

    kubectl patch service -n istio-system istio-ingressgateway --type='json' -p='[{"op": "replace", "path": "/spec/selector/service.istio.io~1canonical-revision", "value": "REVISION"}]'

    预期输出:service/istio-ingressgateway patched

  3. 将修订版本标签添加到命名空间,并移除 istio-injection 标签(如果存在)。在以下命令中,将 REVISION 更改为与 istiod 的新修订版本匹配的值。

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

    如果您在输出中看到 "istio-injection not found",则可以忽略它。这意味着命名空间之前没有 istio-injection 标签。如果命名空间同时具有 istio-injection 和修订版本标签,自动注入将失败,因此 Anthos Service Mesh 文档中的所有 kubectl label 命令都包含移除 istio-injection 标签。

  4. 重启 pod 以触发重新注入。

    kubectl rollout restart deployment -n NAMESPACE
  5. 验证 pod 是否配置为指向新版 istiod

    kubectl get pods -n NAMESPACE -l istio.io/rev=REVISION
  6. 测试您的应用,验证工作负载是否正常工作。

  7. 如果您的其他命名空间中存在工作负载,请重复上述步骤以标记命名空间并重启 Pod。

  8. 如果您确信应用按预期正常运行,请继续执行转换到新版 istiod 的步骤。如果您的应用出现问题,请按照以下步骤回滚。

    完成转换

    如果您确信应用按预期正常运行,请移除旧控制层面以完成到新版本的转换。

    1. 切换到 anthos-service-mesh GitHub 代码库中的文件所在的目录。

    2. 配置验证 Webhook 以使用新的控制层面。

      kubectl apply -f asm/istio/istiod-service.yaml
      
    3. 删除旧 istio-ingressgateway 部署。要运行的命令取决于您是从 Istio 迁移还是从旧版 Anthos Service Mesh 升级:

      迁移

      如果您是从 Istio 迁移,旧的 istio-ingressgateway 没有修订版本标签。

      kubectl delete deploy/istio-ingressgateway -n istio-system
      

      升级

      如果您是从旧版 Anthos Service Mesh 升级,请在以下命令中将 OLD_REVISION 替换为旧版 istio-ingressgateway 的修订版本标签。

      kubectl delete deploy -l app=istio-ingressgateway,istio.io/rev=OLD_REVISION -n istio-system --ignore-not-found=true
      
    4. 删除 istiod 的旧版本。要使用的命令取决于您是从 Istio 迁移还是从旧版 Anthos Service Mesh 升级。

      迁移

      如果您是从 Istio 迁移,旧的 istio-ingressgateway 没有修订版本标签。

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

      升级

      如果您是从旧版 Anthos Service Mesh 升级,在以下命令中,请确保 OLD_REVISION 与旧版 istiod 的修订版本标签匹配。

      kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-OLD_REVISION -n istio-system --ignore-not-found=true
      
    5. 移除旧版 IstioOperator 配置。

      kubectl delete IstioOperator installed-state-OLD_REVISION -n istio-system
      

      预期输出如下所示:

      istiooperator.install.istio.io "installed-state-OLD_REVISION" deleted

    回滚

    如果您在使用新版 istiod 测试应用时遇到问题,请按照以下步骤回滚到之前的版本:

    1. 切换回旧版 istio-ingressgateway。在以下命令中,将 OLD_REVISION 替换为旧修订版本。

      kubectl patch service -n istio-system istio-ingressgateway --type='json' -p='[{"op": "replace", "path": "/spec/selector/service.istio.io~1canonical-revision", "value": "OLD_REVISION"}]'
      
    2. 重新为您的命名空间添加标签,以启用旧版 istiod 的自动注入。使用的命令取决于您在旧版本使用的是修订版本标签还是 istio-injection=enabled

      • 如果您使用修订版本标签来进行自动注入,请使用以下命令:

        kubectl label namespace NAMESPACE istio.io/rev=OLD_REVISION --overwrite
        
      • 如果您使用的是 istio-injection=enabled,请使用以下命令:

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

      预期输出:

      namespace/NAMESPACE labeled
    3. 确认命名空间上的修订版本标签与旧版 istiod 的修订版本标签一致:

      kubectl get ns NAMESPACE --show-labels
      
    4. 重启 pod 以触发重新注入,以使代理具有之前的版本:

      kubectl rollout restart deployment -n NAMESPACE
      
    5. 移除新的 istio-ingressgateway 部署。确保以下命令中的 REVISION 值正确无误。

      kubectl delete deploy -l app=istio-ingressgateway,istio.io/rev=REVISION -n istio-system --ignore-not-found=true
      
    6. 移除新版 istiod。确保以下命令中的 REVISION 值正确无误。

      kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod-REVISION -n istio-system --ignore-not-found=true
      
    7. 移除新版 IstioOperator 配置。

      kubectl delete IstioOperator installed-state-REVISION -n istio-system
      

      预期输出如下所示:

      istiooperator.install.istio.io "installed-state-REVISION" deleted
    8. 如果您未添加 --disable_canonical_service 标志,则脚本会启用规范化服务控制器。我们建议将其保持启用状态,但如果您需要停用,请参阅启用和停用规范化服务控制器

后续步骤