配置代管式 Anthos Service Mesh

概览

托管式 Anthos Service Mesh 是 Google 托管的控制平面,您只需配置一个可选的数据平面。Google 以向后兼容的方式为您处理可靠性、升级、扩缩和安全性问题。本指南介绍如何使用 asmcli 在单集群或多集群配置中设置或迁移到代管式 Anthos Service Mesh。

如需了解代管式 Anthos Service Mesh 支持的功能和限制,请参阅托管式 Anthos Service Mesh 支持的功能

前提条件

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

要求

  • 一个或多个在受支持的 GKE 版本中具有受支持区域的集群。
  • 确保从中安装代管式 Anthos Service Mesh 的客户端机器与 API 服务器之间有网络连接。
  • 集群必须注册到舰队。此步骤可以在安装之前单独完成,也可以在安装过程中通过传递 --enable-registration--fleet-id 标志来完成。
  • 项目必须启用服务网格功能。您可以在安装过程中通过传递 --enable-gcp-components 或运行以下命令启用它:

    gcloud container hub mesh enable --project=FLEET_PROJECT_ID
    

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

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

    • 如果您要加入的集群不在同一个项目中,则它们必须向同一舰队宿主项目注册,并且这些集群必须位于同一网络的共享 VPC配置中。
    • 此外,我们建议您用一个项目托管共享 VPC,以及不同的服务项目用于创建集群。如需了解详情,请参阅通过共享 VPC 设置集群
    • 如果您的组织使用 VPC Service Controls,则您必须在应用 Google 管理的控制平面时使用额外的 --use-vpcsc 标志。否则,安装将无法通过安全控制。普通渠道和快速渠道均支持 VPC Service Controls 功能。

限制

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

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

  • 代管式数据平面的此预览版本仅适用于代管式控制平面的新部署。如果您之前部署了代管式控制平面,并且想要部署代管式数据平面,则必须重新运行安装工具,如应用 Google 管理的控制平面所述。

  • 常规和快速发布渠道均支持代管式数据平面。

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

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

配置 gcloud

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

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

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

    gcloud components update
    
  3. 如果您要在 GKE 集群上安装 Anthos Service Mesh,请将 kubectl 配置为指向该集群。

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

下载安装工具

  1. 将该工具的最新版本下载到当前工作目录:

    curl https://storage.googleapis.com/csm-artifacts/asm/asmcli > asmcli
    
  2. 将该工具设置为可执行工具:

    chmod +x asmcli
    

配置每个集群

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

应用 Google 管理的控制平面

在应用 Google 管理的控制平面之前,您必须选择发布渠道

为将使用代管式 Anthos Service Mesh 的每个集群运行安装工具。我们建议您添加以下两个选项:

  • --enable-registration --fleet_id FLEET_PROJECT_ID 这两个标志会将集群注册到舰队,其中 FLEET_ID 是舰队宿主项目的 ID。如果使用单项目,FLEET_PROJECT_IDPROJECT_ID 相同,则舰队宿主项目和集群项目相同。在多项目等更复杂的配置中,我们建议使用单独的舰队宿主项目。

  • --enable-all:此标志会启用所需的组件和注册。

如果您的组织为您的项目强制执行 VPC Service Controls,则必须配置额外的标志 --use-vpcsc。否则,安装将无法通过安全控制。普通渠道和快速渠道均支持 VPC Service Controls 功能。

如果您的集群是 GKE Autopilot 集群,请查看 GKE Autopilot 部分,了解适用于“asmcli”命令的其他要求和标志。

asmcli 工具使用 CLI 工具中的工具和逻辑直接配置代管式控制平面。根据您的首选 CA,使用以下说明集。

证书授权机构

选择要用于网格的证书授权机构。

Mesh CA

运行以下命令以使用默认功能和 Mesh CA 安装控制平面。在提供的占位符中输入值。 将 RELEASE_CHANNEL 替换为适当的渠道:regularstablerapid

  ./asmcli install \
      -p PROJECT_ID \
      -l LOCATION \
      -n CLUSTER_NAME \
      --fleet_id FLEET_PROJECT_ID \
      --managed \
      --verbose \
      --output_dir CLUSTER_NAME \
      --enable-all \
      --channel RELEASE_CHANNEL

CA Service

  1. 按照配置 Certificate Authority Service 中的步骤操作。
  2. 运行以下命令以安装具有默认功能和 Certificate Authority Service 的控制平面。在提供的占位符中输入值。 将 RELEASE_CHANNEL 替换为适当的渠道:regularstablerapid
  ./asmcli install \
      -p PROJECT_ID \
      -l LOCATION \
      -n CLUSTER_NAME \
      --fleet_id FLEET_PROJECT_ID \
      --managed \
      --verbose \
      --output_dir CLUSTER_NAME \
      --enable-all \
      --channel RELEASE_CHANNEL \
      --ca gcp_cas \
      --ca_pool pool_name

该工具会将用于配置代管式控制平面的所有文件下载到指定的 --output_dir,并安装 istioctl 工具和示例应用。本指南中的步骤假定您从在运行 asmcli install 时指定的 --output_dir 位置运行 istioctl,其中 istioctl 存在于该位置的 <Istio release dir>/bin 子目录中。

如果您在同一集群上重新运行 asmcli,则该命令会覆盖现有的控制平面配置。如果要使用相同的配置,请务必指定相同的选项和标志。

GKE Autopilot

只有常用渠道和快速渠道中的 Anthos Service Mesh 支持 GKE Autopilot。集群需要使用版本为 1.21.3+ 的 GKE。为了适应 GKE Autopilot 资源限制,默认代理资源请求和限制设置为 500m CPU 和 512 Mb 内存。Autopilot 集群需要代管式 CNI,因此您必须添加 --use_managed_cni 标志。 将 RELEASE_CHANNEL 替换为适当的渠道:regularstablerapid

./asmcli install \
    -p PROJECT_ID \
    -l LOCATION \
    -n CLUSTER_NAME \
    --managed \
    --verbose \
    --output_dir CLUSTER_NAME \
    --use_managed_cni \
    --channel RELEASE_CHANNEL \
    --enable-all

验证已预配控制平面

asmcli 工具会在集群中创建 ControlPlaneRevision 自定义资源。预配控制平面或预配失败后,此资源的状态会更新。

检查资源的状态。将 NAME 替换为与每个渠道对应的值:asm-managedasm-managed-stableasm-managed-rapid

kubectl describe controlplanerevision NAME -n istio-system

输出类似于以下内容:

    Name:         asm-managed

    …

    Status:
      Conditions:
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               The provisioning process has completed successfully
        Reason:                Provisioned
        Status:                True
        Type:                  Reconciled
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has finished
        Reason:                ProvisioningFinished
        Status:                True
        Type:                  ProvisioningFinished
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has not stalled
        Reason:                NotStalled
        Status:                False
        Type:                  Stalled

协调条件决定了代管式控制平面是否正常运行。如果为 true,则表示控制平面已成功运行。Stalled 确定代管式控制平面预配过程是否遇到错误。如果为 Stalled,则 Message 字段包含有关特定错误的详细信息。 如需详细了解可能的错误,请参阅停止代码

零触摸升级

安装 Google 管理的控制平面后,Google 会在新版本或补丁程序可用时自动升级。

每次发生控制平面升级时,都不需要升级数据平面。控制平面会在支持窗口中继续使用所有代理,但我们建议您使用它来获取最新的数据平面功能、修复和性能改进。如需升级到您的渠道中最新发布的代理映像,您可以在方便时执行滚动重启,也可以应用 Google 管理的数据平面,它将为您自动执行滚动重启。

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

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

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

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

此托管数据平面预览版不管理以下内容:

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

快速数据和常规发布渠道均支持代管式数据平面。

如需启用代管式数据平面,请执行以下操作:

  1. 启用数据平面管理:

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

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

  2. 对您希望代管数据平面的每个命名空间重复上一步骤。

    服务最多可能需要 10 分钟才能准备好管理集群中的代理。运行以下命令来检查状态:

    gcloud alpha container fleet mesh describe --project PROJECT_ID
    

    预期输出

     membershipStates:
       projects/PROJECT_NUMBER/locations/global/memberships/CLUSTER_NAME:
         servicemesh:
           dataPlaneManagement:
             details:
             - code: OK
               details: Service is running.
             state: ACTIVE
         state:
           code: OK
           description: 'Revision(s) ready for use: asm-managed-rapid.'
     ```
    

如果服务未在十分钟内准备就绪,请参阅代管式数据平面状态,了解后续步骤。

如果您希望停用代管式数据层面,并还原为自行管理边车代理,请更改注解:

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

启用维护通知

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

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

  1. 转到通信页面。

    转到“通信”页面

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

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

Upcoming upgrade for your ASM cluster "CLUSTER_LOCATION/CLUSTER_NAME"

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

在继续操作之前,您应该已经按照上述步骤中的说明在每个集群上配置代管式 Anthos Service Mesh。不需要指明集群是主要集群,这是默认行为。您必须先完成设置项目和集群变量以及创建防火墙规则部分,然后才能配置端点发现。

公共集群

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

如果您在公共集群(非专用集群)上执行操作,则可以在公共集群之间配置端点发现或者只是在公共集群之间启用端点发现

专用集群

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

使用 GKE 专用集群时,必须将集群控制平面端点配置为公共端点,而不是专用端点。请参阅在专用集群之间配置端点发现

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

部署应用

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

默认注入标签

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

修订版本标签

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

如果您使用的是其他修订版本标签,请点击 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 代管式控制平面。如果您还应用代管式数据平面,请重启工作负载。如果没有,请执行滚动更新。现在,您可以部署应用,或者部署 Bookinfo 示例应用

如果您在多集群设置中部署应用,请在所有集群中复制 Kubernetes 和控制平面配置,除非您计划将特定配置限制为部分集群。应用于特定集群的配置是该集群的真实来源。此外,如果集群还在其他命名空间中通过 Mesh CA 运行 Anthos Service Mesh 或 Certificate Authority Service,请验证应用可以与集群内控制平面控制的其他应用进行通信。

验证控制平面指标

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

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

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

    打开 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,请执行以下步骤:

  1. 按照应用 Google 管理的控制平面部分中的说明运行工具。

  2. (可选)如果要使用 Google 管理的数据平面,请启用数据平面管理:

    kubectl annotate --overwrite namespace NAMESPACE \
    mesh.cloud.google.com/proxy='{"managed":"true"}'
    
  3. (可选)如果要使用 Google 管理的数据平面,请在舰队中启用 Anthos Service Mesh:

    gcloud alpha container hub mesh enable --project=PROJECT_ID
    
  4. 替换当前命名空间标签。所需步骤取决于您是要使用默认注入标签(例如 istio-injection enabled)还是修订版本标签

    默认注入标签

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

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

      kubectl label namespace NAMESPACE istio-injection=enabled \
      --overwrite
      

    修订版本标签

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

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

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

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

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

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

如果您确定应用按预期运行,则在将所有命名空间切换到集群内控制平面后,可以移除集群内 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

卸载

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

问题排查

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

ControlPlaneRevision 停止代码

有多种原因可能导致 Stalled 条件在 ControlPlaneRevisions 状态下变为 true。

原因 消息 说明
PreconditionFailed 仅支持 GKE 成员资格,但 ${CLUSTER_NAME} 不是 GKE 集群。 当前集群似乎不是 GKE 集群。代管式控制平面仅适用于 GKE 集群。
不受支持的 ControlPlaneRevision 名称:${NAME} ControlPlaneRevision 的名称必须是以下项之一:
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
不受支持的 ControlPlaneRevision 命名空间:${NAMESPACE} ControlPlaneRevision 的命名空间必须是 istio-system
名为 ${NAME} 的 ControlPlaneRevision 的渠道 ${CHANNEL} 不受支持。预期的 ${OTHER_CHANNEL} ControlPlaneRevision 的名称必须与 ControlPlaneRevision 的渠道匹配,如下所示:
  • asm-managed -> regular
  • asm-managed-rapid -> rapid
  • asm-managed-stable -> stable
渠道值不能省略,也不能留空 Channel 是 ControlPlaneRevision 的必填字段。针对自定义资源,它可缺失或为空。
不受支持的控制平面修订版本类型:${TYPE} managed_service 是 ControlPlaneRevisionType 字段唯一允许的字段。
不支持的 Kubernetes 版本:${VERSION} 支持 Kubernetes 1.15 及更高版本。
未启用 Workload Identity 请在集群上启用 Workload Identity。
不受支持的工作负载池:${POOL} 工作负载池的格式必须为 ${PROJECT_ID}.svc.id.goog
集群项目和 environ 项目不匹配 集群必须是已注册到舰队的同一项目的一部分。
ProvisioningFailed 更新集群资源时出错 Google 无法更新集群内的资源,例如 CRD 和网络钩子。
MutatingWebhookConfiguration "istiod-asm-managed"包含网址为 ${EXISTING_URL} 的网络钩子,但预期的网址是 ${EXPECTED_URL} Google 不会覆盖现有的网络钩子,以避免中断安装。如有必要,请手动更新此设置。
ValidatingWebhookConfiguration ${NAME} 包含网址为 ${EXISTING_URL} 的网络钩子,但预期的网址是 ${EXPECTED_URL} Google 不会覆盖现有的网络钩子,以避免中断安装。如有必要,请手动更新此设置。

后续步骤