升级 Anthos Service Mesh

本页面介绍了如何:

  • 运行 asmcli 以便从 Anthos Service Mesh 或开源 Istio 1.9 or a 1.10 patch release 升级到 Anthos Service Mesh 1.10.6。不支持从更早版本升级。

  • 执行 Canary 升级,将工作负载迁移到新控制层面。

准备工作

开始之前,请确保执行以下操作:

控制层面自定义

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

证书授权机构

在升级过程中更改证书授权机构 (CA) 会导致停机。升级期间,mTLS 流量会中断,直到所有工作负载切换为使用具有新 CA 的新控制层面。

升级 Anthos Service Mesh

以下部分概述了如何升级 Anthos Service Mesh:

  1. 运行 asmcli install 以在单个集群上安装 Anthos Service Mesh。有关命令行示例,请参阅以下部分。这些示例同时包含可能必需的必需参数和可选参数。我们建议您始终指定 output_dir 参数,以便轻松找到示例网关和 istioctl 等工具。请在右侧的导航栏中查看示例列表。

  2. (可选)安装或升级入站流量网关

  3. 要完成 Anthos Service Mesh 的设置,您需要启用自动 Sidecar 注入并部署或重新部署工作负载

使用默认功能和 Mesh CA 升级

本部分介绍如何运行 asmcli 以使用默认平台支持的功能升级 Anthos Service Mesh,并启用 Anthos Service Mesh 证书授权机构 (Mesh CA) 作为证书授权。

GKE

运行以下命令以使用默认功能安装新控制平面。在提供的占位符中输入值。

./asmcli install \
  --project_id PROJECT_ID \
  --cluster_name CLUSTER_NAME \
  --cluster_location CLUSTER_LOCATION \
  --fleet_id FLEET_PROJECT_ID \
  --output_dir DIR_PATH \
  --enable_all \
  --ca mesh_ca
  • --project_id--cluster_name--cluster_location 指定集群所在的项目 ID、集群名称以及集群区域或地区。
  • --fleet_id队列宿主项目的项目 ID。如果您未包含此选项,则 asmcli 会使用注册集群时在其中创建集群的项目。
  • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
  • --enable_all 允许脚本执行以下操作:
    • 授予所需的 IAM 权限
    • 启用所需的 Google API。
    • 在集群上设置用于标识网格的标签。
    • 如果尚未注册集群,请注册集群
  • --ca mesh_ca将 Mesh CA 用作证书授权机构。在升级期间更改证书授权机构会导致停机。asmcli 将 Mesh CA 配置为使用机群工作负载身份

本地

  1. 将当前上下文设置为用户集群:

    kubectl config use-context CLUSTER_NAME
    
  2. 运行以下命令以使用默认功能安装新控制平面。在提供的占位符中输入值。

    ./asmcli install \
      --fleet_id FLEET_PROJECT_ID \
      --kubeconfig KUBECONFIG_FILE \
      --output_dir DIR_PATH \
      --platform multicloud \
      --enable_all \
      --ca mesh_ca
    
    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfigkubeconfig 文件 的路径。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定本地是平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群
    • --ca mesh_ca将 Mesh CA 用作证书授权机构。在升级期间更改证书授权机构会导致停机。asmcli 将 Mesh CA 配置为使用集群工作负载身份

使用 Istio CA 升级默认特性

本部分介绍如何运行 asmcli 以使用默认平台支持的功能升级 Anthos Service Mesh 并启用 Istio CA。

GKE

./asmcli install \
  --project_id PROJECT_ID \
  --cluster_name CLUSTER_NAME \
  --cluster_location CLUSTER_LOCATION \
  --fleet_id FLEET_PROJECT_ID \
  --output_dir DIR_PATH \
  --enable_all \
  --ca citadel
  • --project_id--cluster_name--cluster_location 指定集群所在的项目 ID、集群名称以及集群区域或地区。
  • --fleet_id队列宿主项目的项目 ID。如果您未包含此选项,则 asmcli 会使用注册集群时在其中创建集群的项目。
  • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
  • --enable_all 允许脚本执行以下操作:
    • 授予所需的 IAM 权限
    • 启用所需的 Google API。
    • 在集群上设置用于标识网格的标签。
    • 如果尚未注册集群,请注册集群
  • -ca citadel 使用 Istio CA。在升级期间更改证书授权机构会导致停机。

本地

  1. 将当前上下文设置为用户集群:

     kubectl config use-context CLUSTER_NAME
    
  2. 运行以下命令以安装具有默认功能和 Istio CA 的 Anthos Service Mesh:

     ./asmcli install \
       --fleet_id FLEET_PROJECT_ID \
       --kubeconfig KUBECONFIG_FILE \
       --output_dir DIR_PATH \
       --platform multicloud \
       --enable_all \
       --ca citadel \
    

    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfigkubeconfig 文件 的路径。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定本地是平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群

    • -ca citadel 使用 Istio CA。在升级过程中更改证书授权机构会导致停机。

使用可选功能升级

叠加文件是一个 YAML 文件,其中包含您传递给 asmcli 以配置控制层面的 IstioOperator 自定义资源 (CR)。您可以替换默认控制平面配置,并通过将 YAML 文件传递给 asmcli启用可选功能。您可以叠加多个文件,每个叠加文件会覆盖之前各层的配置。

GKE

运行以下命令以使用默认功能安装新控制平面。在提供的占位符中输入值。

./asmcli install \
  --project_id PROJECT_ID \
  --cluster_name CLUSTER_NAME \
  --cluster_location CLUSTER_LOCATION \
  --fleet_id FLEET_PROJECT_ID \
  --output_dir DIR_PATH \
  --enable_all \
  --ca mesh_ca \
  --custom_overlay OVERLAY_FILE
  • --project_id--cluster_name--cluster_location 指定集群所在的项目 ID、集群名称以及集群区域或地区。
  • --fleet_id队列宿主项目的项目 ID。如果您未包含此选项,则 asmcli 会使用注册集群时在其中创建集群的项目。
  • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
  • --enable_all 允许脚本执行以下操作:
    • 授予所需的 IAM 权限
    • 启用所需的 Google API。
    • 在集群上设置用于标识网格的标签。
    • 如果尚未注册集群,请注册集群
  • --ca mesh_ca将 Mesh CA 用作证书授权机构。在升级期间更改证书授权机构会导致停机。asmcli 将 Mesh CA 配置为使用机群工作负载身份
  • --custom_overlay 指定叠加文件的名称。

本地

  1. 将当前上下文设置为用户集群:

    kubectl config use-context CLUSTER_NAME
    
  2. 运行以下命令以使用默认功能安装新控制平面。在提供的占位符中输入值。

    ./asmcli install \
      --fleet_id FLEET_PROJECT_ID \
      --kubeconfig KUBECONFIG_FILE \
      --output_dir DIR_PATH \
      --platform multicloud \
      --enable_all \
      --ca mesh_ca \
      --custom_overlay OVERLAY_FILE
    
    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfigkubeconfig 文件 的路径。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定本地是平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群
    • --ca mesh_ca将 Mesh CA 用作证书授权机构。在升级期间更改证书授权机构会导致停机。asmcli 将 Mesh CA 配置为使用机群工作负载身份
    • --custom_overlay 指定叠加文件的名称。

升级网关

如果已部署网关,则还需要升级这些网关。如需进行简单升级,请按照安装和升级网关指南中的“就地升级”部分进行操作。

切换到新的控制层面

  1. 获取 istiod 上的修订版本标签。

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

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

    NAME                                             READY   STATUS    RESTARTS   AGE   REV
    istiod-asm-176-1-67998f4b55-lrzpz                1/1     Running   0          68m   asm-198-3
    istiod-asm-176-1-67998f4b55-r76kr                1/1     Running   0          68m   asm-198-3
    istiod-asm-182-2-5cd96f88f6-n7tj9                1/1     Running   0          27s   asm-1106-2
    istiod-asm-182-2-5cd96f88f6-wm68b                1/1     Running   0          27s   asm-1106-2
    1. 在输出中的 REV 列下,记下新版本的修订版标签的值。在此示例中,该值为 asm-1106-2

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

  2. 将修订版本标签添加到应用命名空间,并移除 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 标签。

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

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

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

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

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

    完成转换

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

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

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

      kubectl apply -f asm/istio/istiod-service.yaml
      
    3. 删除 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
      
    4. 移除旧版 IstioOperator 配置。

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

      预期输出如下所示:

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

    回滚

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

    1. 重新为您的命名空间添加标签,以启用旧版 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
    2. 确认命名空间上的修订版本标签与旧版 istiod 的修订版本标签一致:

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

      kubectl rollout restart deployment -n NAMESPACE
      
    4. 移除新版 istiod。确保以下命令中的 REVISION 值正确无误。

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

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

      预期输出如下所示:

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

    7. 如果您部署了网关,请务必更改命名空间或部署上的修订版本标签以匹配先前版本的 istiod。按照安装和升级网关指南中“就地升级”部分中所述的相同流程执行操作。