升级 Anthos Service Mesh

本页面介绍如何升级 Anthos Service Mesh。

平台管理员可以升级 Anthos Service Mesh。升级 Anthos Service Mesh 是基于修订版本的升级或 Canary 版升级,当您使用一小部分工作负载测试新版本时,新版本和先前版本的控制层面都将正常运行。此方法比就地升级更安全,因为新版本的控制层面会替换先前版本。

重新部署 Anthos Service Mesh 控制层面组件大约需要 5 到 10 分钟才能完成。您还必须将新 Sidecar 代理注入所有工作负载,以便这些 Sidecar 代理通过当前 Anthos Service Mesh 版本进行更新。更新 Sidecar 代理所需的时间大约为每分钟 100 个 Pod,但具体取决于多种因素,例如 Pod 的数量、节点数量、部署扩缩设置、Pod 中断预算和其他配置设置

前提条件

在升级之前,请确保满足以下条件:

  • 您有一个由管理员集群管理的目标用户集群。
  • 目标用户集群的现有 Anthos Service Mesh 安装有可用的升级。

查看现有安装

确认您的集群上是否已安装 Anthos Service Mesh。

控制台

在管理中心主控台中,转到服务网格菜单,查看安装了 Anthos Service Mesh 的集群列表。

API

您可以在管理员集群上找到以下用于描述当前 Anthos Service Mesh 安装的自定义资源:

  • ServiceMeshBinding 对象,该对象会将 ServiceMeshFeatureSpec 对象与您的用户集群的 ID 绑定。运行以下命令可找到该对象。由于此命令可能会返回多个对象,因此您必须在其规范中通过目标集群的 ID 找到该对象。

    KUBECONFIG=ADMIN_KUBECONFIG kubectl get servicemeshbinding -n anthos-management-center
    

    下面是一个该对象的内容示例:

    apiVersion: managementcenter.anthos.cloud.google.com/v1alpha1
    kind: ServiceMeshBinding
    metadata:
     name: service-mesh-binding-sample
     namespace: anthos-management-center
    spec:
     configs:
     - configRef:
         name: PREVIOUS_SERVICE_MESH_SPEC
         namespace: anthos-management-center
       placement:
         clusterIDs:
         - TARGET_CLUSTER_ID
    
  • ServiceMeshFeatureSpec 对象,用于定义 Anthos Service Mesh 安装的规范。以上示例中所述的 ServiceMeshBinding 对象的 config.configRef 字段中引用了该对象的命名空间和名称。运行以下命令可查看该对象。

    KUBECONFIG=ADMIN_KUBECONFIG kubectl get servicemeshfeaturespec PREVIOUS_SERVICE_MESH_SPEC -n anthos-management-center -o yaml
    

    下面是一个该对象的内容示例:

    apiVersion: managementcenter.anthos.cloud.google.com/v1alpha1
    kind: ServiceMeshFeatureSpec
    metadata:
     name:PREVIOUS_SERVICE_MESH_SPEC
     namespace: anthos-management-center
    spec:
     version: 1.7.3-asm.6
    

安装新版 Anthos Service Mesh

您可以使用管理中心控制台或 API 更新到较新版本的 Anthos Service Mesh。

控制台

  1. 在 Management Center Console 内,转到信息中心菜单。
  2. 点击升级标签以查看所有可用的升级。
  3. 点击要升级的集群对应的查看升级
  4. 在“可用升级”列表中,找到要升级到的目标 Anthos Service Mesh 版本,然后点击升级以打开“Anthos Service Mesh 升级”页面。 “可用升级”页面
  5. 确认目标版本的信息(例如版本、说明和版本说明的链接),然后点击继续
  6. 在弹出式对话框中,点击升级,开始在目标集群上安装 Anthos Service Mesh 的目标版本。
  7. 系统会打开服务网格页面,您可以在其中看到正在安装的目标版本。

API

在管理员集群上使用 kubectl 命令执行以下步骤,以安装新版 Anthos Service Mesh:

  1. 为新版本创建新的 ServiceMeshFeatureSpec 对象。以下是版本 1.8.3-asm.2 的示例对象:

    apiVersion: managementcenter.anthos.cloud.google.com/v1alpha1
    kind: ServiceMeshFeatureSpec
    metadata:
     name: NEW_SERVICE_MESH_SPEC
     namespace: anthos-management-center
    spec:
     version: 1.8.3-asm.2
    
  2. 更新现有 ServiceMeshBinding 对象以插入新条目,从而将新的 ServiceMeshFeatureSpec 与相应集群绑定:

     apiVersion: managementcenter.anthos.cloud.google.com/v1alpha1
     kind: ServiceMeshBinding
     metadata:
      name: service-mesh-binding-sample
      namespace: anthos-management-center
     spec:
      configs:
      - configRef:
          name: PREVIOUS_SERVICE_MESH_SPEC
          namespace: anthos-management-center
        placement:
          clusterIDs:
          - TARGET_CLUSTER_ID
      - configRef:
          name: NEW_SERVICE_MESH_SPEC
          namespace: anthos-management-center
        placement:
          clusterIDs:
          - TARGET_CLUSTER_ID
    
  3. 更新版本的 Anthos Service Mesh 将安装到管理员集群上。您可以使用以下命令检查安装是否已就绪:

     KUBECONFIG=ADMIN_KUBECONFIG kubectl get servicemeshbinding -n anthos-management-center -o jsonpath="{range .items[*].status.bindingItemStatuses[*]}{'\n'}{['clusterID', 'configRef', 'conditions']}" | grep NEW_SERVICE_MESH_SPEC | grep TARGET_CLUSTER_ID
    

    TARGET_CLUSTER_IDNEW_SERVICE_MESH_SPEC 替换为 ServiceMeshBinding 对象中配置的值。

    以下是输出示例:

    target-user-cluster-1 {"name":"new-spec-q64x7","namespace":"anthos-management-center"} [{"lastTransitionTime":"2021-05-27T18:06:27Z","message":"","observedGeneration":1,"reason":"Healthy","status":"True","type":"Ready"}]
    

    Ready 条件的 status: true 表示安装完成。

先前版本的 Anthos Service Mesh 不会自动移除。您必须手动将工作负载迁移到新版 Anthos Service Mesh,然后卸载先前版本。

迁移工作负载

在用户集群上执行以下步骤以迁移工作负载:

  1. 获取先前版本和新版本的 Anthos Service Mesh 的修订版本标签。如需找到这些值,请执行以下操作:

    控制台

    1. 在管理中心控制台内,转到服务网格菜单。
    2. 在集群列表中,从相应集群的“修订版本”列中找到修订版本标签。

    API

    运行以下命令:

     KUBECONFIG=USER_KUBECONFIG kubectl get pod -n istio-system -l app=istiod -L istio.io/rev
    

    以下是输出示例:

    NAME                                READY   STATUS    RESTARTS   AGE   REV
    istiod-asm-173-6-756d989c58-p84b9   1/1     Running   0          13h   asm-173-6
    istiod-asm-173-6-756d989c58-t6vh8   1/1     Running   0          13h   asm-173-6
    istiod-asm-183-2-76f64c6bc7-2qnxq   1/1     Running   0          17h   asm-183-2
    istiod-asm-183-2-76f64c6bc7-8nrpz   1/1     Running   0          17h   asm-183-2
    

    在输出中,修订版本标签位于 REV 列下。在此示例中,该值为 asm-183-2。此标签稍后将用于为新 Anthos Service Mesh 版本触发 Sidecar 注入。

  2. 将修订版本标签添加到命名空间。在以下命令中,将 REVISION 更改为与新版 Anthos Service Mesh 的修订版本标签匹配的值。

    KUBECONFIG=USER_KUBECONFIG kubectl label namespace NAMESPACE istio.io/rev=REVISION istio-injection- --overwrite
    
  3. 重启工作负载以触发重新注入,例如在命名空间中重启所有部署:

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

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

  6. 如果在其他命名空间中存在工作负载,请重复第 2 步到第 5 步为命名空间加标签,并重启工作负载。

删除旧版 Anthos Service Mesh

如果您的应用按预期工作,您可以使用管理中心或 API 卸载先前版本的 Anthos Service Mesh。

控制台

  1. 在管理中心控制台内,转到服务网格菜单。
  2. 版本列中,点击先前版本的 Anthos Service Mesh 的链接。
  3. 修改 Service Mesh页面上,点击移除 Service Mesh
  4. 在删除前,系统会弹出一个对话框,显示置信度检查结果。该对话框通过检查命名空间和 Pod 上的 istio.io/rev 标签,列出了仍然依赖于旧版 Anthos Service Mesh 的所有命名空间和 Pod。如果检查发现任何依赖项,则无法继续操作,除非迁移这些 Pod 或命名空间。
  5. 如果置信度检查通过,请点击移除以开始在目标集群上卸载 Anthos Service Mesh。

提交删除请求后,系统会打开“服务网格”页面,并且不再显示旧版 Anthos Service Mesh。卸载先前的 Anthos Service Mesh 资源的能需要几分钟才能完成。

API

  1. 在删除先前版本的 Anthos Service Mesh 之前,请验证确保没有任何 Pod 或命名空间依赖于该版本的 Anthos Service Mesh。

    1. 运行以下命令以验证命名空间依赖项。

      KUBECONFIG=USER_KUBECONFIG kubectl get namespace -l istio.io/rev=PREVIOUS_REVISION  
      

      PREVIOUS_REVISION 替换为先前版本的 Anthos Service Mesh 的修订版本标签。

    2. 运行以下命令以验证 Pod 依赖项。

      KUBECONFIG=USER_KUBECONFIG kubectl get pod -l istio.io/rev=PREVIOUS_REVISION --field-selector metadata.namespace!=istio-system --all-namespaces
      

    如果查询返回空结果,请继续执行下一步。否则,请先迁移工作负载,然后再继续操作。

  2. 更新管理员集群上的 ServiceMeshBinding 对象以解除先前的特征规范与目标集群的绑定。下面是移除 PREVIOUS_SERVICE_MESH_SPEC 条目后的一个 ServiceMeshBinding 对象示例:

    apiVersion: managementcenter.anthos.cloud.google.com/v1alpha1
    kind: ServiceMeshBinding
    metadata:
     name: service-mesh-binding-sample
     namespace: anthos-management-center
    spec:
     configs:
     - configRef:
         name: NEW_SERVICE_MESH_SPEC
         namespace: anthos-management-center
       placement:
         clusterIDs:
         -  TARGET_CLUSTER_ID
    
  3. 更新 ServiceMeshBinding 后,系统将开始移除先前版本的 Anthos Service Mesh。卸载可能需要几分钟才能完成。运行以下命令以验证先前版本是否已移除。

    KUBECONFIG=USER_KUBECONFIG kubectl get deployment -n istio-system -l istio.io/rev=PREVIOUS_REVISION
    

    如果卸载完成,此命令将返回空结果。