卸载托管式 Cloud Service Mesh

本页面介绍了如何卸载托管式 Cloud Service Mesh。如果您要卸载集群内 Cloud Service Mesh,请改为按照集群内卸载指南进行操作。

如果您使用的是已预配多个控制平面的旧版设置,则按照这些说明操作会移除所有已预配的控制平面。

不支持卸载由 asmcli 管理的控制平面,但支持卸载具有 asmcli --managed 或网格 API 管理的控制平面的集群。如果您不确定控制平面,请运行以下命令:

kubectl get controlplanerevisions -n istio-system -l 'app.kubernetes.io/created-by!=asmcli'

如果输出中列出了任何项,则支持卸载。

卸载 Cloud Service Mesh

使用以下命令卸载所有 Cloud Service Mesh 组件。

  1. 为防止应用流量中断,请执行以下操作:

    • 将任何 STRICT mTLS 政策降级为 PERMISSIVE。
    • 移除任何可能阻止流量的 AuthorizationPolicy。
  2. 如果您要卸载的集群上有任何其他集群正在运行端点发现,请停用多集群。

    kubectl patch configmap/asm-options -n istio-system --type merge -p '{"data":{"multicluster_mode":"manual"}}'
    
  3. 查找需要清理的 Secret,然后将其删除:

    kubectl get secrets -n istio-system -l istio/multiCluster=true
    
    kubectl delete secret SECRET_NAME
    

    其中,SECRET_NAME 是 Secret 的名称。针对列出的每个 Secret 重复此步骤。

  4. 在您的命名空间中停用 Sidecar 自动注入功能(如果已启用)。运行以下命令以显示命名空间标签:

     kubectl get namespace YOUR_NAMESPACE --show-labels
    

    输出类似于以下内容:

     NAME   STATUS   AGE     LABELS
     demo   Active   4d17h   istio.io/rev=asm-181-5

    1. 如果您在 LABELS 列下方的输出中看到 istio.io/rev=,请将其移除:

       kubectl label namespace YOUR_NAMESPACE istio.io/rev-
      
    2. 如果您在 LABELS 列下方的输出中看到 istio-injection,请将其移除:

       kubectl label namespace YOUR_NAMESPACE istio-injection-
      
    3. 如果没有看到 istio.io/revistio-injection 标签,则表示命名空间未启用自动注入功能。

  5. 重启已注入 Sidecar 的工作负载以移除代理。

  6. 验证是否没有代理连接到代管式控制平面:

      kubectl get pods --all-namespaces -o json | jq -r '
      .items[] |
      select(
         .spec.containers[].env[]? |
         select(.name == "PROXY_CONFIG" and (.value | contains("\"discoveryAddress\":\"meshconfig.googleapis.com:443\"")))
      ) |
      "\(.metadata.namespace)\t\(.metadata.name)"
      '
    
  7. 将网格功能成员资格规范管理更新为 not-installed

     gcloud alpha container fleet mesh update \
       --project FLEET_PROJECT_ID \
       --memberships MEMBERSHIP_NAME \
       --location MEMBERSHIP_LOCATION \
       --management not-installed
    

    替换以下内容:

    • MEMBERSHIP_NAME 是您在验证集群是否已注册到舰队时列出的成员资格名称。
    • MEMBERSHIP_LOCATION 是您的成员资格的位置(区域或 global)。
  8. 验证控制平面的网状网络功能成员资格状态是否为 DISABLED

    gcloud container fleet mesh describe --project FLEET_PROJECT_ID
    

    输出类似于以下内容:

     servicemesh:
       controlPlaneManagement:
         details:
         - code: DISABLED
           details: Control Plane Management is not enabled.
         state: DISABLED
       dataPlaneManagement:
         details:
         - code: DISABLED
           details: Data Plane Management is not enabled.
         state: DISABLED
     state:
       description: 'Please see https://cloud.google.com/service-mesh/docs/install for instructions to onboard to Anthos Service Mesh.'
    ...
    

    如果控制平面状态为 DEPROVISIONING,请在几分钟后再次检查。

    1. 如果控制平面状态为 STALLED,则由于内部错误情况,卸载操作被阻止。如果问题仍然存在,请与支持团队联系
  9. (可选)移除 Istio CR、Istio CRD、istio-(修订版本) configmap、asm-options configmap 和 istio-system 命名空间,以从集群中移除服务网格,或在另一个与 Istio API 兼容的服务网格中使用它们。

    1. 移除 Istio CR:

      kubectl delete gateways,virtualservices,destinationrules,serviceentries,envoyfilters,sidecars,peerauthentications,requestauthentications,authorizationpolicies,telemetries,wasmplugins,proxyconfigs --all --all-namespaces
      
    2. 移除 Istio CRD:

      kubectl get crds -o name | grep --color=never 'istio.io' | xargs kubectl delete
      
    3. 移除 istio-(修订版本) configmap。如果您删除 istio-system 命名空间,则可以跳过此步骤。

      kubectl delete configmap istio-RELEASE_CHANNEL -n istio-system
      

      RELEASE_CHANNEL 替换为您的发布渠道(asm-managedasm-managed-stableasm-managed-rapid)。

    4. 移除 asm-options configmap:

      kubectl delete configmap asm-options -n istio-system
      
    5. 移除 istio-system 命名空间:

      kubectl delete namespace istio-system --ignore-not-found=true
      
    6. 检查删除操作是否成功:

      kubectl get ns
      

      输出应指示 Terminating 状态并返回所示内容,否则您可能需要手动删除命名空间中的其余资源并重试。

      NAME                 STATUS       AGE
      istio-system         Terminating  71m
      
  10. 如果您使用的是 Certificate Authority Service,请清理在为托管式 Cloud Service Mesh 配置 Certificate Authority Service 时创建的权限和 CA 池。

  11. 如果您启用了托管式 Cloud Service Mesh 舰队默认配置,并希望为未来的集群停用该配置,请将其停用。如果仅从单个集群中卸载,您可以跳过此步骤。

     gcloud container hub mesh disable --fleet-default-member-config --project FLEET_PROJECT_ID
    

    其中,FLEET_PROJECT_ID 是舰队宿主项目的 ID。

  12. 如果您计划在舰队级别停止使用 Cloud Service Mesh,请为舰队宿主项目停用服务网格功能。

     gcloud container hub mesh disable --project FLEET_PROJECT_ID
    

    其中,FLEET_PROJECT_ID 是舰队宿主项目的 ID。

完成这些步骤后,系统会从集群中系统地移除所有 Cloud Service Mesh 组件,包括代理、证书授权机构以及 RBAC 角色和绑定。在安装过程中,Google 拥有的服务账号会被授予在集群中建立服务网格资源所需的权限。这些卸载说明不会撤消这些权限,以便日后顺利重新激活 Cloud Service Mesh。