在 GKE 上预配托管式 Cloud Service Mesh 控制平面

Cloud Service Mesh 是由 Google 代管式服务网格,启用后便可使用。Google 会为您处理可靠性、升级、伸缩和安全性问题。

本页介绍了如何使用 fleet API 使用 Istio API 设置托管式 Cloud Service Mesh。

前提条件

首先,本指南假定您已完成以下操作:

使用要求

  • 一个或多个在受支持的 GKE 版本中具有受支持区域的集群。
  • 请注意,托管式 Cloud Service Mesh 使用 GKE 版本渠道来平衡稳定性和升级速度。对 Cloud Service Mesh 集群内组件(包括 CNI、MDPC、代理和 Istio CRD)所做的新更改将首先面向订阅了 GKE 快速渠道的集群发布。然后,如果这些版本表现出足够的稳定性,便会被提升到 GKE 常规渠道,最后再提升到 GKE 稳定渠道。

    • 代管式 Cloud Service Mesh 不支持安全地更改 GKE 版本渠道。
    • 如果您确实更改了 GKE 发布渠道,Cloud Service Mesh 会自动升级/降级集群内组件(CNI、MDPC、默认注入的代理版本和 Istio CRD),以与当前的 GKE 发布渠道保持一致。
  • 确保集群有足够的容量来容纳代管式 Cloud Service Mesh 在集群中安装的所需组件。

    • kube-system 命名空间中的 mdp-controller 部署请求 cpu:50m,内存:128Mi。
    • kube-system 命名空间中的 istio-cni-node 守护进程集在每个节点上请求 cpu:100m,内存:100Mi。
  • 确保已停用组织政策 constraints/compute.disableInternetNetworkEndpointGroup。如果此政策处于启用状态,ServiceEntry 可能无法正常运行。

  • 确保从中预配代管式 Cloud Service Mesh 的客户端机器与 API 服务器之间有网络连接。

  • 集群必须注册到舰队。此操作包含在说明中,也可以在预配之前单独完成。

  • 您的项目必须启用服务网格的舰队功能。此操作包含在说明中,也可以单独完成。

  • 只有 GKE 1.21.3 及更高版本支持 GKE Autopilot。

  • Cloud Service Mesh 可以在单项目单网络或多项目单网络环境中使用多个 GKE 集群。

    • 如果您要加入的集群不在同一个项目中,则它们必须向同一舰队宿主项目注册,并且这些集群必须位于同一网络的共享 VPC配置中。
    • 对于单项目多集群环境,舰队项目可以与集群项目相同。如需详细了解舰队,请参阅舰队概览
    • 对于多项目环境,我们建议您将舰队托管在与集群项目不同的项目中。如果您的组织政策和现有配置允许,我们建议您将共享 VPC 项目用作舰队宿主项目。如需了解详情,请参阅通过共享 VPC 设置集群

安装 Cloud Service Mesh 所需的角色

下表介绍了安装代管式 Cloud Service Mesh 所需的角色。

角色名称 角色 ID 授予位置 说明
GKE Hub Admin roles/gkehub.admin 舰队项目 拥有对 GKE Hub 及相关资源的完全访问权限。
Service Usage Admin roles/serviceusage.serviceUsageAdmin 舰队项目 可启用、停用和检查使用方项目的服务状态、检查该项目的操作,以及使用其配额和结算服务。 (注意 1)
CA Service Admin Beta 版 roles/privateca.admin 舰队项目 具有对所有 CA 服务资源的完整访问权限。 (注意 2)

限制

我们建议您查看 Cloud Service Mesh 支持的功能和限制列表。请特别注意以下几点:

  • 不支持 IstioOperator API,因为它的主要目的是控制集群组件。

  • 使用 Certificate Authority Service (CA Service) 需要为每个集群配置 Cloud Service Mesh,并且在 GKE Enterprise 中使用舰队默认配置时不受支持。

  • 对于 GKE Autopilot 集群,只有 GKE 1.23 或更高版本支持跨项目设置。

  • 对于 GKE Autopilot 集群,为了适应 GKE Autopilot 资源限制,默认代理资源请求和限制设置为 500m CPU 和 512 Mb 内存。您可以使用自定义注入替换默认值。

  • 在代管式控制平面的预配过程中,Istio CRD 将预配在指定集群中。如果集群中已有 Istio CRD,则它们将会被覆盖。

  • Istio CNI 和 Cloud Service Mesh 与 GKE Sandbox 不兼容。因此,采用 TRAFFIC_DIRECTOR 实现的托管式 Cloud Service Mesh 不支持启用了 GKE Sandbox 的集群。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 配置 gcloud(即使您使用的是 Cloud Shell)。
    1. 使用 Google Cloud CLI 进行身份验证,其中 FLEET_PROJECT_ID 是您的舰队宿主项目的 ID。通常,系统会默认创建 FLEET_PROJECT_ID,并且其名称与项目相同。

             gcloud auth login --project FLEET_PROJECT_ID
      

    2. 更新组件:

             gcloud components update
      

  7. 在舰队宿主项目中启用所需的 API:

      gcloud services enable mesh.googleapis.com \
          --project=FLEET_PROJECT_ID
    

  8. 启用 mesh.googleapis.com 会启用以下 API:

    API 用途 是否可以停用
    meshconfig.googleapis.com Cloud Service Mesh 使用 Mesh Configuration API 将配置数据从网格中继到 Google Cloud。此外,启用 Mesh Configuration API 后,您可以访问 Google Cloud 控制台中的 Cloud Service Mesh 页面以及使用 Cloud Service Mesh 证书授权机构。
    meshca.googleapis.com 与托管式 Cloud Service Mesh 使用的 Cloud Service Mesh 证书授权机构相关。
    container.googleapis.com 必须启用此 API 才能创建 Google Kubernetes Engine (GKE) 集群。
    gkehub.googleapis.com 必须启用此 API 才能以舰队形式管理网格。
    monitoring.googleapis.com 必须启用此 API 才能捕获网格工作负载的遥测数据。
    stackdriver.googleapis.com 必须启用此 API 才能使用服务界面。
    opsconfigmonitoring.googleapis.com 必须启用此 API 才能将服务界面用于 Google Cloud 外部的集群。
    connectgateway.googleapis.com 此 API 是必需的,以便托管式 Cloud Service Mesh 控制平面可以访问网格工作负载。 是*
    trafficdirector.googleapis.com 实现可用性高且可伸缩的托管式控制平面。 是*
    networkservices.googleapis.com 实现可用性高且可伸缩的托管式控制平面。 是*
    networksecurity.googleapis.com 实现可用性高且可伸缩的托管式控制平面。 是*

    配置托管式 Cloud Service Mesh

    使用 Fleet API 预配托管式 Cloud Service Mesh 所需的步骤取决于您是偏向于为新舰队集群默认启用还是按集群启用

    为舰队配置

    如果您已启用 Google Kubernetes Engine (GKE) Enterprise 版,则可以启用代管式 Cloud Service Mesh 作为舰队的默认配置。这意味着每个在集群创建期间注册的新的 GKE on Google Cloud 集群都将在该集群上启用托管式 Cloud Service Mesh。您可以在管理舰队级功能中详细了解舰队默认配置。

    将托管式 Cloud Service Mesh 作为舰队的默认配置启用,并在创建集群期间将集群注册到舰队,仅支持 Mesh CA。如果您想使用 Certificate Authority Service,我们建议您为每个集群启用该服务

    如需为托管式 Cloud Service Mesh 启用舰队级默认设置,请完成以下步骤:

    控制台

    1. 在 Google Cloud 控制台中,前往 Feature Manager 页面。

      前往 Feature Manager

    2. 服务网格窗格中,点击配置

    3. 查看您在 Google Cloud 控制台中创建并注册到舰队的所有新集群将继承的设置。

    4. 如要应用这些设置,请点击配置

    5. 在确认对话框中,点击确认

    6. 可选:将现有集群同步到默认设置:

      1. 舰队中的集群列表中,选择您要同步的集群。您只能选择已安装 Cloud Service Mesh 的集群。
      2. 点击同步到舰队设置,然后在出现的确认对话框中点击确认。此操作可能需要几分钟才能完成。

    gcloud

    如需使用 Google Cloud CLI 配置车队级默认设置,您必须建立以下设置:

    • 舰队级设置

      • 创建一个仅包含单行 management: automaticmesh.yaml 文件:

        echo "management: automatic" > mesh.yaml
        
      • 为舰队启用 Cloud Service Mesh:

        gcloud container fleet mesh enable --project FLEET_PROJECT_ID \
            --fleet-default-member-config mesh.yaml
        

        如果您看到以下错误,则表示您需要启用 GKE Enterprise

        ERROR: (gcloud.container.fleet.mesh.enable) FAILED_PRECONDITION: The
        [anthos.googleapis.com] service is required for this operation and is not
        enabled for the project [PROJECT_NUMBER]. Please use the Google Developers
        Console to enable it.: failed precondition
        
    • 网络级设置

      • 如果网络的项目与舰队宿主项目不同(例如,您使用的是共享 VPC),则您必须允许舰队项目中的 Cloud Service Mesh 服务账号访问网络项目。您只需为影音平台项目执行一次此操作。

        向舰队项目中的服务账号授予访问网络项目的权限:

        gcloud projects add-iam-policy-binding "NETWORK_PROJECT_ID"  \
            --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
            --role roles/anthosservicemesh.serviceAgent
        
    • 集群级设置

      • 准备好创建用于 Cloud Service Mesh 的集群时,只需一个步骤即可使用 Google Cloud CLI 创建和注册集群,从而使用默认配置。例如:

        gcloud container clusters create-auto CLUSTER_NAME \
            --fleet-project FLEET_PROJECT_ID \
            --location=LOCATION
        

        您可以通过运行以下命令获取舰队项目的项目编号:

        gcloud projects list --filter="FLEET_PROJECT_ID" --format="value(PROJECT_ID)"
        

        --location 标志是集群的计算可用区或区域(例如 us-central1-aus-central1)。

      • 如果集群的项目与舰队宿主项目不同,则您必须允许舰队项目中的 Cloud Service Mesh 服务账号访问集群项目,并在集群项目上启用所需的 API。您只需为每个集群项目执行一次此操作。

        向舰队项目中的服务账号授予访问集群项目的权限:

        gcloud projects add-iam-policy-binding "CLUSTER_PROJECT_ID"  \
            --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
            --role roles/anthosservicemesh.serviceAgent
        

        在集群的项目上启用 Mesh API:

        gcloud services enable mesh.googleapis.com \
          --project=CLUSTER_PROJECT_ID
        

        CLUSTER_PROJECT_ID 替换为集群项目的唯一标识符。如果您在与舰队相同的项目中创建了集群,则 CLUSTER_PROJECT_IDFLEET_PROJECT_ID 相同。

    接下来,验证已预配控制平面

    按集群配置

    请按照以下步骤分别为网格中的每个集群配置托管式 Cloud Service Mesh。

    启用 Cloud Service Mesh 舰队功能

    在舰队项目中启用 Cloud Service Mesh。请注意,如果您计划注册多个集群,则启用 Cloud Service Mesh 是在舰队级层进行的,因此您只需运行一次此命令。

    gcloud container fleet mesh enable --project FLEET_PROJECT_ID
    

    将集群注册到舰队

    1. 使用舰队 Workload Identity 注册 GKE 集群--location 标志是集群的计算可用区或区域(例如 us-central1-aus-central1)。

      gcloud container clusters update CLUSTER_NAME \
        --location CLUSTER_LOCATION \
        --fleet-project FLEET_PROJECT_ID
      
    2. 验证是否已注册集群:

      gcloud container fleet memberships list --project FLEET_PROJECT_ID
      

      输出示例:

      NAME                 EXTERNAL_ID                           LOCATION
      cluster-1            1d8e255d-2b55-4df9-8793-0435461a2cbc  us-central1
      

      记下 MEMBERSHIP_NAME,因为您在启用自动管理时需要用到它。

    3. 如果集群的网络项目与舰队宿主项目不同(例如,您使用的是共享 VPC),则您必须允许舰队项目中的 Cloud Service Mesh 服务账号访问网络项目。您只需为影音平台项目执行一次此操作。

      向舰队项目中的服务账号授予访问网络项目的权限:

       gcloud projects add-iam-policy-binding "NETWORK_PROJECT_ID"  \
            --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
            --role roles/anthosservicemesh.serviceAgent
      
    4. 如果集群的项目与舰队宿主项目不同,则您必须允许舰队项目中的 Cloud Service Mesh 服务账号访问集群项目,并在集群项目上启用所需的 API。

      您只需为每个集群项目执行一次此操作。如果您之前为此集群项目和舰队项目的组合配置了代管式 Cloud Service Mesh,则这些更改已应用生效,您无需再运行以下命令。

      向舰队项目中的服务账号授予访问集群项目的权限:

       gcloud projects add-iam-policy-binding "CLUSTER_PROJECT_ID" \
           --member "serviceAccount:service-FLEET_PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
           --role roles/anthosservicemesh.serviceAgent
      

      在集群的项目上启用 Mesh API:

       gcloud services enable mesh.googleapis.com \
           --project=CLUSTER_PROJECT_ID
      

    配置 Certificate Authority Service(可选)

    如果您的服务网格部署需要 Certificate Authority Service (CA Service),请按照为代管式 Cloud Service Mesh 配置 Certificate Authority Service 为您的舰队启用该服务。请务必完成所有步骤,然后再继续下一部分。

    启用自动代管

    运行以下命令以启用自动代管:

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

    其中:

    • MEMBERSHIP_NAME 是您在验证集群是否已注册到舰队时列出的成员资格名称。
    • MEMBERSHIP_LOCATION 是您的成员资格的位置(区域或 global)。

      如果您最近使用本指南中的命令创建了成员资格,这应该是您的集群区域。如果您有一个可用区级集群,请使用与该集群可用区相对应的区域。例如,如果您在 us-central1-c 中有一个可用区级集群,请使用值 us-central1

      如果您在 2023 年 5 月之前注册,或者在注册成员资格时指定了 global 位置,则此值可能为 global。您可以使用 gcloud container fleet memberships list --project FLEET_PROJECT_ID 检查您的成员资格的位置。

    验证已预配控制平面

    几分钟后,验证控制平面状态是否为 ACTIVE

    gcloud container fleet mesh describe --project FLEET_PROJECT_ID
    

    输出类似于以下内容:

    ...
    membershipSpecs:
      projects/746296320118/locations/us-central1/memberships/demo-cluster-1:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/746296320118/locations/us-central1/memberships/demo-cluster-1:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
            implementation: ISTIOD | TRAFFIC_DIRECTOR
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
    ...
    

    记下 implementation 字段中显示的控制平面,即 ISTIODTRAFFIC_DIRECTOR。如需了解控制平面差异和支持的配置,以及如何选择控制平面实现,请参阅 Cloud Service Mesh 支持的功能

    配置 kubectl 以指向集群

    以下部分涉及:对每个集群运行 kubectl 命令。在继续执行以下部分之前,请为每个集群运行以下命令,以将 kubectl 配置为指向该集群。

    gcloud container clusters get-credentials CLUSTER_NAME \
          --location CLUSTER_LOCATION \
          --project CLUSTER_PROJECT_ID
    

    请注意,入站流量网关不会自动使用控制平面进行部署。通过分离入站流量网关和控制平面的部署,您可以管理生产环境中的网关。如果您想使用 Istio 入站网关或出站网关,请参阅部署网关。如果您想使用 Kubernetes Gateway API,请参阅为网格准备网关。如需启用其他可选功能,请参阅在 Cloud Service Mesh 上启用可选功能

    代管式数据平面

    如果您使用的是托管式 Cloud Service Mesh,Google 将全面代管代理的升级。

    启用代管式数据平面功能后,通过重启工作负载来重新注入新版代理,边车代理和注入的网关将与代管式控制平面一起主动自动更新。此过程会在控制平面升级后开始,通常会在开始后 2 周内完成。

    请注意,代管式数据平面依赖于 GKE 版本渠道。如果您在启用代管式数据平面时更改 GKE 发布渠道,代管式 Cloud Service Mesh 将更新所有现有工作负载的代理,就像发布代管式数据平面一样。

    如果停用,代理管理将被动执行,由集群中的 Pod 的自然生命周期驱动,并且必须由用户手动触发以控制更新速率。

    代管式数据平面通过逐出运行旧版代理的 Pod 来升级代理。逐出是逐渐完成的,遵循 Pod 中断预算并控制变化率。

    代管式数据平面不会代管以下各项:

    • 未注入的 Pod
    • 手动注入的 Pod
    • 作业
    • StatefulSet
    • DaemonSet

    停用代管式数据平面(可选)

    如果您要在新集群上预配托管式 Cloud Service Mesh,则可以完全停用代管式数据平面,也可以为单个命名空间或 pod 停用数据平面。对于默认或手动停用了代管式数据平面的现有集群,代管式数据平面将继续处于停用状态。

    如需在集群级层停用代管式数据平面并还原为自行管理边车代理,请更改注解:

    kubectl annotate --overwrite controlplanerevision -n istio-system \
      mesh.cloud.google.com/proxy='{"managed":"false"}'
    

    如需为命名空间停用代管式数据平面,请运行以下命令:

    kubectl annotate --overwrite namespace NAMESPACE \
      mesh.cloud.google.com/proxy='{"managed":"false"}'
    

    如需为 Pod 停用代管式数据平面,请执行以下命令:

    kubectl annotate --overwrite pod POD_NAME \
      mesh.cloud.google.com/proxy='{"managed":"false"}'
    

    启用维护通知

    您可以请求在安排维护前一周收到关于即将进行的代管式数据平面维护的通知。默认情况下,系统不会发送维护通知。您还必须配置 GKE 维护窗口才能接收通知。启用后,系统会在升级操作前至少两天发送通知。

    如需选择接收代管式数据平面维护通知,请执行以下操作:

    1. 进入通信页面。

      转到“通信”页面

    2. Cloud Service Mesh 升级行中的电子邮件列下,选择单选按钮以开启维护通知。

    每个希望接收通知的用户必须分别选择接收通知。如果您要为这些通知设置电子邮件过滤条件,则主题为:

    Upcoming upgrade for your Cloud Service Mesh cluster "CLUSTER_LOCATION/CLUSTER_NAME"

    以下示例展示了典型的代管式数据平面维护通知:

    主题行:您的 Cloud Service Mesh 集群“<location/cluster-name>”即将升级

    尊敬的 Cloud Service Mesh 用户:

    您的集群 ${instance_id} (https://console.cloud.google.com/kubernetes/clusters/details/${instance_id}/details?project=${project_id}) 中的 Cloud Service Mesh 组件计划将于 ${scheduled_date_human_readable} ${scheduled_time_human_readable} 进行升级。

    如需了解新的更新,请查看版本说明 (https://cloud.google.com/service-mesh/docs/release-notes)。

    如果此维护被取消,系统会再向您发送一封电子邮件。

    此致

    Cloud Service Mesh 团队

    (c) 2023 Google LLC 1600 Amphitheater Parkway, Mountain View, CA 94043 我们向您发送这封重要的服务通知,目的是让您了解关于 Google Cloud Platform 或您账号的重大变化。 您可以修改您的用户偏好设置以停止接收维护期通知:https://console.cloud.google.com/user-preferences/communication?project=${project_id}

    配置端点发现(仅适用于多集群安装)

    如果您的网格只有一个集群,请跳过这些多集群步骤并继续部署应用迁移应用

    在继续操作之前,请确保已在每个集群上配置 Cloud Service Mesh。

    如果使用 Fleet API 启用 Cloud Service Mesh,系统会为此集群启用端点发现。但是,您必须打开防火墙端口。如需为一个或多个集群停用端点发现,请参阅使用声明式 API 实现集群之间的端点发现中的说明停用该功能。

    如需查看包含两个集群的示例应用,请参阅 HelloWorld 服务示例

    部署应用

    如果舰队中有多个使用代管式 Cloud Service Mesh 的集群,请确保在继续并部署应用之前按预期配置端点发现或防火墙端口。

    启用用于注入的命名空间。具体步骤取决于您的控制平面实现

    受管理 (TD)

    1. 将默认注入标签应用于命名空间:
    kubectl label namespace NAMESPACE \
        istio.io/rev- istio-injection=enabled --overwrite
    

    受管理(Istiod)

    推荐:运行以下命令可将默认注入标签应用于命名空间:

      kubectl label namespace NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    如果您是使用托管式 Istiod 控制平面的现有用户:我们建议您使用默认注入,但也支持基于修订版本的注入。请按照以下说明操作:

    1. 运行以下命令以查找可用的发布渠道:

      kubectl -n istio-system get controlplanerevision
      

      输出类似于以下内容:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注意:如果上述列表中显示了两个控制平面修订版本,请移除其中一个。不支持在集群中使用多个控制平面渠道。

      在输出中,NAME 列的值是与 Cloud Service Mesh 版本可用的发布版本对应的修订版本标签。

    2. 将修订版本标签应用于命名空间:

      kubectl label namespace NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    使用以下命令验证是否已正确应用命名空间标签。

      kubectl get namespace -L istio-injection
    

    输出示例:

      NAME                 STATUS   AGE     ISTIO-INJECTION
      default              Active   5m9s    enabled
    

    至此,您已成功配置代管式 Cloud Service Mesh。如果添加了标签的命名空间中有任何现有工作负载,则需进行重启以注入代理。

    如果您在多集群设置中部署应用,请在所有集群中复制 Kubernetes 和控制平面配置,除非您计划将特定配置限制为部分集群。应用于特定集群的配置是该集群的真实来源。

    自定义注入(可选)

    您可以替换默认值和自定义注入设置,但这可能会导致不可预见的配置错误,并会导致 Sidecar 容器问题。在自定义注入之前,请阅读示例后的信息,了解有关特定设置和建议的备注。

    每个 pod 的配置都可用于覆盖各个 pod 上的这些选项。这是通过将 istio-proxy 容器添加到 pod 来实现的。Sidecar 注入会将此处定义的任何配置视为对默认注入模板的覆盖项。

    例如,以下配置可自定义各种设置,包括降低 CPU 请求、添加卷装载以及添加 preStop 钩子:

    apiVersion: v1
    kind: Pod
    metadata:
      name: example
    spec:
      containers:
      - name: hello
        image: alpine
      - name: istio-proxy
        image: auto
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"
        volumeMounts:
        - mountPath: /etc/certs
          name: certs
        lifecycle:
          preStop:
            exec:
              command: ["sleep", "10"]
      volumes:
      - name: certs
        secret:
          secretName: istio-certs
    

    一般而言,您可以设置 Pod 中的任何字段。但是,请务必注意某些字段:

    • Kubernetes 要求在运行注入之前设置 image 字段。虽然您可以将特定映像设置为替换默认映像,但建议将 image 设置为 auto,这会使 Sidecar 注入器自动选择要使用的映像。
    • containers 中的某些字段取决于相关设置。例如,必须小于或等于 CPU 限制。如果这两个字段都未正确配置,则 pod 可能无法启动。
    • Kubernetes 可让您为 Pod spec 中的资源设置 requestslimitsGKE Autopilot 仅考虑 requests。如需了解详情,请参阅在 Autopilot 中设置资源限制

    此外,某些字段可通过 pod 上的注解进行配置,但建议您使用上述方法自定义设置。请对以下注释格外小心:

    • 对于 GKE Standard,如果设置了 sidecar.istio.io/proxyCPU,请务必明确设置 sidecar.istio.io/proxyCPULimit。否则,Sidecar 的 CPU 限制将设置为无限制。
    • 对于 GKE Standard,如果设置了 sidecar.istio.io/proxyMemory,请务必明确设置 sidecar.istio.io/proxyMemoryLimit。否则,Sidecar 的内存限制将设置为无限制。
    • 对于 GKE Autopilot,使用注解配置资源 requestslimits 可能会超额预配资源。请使用图片模板方法避免这种情况。请参阅 Autopilot 中的资源修改示例

    例如,请参阅以下资源注解:

    spec:
      template:
        metadata:
          annotations:
            sidecar.istio.io/proxyCPU: "200m"
            sidecar.istio.io/proxyCPULimit: "200m"
            sidecar.istio.io/proxyMemory: "256Mi"
            sidecar.istio.io/proxyMemoryLimit: "256Mi"
    

    将应用迁移到托管式 Cloud Service Mesh

    如需将应用从集群内 Cloud Service Mesh 迁移到代管式 Cloud Service Mesh,请执行以下步骤:

    1. 替换当前命名空间标签。具体步骤取决于您的控制平面实现

    受管理 (TD)

    1. 将默认注入标签应用于命名空间:
    kubectl label namespace NAMESPACE \
        istio.io/rev- istio-injection=enabled --overwrite
    

    受管理(Istiod)

    推荐:运行以下命令可将默认注入标签应用于命名空间:

      kubectl label namespace NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    如果您是使用托管式 Istiod 控制平面的现有用户:我们建议您使用默认注入,但也支持基于修订版本的注入。请按照以下说明操作:

    1. 运行以下命令以查找可用的发布渠道:

      kubectl -n istio-system get controlplanerevision
      

      输出类似于以下内容:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注意:如果上述列表中显示了两个控制平面修订版本,请移除其中一个。不支持在集群中使用多个控制平面渠道。

      在输出中,NAME 列的值是与 Cloud Service Mesh 版本可用的发布版本对应的修订版本标签。

    2. 将修订版本标签应用于命名空间:

      kubectl label namespace NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
    1. 对命名空间中的部署执行滚动升级:

      kubectl rollout restart deployment -n NAMESPACE
      
    2. 测试您的应用,验证工作负载是否正常工作。

    3. 如果您在其他命名空间中存在工作负载,请对每个命名空间重复上述步骤。

    4. 如果您在多集群设置中部署应用,请在所有集群中复制 Kubernetes 和 Istio 配置,除非有合适的配置限制只限于部分集群使用。应用于特定集群的配置是该集群的真实来源。

    如果您确定应用按预期运行,则在将所有命名空间切换到代管式控制平面后,可以移除集群内 istiod,或将其另存为备份 - istiod 会自动缩减使用的资源。如需将其移除,请跳至删除旧的控制平面

    如果遇到问题,您可以使用解决代管式控制平面问题中的信息识别并解决问题,并在必要时回滚到先前版本。

    删除旧的控制平面

    安装并确认所有命名空间都使用 Google 管理的控制平面后,您可以删除旧的控制平面。

    kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod -n istio-system --ignore-not-found=true
    

    如果您使用的是 istioctl kube-inject(而不是自动注入),或者您安装了其他网关,请检查控制平面的指标,并验证连接的端点数量是否为零。

    回滚

    如果您需要回滚到先前的控制平面版本,请执行以下步骤:

    1. 更新要用旧版控制平面注入的工作负载:在以下命令中,修订版本值 asm-191-1 仅用作示例。将示例值替换为前面的控制平面的修订版本标签。

      kubectl label namespace NAMESPACE istio-injection- istio.io/rev=asm-191-1 --overwrite
      
    2. 重启 pod 以触发重新注入,以使代理具有之前的版本:

      kubectl rollout restart deployment -n NAMESPACE
      

    代管式控制平面会自动扩容到零,在不使用时不使用任何资源。更改 Webhook 和预配将会保留,不会影响集群行为。

    网关现已设置为 asm-managed 修订版本。如需回滚,请重新运行 Cloud Service Mesh 安装命令,该命令会重新部署指回到集群内控制平面的网关:

    kubectl -n istio-system rollout undo deploy istio-ingressgateway
    

    成功时预期下列输出:

    deployment.apps/istio-ingressgateway rolled back
    

    卸载 Cloud Service Mesh

    当没有命名空间使用代管式控制平面时,该控制平面会自动扩缩为零。如需了解详细步骤,请参阅卸载 Cloud Service Mesh