卸载 Cloud Service Mesh

本页面介绍了如何卸载 Cloud Service Mesh(如果您使用的是 Istio API)。如果您使用的是 Compute Engine API,则无需执行任何步骤。如需了解两者之间的差异,请参阅 Cloud Service Mesh 概览

卸载 Cloud Service Mesh

使用以下命令卸载所有 Cloud Service Mesh 组件。这些命令还会删除 istio-system 命名空间和所有自定义资源定义 (CRD),包括您应用的所有 CRD。

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

    • 将任何 STRICT mTLS 政策降级为 PERMISSIVE。
    • 移除任何可能阻止流量的 AuthorizationPolicy。
  2. 对此集群停用自动管理(无论您是直接应用还是使用舰队默认配置):

      gcloud container fleet mesh update \
         --management manual \
         --memberships MEMBERSHIP_NAME \
         --project FLEET_PROJECT_ID \
         --location MEMBERSHIP_LOCATION
    

    请替换以下内容:

    • MEMBERSHIP_NAME 是您在验证集群是否已注册到舰队时列出的成员资格名称。
    • MEMBERSHIP_LOCATION 是您的会员资格的位置(区域或 global)。
  3. 在您的命名空间中停用 Sidecar 自动注入功能(如果已启用)。运行以下命令以显示命名空间标签:

     kubectl get namespace YOUR_NAMESPACE --show-labels
    

    输出类似于以下内容:

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

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

     kubectl label namespace YOUR_NAMESPACE istio.io/rev-
    

    如果您在 LABELS 列下方的输出中看到 istio-injection,请将其移除:

     kubectl label namespace YOUR_NAMESPACE istio-injection-
    

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

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

  5. 如果您使用的是代管式 Cloud Service Mesh,请检查您的集群中有哪些控制平面实现,这将有助于在后续步骤中删除相关资源。

  6. 如果您使用的是托管式 Cloud Service Mesh,请移除集群中的所有 controlplanerevision 资源:

    kubectl delete controlplanerevision asm-managed asm-managed-rapid asm-managed-stable -n istio-system --ignore-not-found=true
    
  7. 从集群中删除网络钩子(如果存在)。

    集群内 Cloud Service Mesh

    删除 validatingwebhooksconfigurationmutatingwebhookconfiguration

    kubectl delete validatingwebhookconfiguration,mutatingwebhookconfiguration -l operator.istio.io/component=Pilot
    

    代管式 Cloud 服务网格

    A. 删除 validatingwebhooksconfiguration

    kubectl delete validatingwebhookconfiguration istiod-istio-system-mcp
    

    B. 删除所有mutatingwebhookconfiguration

    kubectl delete mutatingwebhookconfiguration istiod-RELEASE_CHANNEL
    
  8. 一旦所有工作负载都启动并且未观察到任何代理,您就可以安全地删除集群内控制平面以停止计费。

    如需移除集群内控制平面,请运行以下命令:

    istioctl x uninstall --purge
    

    如果没有其他控制平面,您可以删除 istio-system 命名空间,以清除所有 Cloud Service Mesh 资源。否则,请删除与 Cloud Service Mesh 修订版本对应的服务。这样可以避免删除 CRD 等共享资源。

  9. 删除 istio-systemasm-system 命名空间:

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

     kubectl get ns
    

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

     NAME                 STATUS       AGE
     istio-system         Terminating  71m
     asm-system           Terminating  71m
    
  11. 如果您要删除集群或已经删除集群,请确保从舰队中取消注册每个集群。

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

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

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

  13. 如果您启用了代管式 Cloud Service Mesh,请检查并删除存在的代管式资源:

    1. 删除 mdp-controller 部署:

        kubectl delete deployment mdp-controller -n kube-system
      
    2. 如果您有 TRAFFIC_DIRECTOR 控制平面实现,请清理透明健康检查资源。通常,系统会自动移除这些来源,但您可以通过执行以下操作来确保将其清理干净:

      1. 删除 snk Daemonset。

           kubectl delete daemonset snk -n kube-system
        
      2. 删除防火墙规则。

           gcloud compute firewall-rules delete gke-csm-thc-FIRST_8_CHARS_OF_CLUSTER_ID
        

        请替换以下内容:

        • FIRST_8_CHARS_OF_CLUSTER_ID 是特定集群的集群 ID 的前 8 个字符。
    3. 检查是否存在 istio-cni-plugin-config configmap:

        kubectl get configmap istio-cni-plugin-config -n kube-system
      

      删除 istio-cni-plugin-config configmap(如果存在):

        kubectl delete configmap istio-cni-plugin-config -n kube-system
      
    4. 删除 istio-cni-node DaemonSet:

        kubectl delete daemonset istio-cni-node -n kube-system
      
  14. 如果您要卸载代管式 Cloud Service Mesh 并且保留了集群,请与支持团队联系,以确保所有 Google Cloud 资源均已清理。如果您不执行此步骤,系统也可能会继续重新创建 istio-system 命名空间和 ConfigMap。

完成这些步骤后,系统会从集群中移除所有 Cloud Service Mesh 组件,包括代理、集群内证书授权机构以及 RBAC 角色和绑定。在安装过程中,Google 拥有的服务帐号会被授予在集群中建立服务网格资源的必要权限。这些卸载说明不会撤消这些权限,因此您可以在将来无缝重新激活 Cloud Service Mesh。