使用 Fleet API 配置代管式 Anthos Service Mesh

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

概览

代管式 Anthos Service Mesh 是由 Google 代管的服务网格,启用后便可使用。Google 会以向后兼容的方式代您处理可靠性、升级、扩缩和安全性问题。

本页面介绍了如何使用舰队功能 API 来设置代管式 Anthos Service Mesh。

使用 Fleet API 启用代管式 Anthos Service Mesh 时:

  • Google 会应用推荐的控制平面配置
  • Google 会启用自动数据平面代管
  • 系统会根据您的 Google Kubernetes Engine (GKE) 集群的发布渠道在相应的 Anthos Service Mesh 发布渠道中注册您的集群,并使控制平面和数据平面与最新发布保持同步。
  • 虽然 Google 默认会在整个服务网格中实现端点发现和跨集群负载均衡,但您必须创建相应的防火墙规则。

如有需要,您可以采用下面的初始配置路径:

  • 需要使用 gcloud 通过 Google Cloud API 和 IAM 配置代管式 Anthos Service Mesh。
  • 需要使用与其他舰队功能相同的 API 配置 Anthos Service Mesh。
  • 需要为每个集群自动获取 Anthos Service Mesh 的推荐配置。

前提条件

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

使用要求

  • 一个或多个在受支持的 GKE 版本中具有受支持区域的集群。
  • 确保从中安装代管式 Anthos Service Mesh 的客户端机器与 API 服务器之间有网络连接。
  • 集群必须注册到舰队。此操作包含在说明中,也可以在安装之前单独完成。
  • 如果您要注册停用公共端点访问权限或仅限授权网络访问的专用集群,请确保要在其上运行 gcloud 注册命令的机器可以访问集群的外部端点,或者您也可以将该机器的外部 IP 添加到集群的授权网络。
  • 您的项目必须启用服务网格的舰队功能。此操作包含在说明中,也可以单独完成。
  • 只有 GKE 1.21.3 及更高版本支持 GKE Autopilot;CNI 将由 Google 进行安装和管理。

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

限制

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

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

  • 如果使用 Fleet API 启用代管式 Anthos Service Mesh,系统会使用 Mesh CA。如果您的服务网格部署需要 Certificate Authority Service (CA Service),请按照使用 asmcli 配置代管式 Anthos Service Mesh 中的步骤进行操作。

  • 对于 GKE Autopilot 集群,只有 GKE 1.23 及更高版本支持跨项目设置。为了适应 GKE Autopilot 资源限制,默认代理资源请求和限制设置为 500m CPU 和 512 Mb 内存。

  • 代管式 Anthos Service Mesh 可用的实际功能取决于发布版本。如需了解详情,请参阅代管式 Anthos Service Mesh 支持的功能和限制的完整列表。

  • 在代管式控制平面的预配过程中,与所选渠道对应的 Istio CRD 将安装在指定集群中。如果集群中已有 Istio CRD,则它们将会被覆盖。

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

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

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

其中:

  • FLEET_PROJECT_ID 是当前项目的 ID。

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

API
meshconfig.googleapis.com
meshca.googleapis.com
container.googleapis.com
monitoring.googleapis.com
gkehub.googleapis.com
stackdriver.googleapis.com
opsconfigmonitoring.googleapis.com
connectgateway.googleapis.com

启用 Anthos Service Mesh 舰队功能

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

gcloud container fleet mesh enable --project FLEET_PROJECT_ID

配置每个集群

请按照以下步骤为网格中的每个集群配置代管式 Anthos Service Mesh。

配置 gcloud

即使您使用的是 Cloud Shell,仍请执行以下步骤。

  1. 使用 Google Cloud CLI 进行身份验证:

    gcloud auth login --project PROJECT_ID
    
  2. 更新组件:

    gcloud components update
    
  3. 配置 kubectl 以指向集群。

    gcloud container clusters get-credentials CLUSTER_NAME \
         --zone CLUSTER_LOCATION \
         --project PROJECT_ID
    

将集群注册到舰队

  1. 使用 Workload Identity 将 GKE 集群注册到舰队

    gcloud container fleet memberships register MEMBERSHIP_NAME \
      --gke-uri=GKE_URI \
      --enable-workload-identity \
      --project FLEET_PROJECT_ID
    

    其中:

    • MEMBERSHIP_NAME 是您选择用来唯一表示要注册到舰队的集群的成员资格名称。

    • GKE_URI 是 GKE 集群的 URI。 例如:https://container.googleapis.com/v1/projects/my-gke-project/locations/us-central1-a/clusters/my-gke-cluster。您可以通过运行 gcloud container clusters list --uri 来获取该 URI。

  2. 验证是否已注册集群:

    gcloud container fleet memberships list --project FLEET_PROJECT_ID
    
  3. 如果集群的项目与舰队宿主项目不同,则您必须允许舰队项目中的 Anthos Service Mesh 服务帐号访问集群项目。您只需为每个集群项目执行一次此操作。

    如果您之前使用 asmcli 为此集群项目和舰队项目的组合配置了代管式 Anthos Service Mesh,则这些更改已应用生效,您无需再运行以下命令。

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

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

应用 mesh_id 标签

可用区级集群

gcloud container clusters update  --project PROJECT_ID CLUSTER_NAME \
  --zone CLUSTER_LOCATION --update-labels mesh_id=proj-FLEET_PROJECT_NUMBER

区域级集群

gcloud container clusters update  --project PROJECT_ID CLUSTER_NAME \
  --region CLUSTER_LOCATION --update-labels mesh_id=proj-FLEET_PROJECT_NUMBER

其中:

  • PROJECT_ID 是集群项目的唯一标识符。
  • CLUSTER_NAME 是集群的名称。
  • CLUSTER_LOCATION 是集群的计算可用区或区域。
  • FLEET_PROJECT_NUMBER 是舰队宿主项目的唯一标识符。

启用自动代管

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

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

请注意,入站流量网关不会自动使用控制平面进行部署。通过分离入站流量网关和控制平面的部署,您可以更轻松地在生产环境中管理网关。如果集群需要入站流量网关或出站流量网关,请参阅部署网关。如需启用其他可选功能,请参阅在代管式 Anthos Service Mesh 上启用可选功能

验证已预配控制平面

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

    gcloud container fleet mesh describe --project FLEET_PROJECT_ID
    

    输出类似于以下内容:

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

    记下 details 字段中的修订版本标签,例如提供的输出中的 asm-managed。如果您要使用修订版本标签,则需要先设置相应标签,然后再部署应用。但如果您使用的是默认注入标签,则无需设置该标签。

代管式数据平面

如果您通过 Fleet API 来使用代管式 Anthos Service Mesh,则 Google 将全面代管代理的升级,除非您在命名空间或工作负载级层选择停用该自动代管功能。

如果启用,通过重启工作负载来重新注入新版代理,边车代理和注入的网关将与代管式控制平面一起自动升级。如果停用,代理管理由集群中的 Pod 的自然生命周期驱动,并且必须由用户手动触发以控制更新速率。

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

请注意,代管式数据平面需要 Istio 容器网络接口 (CNI) 插件,该插件在您部署代管式控制平面时默认启用。

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

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

系统会为自动预配的代管式控制平面修订版本启用代管式数据平面。但是,您可以视需要选择为特定命名空间或 Pod 停用该功能,只需使用相同的注释添加相应的注释即可。如果您有选择性地对个别组件进行控制,则优先顺序依次为控制平面修订版本(已启用)、命名空间、Pod。

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

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

或者,您也可以为特定 Pod 停用代管式数据平面,只需为其添加相同的注解即可。

启用维护通知

您可以请求在安排维护前一周收到关于即将进行的维护的通知。默认情况下,系统不会发送维护通知。您还必须配置 GKE 维护窗口才能接收通知。

如需选择接收维护通知,请执行以下操作:

  1. 转到通信页面。

    转到“通信”页面

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

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

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

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

在继续操作之前,您应该已经按照上述步骤中的说明在每个集群上配置代管式 Anthos Service Mesh。不需要指明集群是主要集群,这是默认行为。

此外,请确保您已下载 asmcli(仅当您要使用示例应用验证配置时)并设置项目和集群变量

公共集群

在公共集群之间配置端点发现

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

专用集群

在专用集群之间配置端点发现

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

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

部署应用

如需部署应用,请使用您在安装期间配置的渠道对应的标签;如果您使用的是默认注入标签,请使用 istio-injection=enabled

默认注入标签

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

修订版本标签

在部署应用之前,请从相应命名空间中移除任何以前的 istio-injection 标签,然后改为设置 istio.io/rev=REVISION_LABEL 标签。

这是您在验证控制平面时识别的修订版本标签。如需将其更改为特定的修订版本标签,请点击 REVISION_LABEL 并将其替换为相应标签:asm-managed-rapid(表示快速版)、asm-managed(表示标准版)或 asm-managed-stable(表示稳定版)。

修订版本标签对应于发布渠道

修订版本标签 渠道
asm-managed 普通
asm-managed-rapid 快速
asm-managed-stable 稳定版
kubectl label namespace NAMESPACE istio-injection- istio.io/rev=REVISION_LABEL --overwrite

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

现在,您可以部署应用,或者部署图书信息示例应用

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

验证控制平面指标

您可以在 Metrics Explorer 中查看控制平面和数据平面的版本。

如需验证您的配置是否正常运行,请执行以下操作:

  1. 在 Google Cloud 控制台中,查看控制平面指标:

    转到 Metrics Explorer

  2. 选择您的工作区,并使用以下参数添加自定义查询:

    • 资源类型:Kubernetes 容器
    • 指标:代理客户端
    • 过滤条件container_name="cr-REVISION_LABEL"
    • 分组依据:修订版本标签和 proxy_version 标签
    • 聚合器:总和
    • 时间段:1 分钟

    同时将 Anthos Service Mesh 与 Google 管理的控制平面和集群内控制平面一起运行时,您可以根据指标的容器名称来区分指标。例如,代管式指标具有 container_name="cr-asm-managed",而非代管式指标的值为 container_name="discovery"。如需同时显示这两项的指标,请移除 container_name="cr-asm-managed" 上的过滤条件。

  3. 在 Metrics Explorer 中检查以下字段,验证控制平面版本和代理版本:

    • revision 字段指示控制平面版本。
    • proxy_version 字段指示 proxy_version
    • value 字段指示连接的代理数量。

    如需了解当前渠道到 Anthos Service Mesh 版本的映射,请参阅每个渠道的 Anthos Service Mesh 版本

将应用迁移到代管式 Anthos Service Mesh

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

  1. 替换当前命名空间标签。所需步骤取决于您是要使用默认注入标签(例如 istio-injection enabled)还是修订版本标签

    默认注入标签

    1. 运行以下命令将默认标记移动到代管式修订版本:

      istioctl tag set default --revision REVISION_LABEL
      
    2. 运行以下命令以使用 istio-injection=enabled 为命名空间添加标签(如果尚未添加):

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

    修订版本标签

    如果您使用的是 istio.io/rev=REVISION_LABEL 标签,请运行以下命令:

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

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

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

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

  6. 按照验证控制平面指标中的步骤操作,验证指标是否符合预期。

如果您确定应用按预期运行,则在将所有命名空间切换到代管式控制平面后,可以移除集群内 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 修订版本。如需回滚,请重新运行 Anthos Service Mesh 安装命令,该命令会重新部署指回到集群内控制平面的网关:

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

成功时预期下列输出:

deployment.apps/istio-ingressgateway rolled back

停用自动代管

停用自动代管不会取消预配任何资源。所有资源都保留在集群中,供您手动管理或移除。

  1. 运行以下命令以停用自动代管:

    gcloud container fleet mesh update \
       --management manual \
       --memberships MEMBERSHIP_NAME \
       --project FLEET_PROJECT_ID
    
  2. 几分钟后,验证控制平面代管功能的状态是否为 DISABLED

    gcloud container fleet mesh describe --project PROJECT_ID
    

    输出类似于以下内容:

    ...
    membershipSpecs:
      projects/projectid/locations/global/memberships/cluster-name:
        mesh:
          controlPlane: management
    membershipStates:
      projects/projectid/locations/global/memberships/cluster-name:
        servicemesh:
          controlPlaneManagement:
            state: DISABLED
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
    ...
    

卸载 Anthos Service Mesh

如需完全卸载 Anthos Service Mesh,请参阅卸载 Anthos Service Mesh

问题排查

如需在使用代管式控制平面时识别和解决问题,请参阅解决代管式控制平面问题

后续步骤