升级 Anthos Service Mesh

本页面介绍了如何:

  • 运行 asmcli,以便从 Anthos Service Mesh 升级到 Anthos Service Mesh 1.11.8。

  • (可选)部署入站流量网关。

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

您可以从哪些 Anthos Service Mesh 版本升级因平台而异。

GKE

在 Google Kubernetes Engine 上,您可以直接从以下版本升级到 Anthos Service Mesh 1.11.8-asm.4:

1.9 和 1.10

本地

在 GKE on VMware 和 Google Distributed Cloud Virtual for Bare Metal 上,您可以直接从以下版本升级到 Anthos Service Mesh 1.11.8-asm.4:

1.10

GKE on AWS

在 GKE on AWS 上,您可以直接从以下版本升级到 Anthos Service Mesh 1.11.8-asm.4:

1.10

Amazon EKS

如果您在 EKS 上安装了 Anthos Service Mesh 1.7,则需要在新集群上安装 Anthos Service Mesh 1.11。不支持从 Anthos Service Mesh 1.7 升级到 Anthos Service Mesh 1.11。

准备工作

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

控制层面自定义

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

证书授权机构

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

升级 Anthos Service Mesh

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

  1. 如果要升级 GKE 上使用 Anthos Service Mesh 证书授权机构 (Mesh CA) 的多集群网格,请运行 asmcli create-mesh 将多集群网格配置为信任舰队工作负载身份,以便在升级时跨集群负载均衡无需停机。

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

  3. (可选)安装或升级入站流量网关。默认情况下,asmcli 不会安装 istio-ingressgateway。我们建议您单独部署和管理控制平面和网关。如果您需要让默认 istio-ingressgateway 随集群内控制平面安装,请添加 --option legacy-default-ingressgateway 参数。

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

将多集群网格配置为信任舰队工作负载身份

如果要升级 GKE 上使用 Mesh CA 作为证书授权机构的多集群网格,则需要先运行 asmcli create-mesh,然后再升级每个集群。此命令将 Mesh CA 配置为在升级后使用舰队工作负载身份池 FLEET_PROJECT_ID.svc.id.goog 作为信任网域。asmcli create-mesh 命令会执行以下操作:

  • 将所有集群注册到同一舰队。
  • 将网格配置为信任舰队工作负载身份。
  • 创建远程 Secret。

您可以指定每个集群的 URI 或 kubeconfig 文件的路径。

集群 URI

在以下命令中,将 FLEET_PROJECT_ID 替换为舰队宿主项目的项目 ID,将集群 URI 替换为每个集群的集群名称、可用区或区域以及项目 ID。

./asmcli create-mesh \
    FLEET_PROJECT_ID \
    PROJECT_ID_1/CLUSTER_LOCATION_1/CLUSTER_NAME_1 \
    PROJECT_ID_2/CLUSTER_LOCATION_2/CLUSTER_NAME_2 # \
    # Add a line for each cluster in the mesh

kubeconfig 文件

在以下命令中,将 FLEET_PROJECT_ID 替换为舰队宿主项目的项目 ID,将 PATH_TO_KUBECONFIG 替换为每个 kubeconfig 文件的路径。

./asmcli create-mesh \
    FLEET_PROJECT_ID \
    PATH_TO_KUBECONFIG_1 \
    PATH_TO_KUBECONFIG_2 # \
    # Add a line for each cluster in the mesh

使用默认功能和 Mesh CA 升级

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

GKE

运行以下命令以使用默认功能和 Mesh CA 升级控制层面。在提供的占位符中输入值。

./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 配置为使用机群工作负载身份

本地

在 GKE on VMware 或 Google Distributed Cloud Virtual for Bare Metal 上运行以下命令,以使用默认功能和 Mesh CA 升级控制平面。在提供的占位符中输入值。

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

    kubectl config use-context CLUSTER_NAME
    
  2. 运行 asmcli install

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

使用 Istio CA 升级默认特性

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

GKE

运行以下命令以使用默认功能和 Istio CA 升级控制层面。在提供的占位符中输入值。

./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。在升级期间更改证书授权机构会导致停机。

本地

在 GKE on VMware 或 Google Distributed Cloud Virtual for Bare Metal 上运行以下命令,以使用默认功能和 Istio CA 升级控制平面。在提供的占位符中输入值。

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

    kubectl config use-context CLUSTER_NAME
    
  2. 运行 asmcli install

    ./asmcli install \
      --fleet_id FLEET_PROJECT_ID \
      --kubeconfig KUBECONFIG_FILE \
      --output_dir DIR_PATH \
      --platform multicloud \
      --enable_all \
      --ca citadel \
      --ca_cert FILE_PATH \
      --ca_key FILE_PATH \
      --root_cert FILE_PATH \
      --cert_chain FILE_PATH
    
    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfig kubeconfig 文件的完整路径。环境变量 $PWD 不适用于此处。 此外,使用“~”的相对 kubeconfig 文件位置将不起作用。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定平台是非 Google Cloud 平台,例如本地平台或多云平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群
    • -ca citadel将 Istio CA 用作证书授权机构。
    • --ca_cert:中间证书
    • --ca_key:中间证书的密钥
    • --root_cert:根证书
    • --cert_chain:证书链

AWS

在 GKE on AWS 上运行以下命令,以使用默认功能和 Istio CA 升级控制平面。在提供的占位符中输入值。您可以选择为公共子网或专用子网启用 Ingress。

公开

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

    kubectl config use-context CLUSTER_NAME
    
  2. 运行 asmcli install

    ./asmcli install \
      --fleet_id FLEET_PROJECT_ID \
      --kubeconfig KUBECONFIG_FILE \
      --output_dir DIR_PATH \
      --platform multicloud \
      --enable_all \
      --ca citadel \
      --ca_cert FILE_PATH \
      --ca_key FILE_PATH \
      --root_cert FILE_PATH \
      --cert_chain FILE_PATH
    
    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfig kubeconfig 文件的完整路径。环境变量 $PWD 不适用于此处。 此外,使用“~”的相对 kubeconfig 文件位置将不起作用。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定平台是非 Google Cloud 平台,例如本地平台或多云平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群
    • -ca citadel将 Istio CA 用作证书授权机构。
    • --ca_cert:中间证书
    • --ca_key:中间证书的密钥
    • --root_cert:根证书
    • --cert_chain:证书链

专用

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

    kubectl config use-context CLUSTER_NAME
    
  2. 将以下 YAML 保存到名为 istio-operator-internal-lb.yaml 的文件:

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      components:
        ingressGateways:
        - enabled: true
          k8s:
            serviceAnnotations:
              service.beta.kubernetes.io/aws-load-balancer-internal: "true"
          name: istio-ingressgateway
    
  3. 运行 asmcli install

    ./asmcli install \
      --fleet_id FLEET_PROJECT_ID \
      --kubeconfig KUBECONFIG_FILE \
      --output_dir DIR_PATH \
      --platform multicloud \
      --enable_all \
      --ca citadel \
      --ca_cert FILE_PATH \
      --ca_key FILE_PATH \
      --root_cert FILE_PATH \
      --cert_chain FILE_PATH
      --custom_overlay istio-operator-internal-lb.yaml
    
    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfig kubeconfig 文件的完整路径。环境变量 $PWD 不适用于此处。 此外,使用“~”的相对 kubeconfig 文件位置将不起作用。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定平台是非 Google Cloud 平台,例如本地平台或多云平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群
    • -ca citadel将 Istio CA 用作证书授权机构。
    • --ca_cert:中间证书
    • --ca_key:中间证书的密钥
    • --root_cert:根证书
    • --cert_chain:证书链

Amazon EKS

在 Amazon EKS 上运行以下命令,以使用默认功能和 Istio CA 升级控制层面。在提供的占位符中输入值。

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

    kubectl config use-context CLUSTER_NAME
    
  2. 运行 asmcli install

    ./asmcli install \
      --fleet_id FLEET_PROJECT_ID \
      --kubeconfig KUBECONFIG_FILE \
      --output_dir DIR_PATH \
      --platform multicloud \
      --enable_all \
      --ca citadel \
      --ca_cert FILE_PATH \
      --ca_key FILE_PATH \
      --root_cert FILE_PATH \
      --cert_chain FILE_PATH
    
    • --fleet_id队列宿主项目的项目 ID。
    • --kubeconfig kubeconfig 文件的完整路径。环境变量 $PWD 不适用于此处。 此外,使用“~”的相对 kubeconfig 文件位置将不起作用。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定平台是非 Google Cloud 平台,例如本地平台或多云平台。
    • --enable_all 允许脚本执行以下操作:
      • 授予所需的 IAM 权限
      • 启用所需的 Google API。
      • 在集群上设置用于标识网格的标签。
      • 如果尚未注册集群,请注册集群
    • -ca citadel将 Istio CA 用作证书授权机构。
    • --ca_cert:中间证书
    • --ca_key:中间证书的密钥
    • --root_cert:根证书
    • --cert_chain:证书链

使用可选功能升级

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

GKE

运行以下命令以使用可选功能安装控制层面。如需添加多个文件,请指定 --custom_overlay 和文件名,例如:--custom_overlayoverlay_file1.yaml --custom_overlay overlay_file2.yaml --custom_overlay overlay_file3.yaml。在提供的占位符中输入值。

./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 指定叠加文件的名称。

Google Cloud 外部

在 GKE on VMware、Google Distributed Cloud Virtual for Bare Metal、GKE on AWS 或 Amazon EKS 上运行以下命令。在提供的占位符中输入值。

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

    kubectl config use-context CLUSTER_NAME
    
  2. 运行 asmcli install

    ./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。
    • --kubeconfig kubeconfig 文件的完整路径。环境变量 $PWD 不适用于此处。 此外,使用“~”的相对 kubeconfig 文件位置将不起作用。
    • --output_dir添加此选项可指定 asmcli 在其中下载 anthos-service-mesh 软件包并提取安装文件的目录,其中包含 istioctl、示例和清单。否则,asmcli 会将文件下载到 tmp 目录。您可以指定相对路径或完整路径。环境变量 $PWD 不适用于此处。
    • --platform multicloud 指定平台是非 Google Cloud 平台,例如本地平台或多云平台。
    • --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-1107-1
    istiod-asm-176-1-67998f4b55-r76kr                1/1     Running   0          68m   asm-1107-1
    istiod-asm-182-2-5cd96f88f6-n7tj9                1/1     Running   0          27s   asm-1118-4
    istiod-asm-182-2-5cd96f88f6-wm68b                1/1     Running   0          27s   asm-1118-4
    1. 在输出中的 REV 列下,记下新版本的修订版标签的值。在此示例中,该值为 asm-1118-4

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

  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. 测试您的应用,验证工作负载是否正常工作。

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

  6. 如果您确信应用按预期正常运行,请继续执行转换到新版 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 标志,则 asmcli 会启用规范化服务控制器。我们建议将其保持启用状态,但如果您需要停用,请参阅启用和停用规范化服务控制器

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

部署和重新部署工作负载

您需要启用自动边车代理注入(自动注入),才能完成安装(或升级)。从 OSS Istio 迁移和升级遵循基于修订版本的升级流程(在 Istio 文档中称为“Canary 升级”)。使用基于修订版本的升级时,新版本的控制平面会与现有控制平面一起安装。然后,您可以将一部分工作负载迁移到新版本,这样,您就可以先通过一小部分工作负载监控升级的影响,然后再将所有流量迁移到新版本。

该脚本在 istiod 上设置格式为 istio.io/rev=asm-1118-4修订版本标签。要启用自动注入,请向一个或多个命名空间添加匹配的修订版本标签。Sidecar 注入器网络钩子会使用修订版本标签将注入的 Sidecar 与特定 istiod 修订版本相关联。添加标签后,重启命名空间中的 pod 以注入 Sidecar。

  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-1118-4
    istio-ingressgateway-asm-182-2-8b5fc8767-hn4w2   1/1     Running   0          20s   asm-1118-4
    istiod-asm-176-1-67998f4b55-lrzpz                1/1     Running   0          68m   asm-1107-1
    istiod-asm-176-1-67998f4b55-r76kr                1/1     Running   0          68m   asm-1107-1
    istiod-asm-182-2-5cd96f88f6-n7tj9                1/1     Running   0          27s   asm-1118-4
    istiod-asm-182-2-5cd96f88f6-wm68b                1/1     Running   0          27s   asm-1118-4
    1. 在输出中的 REV 列下,记下新版本的修订版标签的值。在此示例中,该值为 asm-1118-4

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

  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. 测试您的应用,验证工作负载是否正常工作。

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

  6. 如果您确信应用按预期正常运行,请继续执行转换到新版 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 标志,则脚本会启用规范化服务控制器。我们建议将其保持启用状态,但如果您需要停用,请参阅启用和停用规范化服务控制器