使用 GKE Enterprise CLI 在现有集群上安装 Anthos Service Mesh

本指南介绍如何使用 GKE Enterprise 命令行界面 (CLI) 在现有 Google Cloud GKE 集群上执行 Anthos Service Mesh 版本 1.5.10-asm.2 全新安装。请注意,此 Beta 版 GKE Enterprise CLI 存在以下限制:

安装会启用以下功能:

本指南还介绍了如何在与集群位于同一 Google Cloud 项目的队列中注册集群。借助队列,您可以组织集群,以简化多集群管理。通过在队列中注册集群,您可以根据需要对服务和其他基础架构进行分组,以应用一致的政策。

准备工作

开始安装之前,请执行以下操作:

使用要求

  • 您必须拥有 GKE Enterprise 试用许可或订阅。如需了解详情,请参阅 GKE Enterprise 价格指南

  • 您的 GKE 集群必须满足以下要求:

    • 至少具有四个节点。
    • 最小机器类型是配备了四个 vCPU 的 e2-standard-4
    • 使用 GKE 的 发布版本而不是静态版本
  • 如需将服务端口纳入服务网格,必须为服务端口命名,并且名称必须包含以下语法的端口协议:name: protocol[-suffix],其中方括号表示必须以短划线开头的可选后缀。 如需了解详情,请参阅命名服务端口

  • 如果您是在专用集群上安装 Anthos Service Mesh,则必须添加防火墙规则来打开端口 15017,以使用自动 Sidecar 注入。如果您未添加防火墙规则并启用了自动 Sidecar 注入,则在部署工作负载时会收到错误。如需详细了解如何添加防火墙规则,请参阅针对特定用例添加防火墙规则

  • 如果您在组织中创建了服务边界,则可能需要将 Mesh CA 服务添加到边界。如需了解详情,请参阅将 Mesh CA 添加到服务边界

限制

仅支持每个 Google Cloud 项目安装一次 Anthos Service Mesh。不支持在单个项目中进行多次网格部署

证书数据

来自 Mesh CA 的证书包含有关应用的服务的以下数据:

  • Google Cloud 项目 ID
  • GKE 命名空间
  • GKE 服务账号名称

设置项目和集群默认值

  1. 获取在其中创建集群的项目的项目 ID:

    gcloud

    gcloud projects list

    控制台

    1. 在 Google Cloud 控制台中,前往信息中心页面

      前往“信息中心”页面

    2. 点击页面顶部的从以下列表中选择:下拉列表。在随即显示的从以下列表中选择:窗口中,选择您的项目。项目 ID 会显示在项目信息中心的项目信息卡片上。

  2. 为项目 ID 创建环境变量:

    export PROJECT_ID=YOUR_PROJECT_ID
  3. 设置 Google Cloud CLI 的默认项目 ID:

    gcloud config set project ${PROJECT_ID}
    
  4. 创建以下环境变量:

    • 设置集群名称:

      export CLUSTER_NAME=YOUR_CLUSTER_NAME
    • CLUSTER_LOCATION 设置为您的集群区域或集群地区:

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
  5. 为 Google Cloud CLI 设置默认可用区或区域。

    • 如果您有一个单可用区集群,请设置默认可用区:

      gcloud config set compute/zone ${CLUSTER_LOCATION}
    • 如果您有一个地区集群,请设置默认地区:

      gcloud config set compute/region ${CLUSTER_LOCATION}

准备资源配置文件

您可以使用 GKE Enterprise CLI 和 kustomize 导出和修补 Config Connector 资源文件,这些文件用于使用 Anthos Service Mesh 所需的选项更新现有集群。Config Connector 资源是以 Kubernetes 表示 Google Cloud 资源。

导出资源配置文件

您可以使用 gcloud beta anthos export 命令输出现有集群的资源配置文件。

  1. 为 Anthos Service Mesh 资源创建一个目录。为方便起见,以下步骤将您创建的目录指定为 ASM_RESOURCES

  2. 切换到 ASM_RESOURCES 目录:

  3. asm-patch 软件包下载到当前工作目录:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm-patch@release-1.5-asm .
    

    该命令会创建一个名为 asm-patch/ 的子目录。

  4. 在名为 BASE_DIR 的环境变量中添加目录名称。当您对现有集群运行 gcloud beta anthos export 命令时,GKE Enterprise CLI 会采用在 BASE_DIR 中指定的名称创建一个目录,并将 Config Connector 资源文件输出到该目录中。

    export BASE_DIR=YOUR_BASE_DIR

    如果要设置多个集群,我们建议您使用集群名称作为目录名称。例如,如果要为两个集群准备资源配置文件,在您针对 cluster-1cluster-2 运行 gcloud beta anthos export 命令后,您的目录结构应类似于如下所示:

    目录结构的草图

    在该图中,cluster-1cluster-2 这两个目录包含名为 cluster-1cluster-2 的集群的 Config Connector 资源配置文件。

  5. 导出 Config Connector 资源配置文件:

    gcloud beta anthos export ${CLUSTER_NAME} --output-directory ${BASE_DIR}
    

    export 命令会在集群的资源配置文件中填充项目 ID 和集群区域/地区,以与当前 gcloud config 设置相匹配。如果要导出与当前 gcloud config 设置不匹配的集群的资源配置文件,您可以指定以下命令行选项:

    • -p PROJECT_ID
    • -l YOUR_ZONE_OR_REGION

    如需了解详情,请查看 gcloud beta anthos export --help

修补资源配置文件

您可以使用 GKE Enterprise kpt setter 和 kustomize 来更新资源配置文件。

  1. 列出 asm-patch 软件包中的可用配置 setter:

    kpt cfg list-setters asm-patch/
    

    输出类似于以下内容:

    NAME                           VALUE                  SET BY   DESCRIPTION   COUNT
    base-dir                       base                                           1
    gcloud.compute.location        your_zone_or_region                            1
    gcloud.container.cluster       your_cluster_name                              3
    gcloud.core.project            your_project_id        kpt                    11
    gcloud.project.projectNumber   your_project_number    kpt                     1
  2. 设置 ${BASE_DIR}asm-patch 目录之间的相对路径:

    kpt cfg set asm-patch/ base-dir ../${BASE_DIR}
  3. 设置集群名称:

    kpt cfg set asm-patch/ gcloud.container.cluster ${CLUSTER_NAME}
  4. 如果您尚未设置 gcloud config 默认值,或者想要更改值,请运行以下 setter:

    kpt cfg set asm-patch/ gcloud.compute.location ${CLUSTER_LOCATION}
    kpt cfg set asm-patch/ gcloud.core.project ${PROJECT_ID}
  5. 将 Anthos Service Mesh 补丁程序应用于集群资源配置文件:

    pushd ${BASE_DIR} && kustomize create --autodetect \
    --namespace ${PROJECT_ID} && popd
    pushd asm-patch && kustomize build -o ../${BASE_DIR}/all.yaml && popd
  6. 验证最终资源配置:

    kpt fn source ${BASE_DIR} | kpt fn run --image gcr.io/kustomize-functions/validate-asm:v0.1.0
    

    如果出现任何错误,请更正错误,然后再次验证资源配置。

  7. (可选)您可以将资源配置文件签入到您自己的源代码控制系统(例如 Cloud Source Repositories),以便您可以跟踪这些文件的更改。

更新集群并安装 Anthos Service Mesh

GKE Enterprise CLI 会使用 Anthos Service Mesh 所需的以下选项更新集群:

  • proj-PROJECT_NUMBER 格式向集群添加 mesh_id 标签,其中 PROJECT_NUMBER 是在其中创建集群的项目的编号。mesh_id 标签对于在 Google Cloud 控制台中的 Anthos Service Mesh 信息中心上显示指标是必需的。如果您的集群已有标签,GKE Enterprise CLI 会保留这些标签。

  • 启用 Workload Identity

  • 启用 Kubernetes Engine Monitoring

  • 发布版本概览中注册集群。

运行以下命令可更新集群并安装 Anthos Service Mesh:

gcloud beta anthos apply ${BASE_DIR}

该命令会使用所需选项更新集群,然后部署 Anthos Service Mesh。此过程大约需要 30 分钟才能完成。

检查控制层面组件

检查 istio-system 中的控制层面 Pod 是否已启动:

kubectl get pod -n istio-system

预期输出如下所示:

NAME                                      READY   STATUS      RESTARTS   AGE
istio-ingressgateway-74cc894bfd-786rg     1/1     Running     0          7m19s
istiod-78cdbbbdb-d7tps                    1/1     Running     0          7m36s
promsd-576b8db4d6-lqf64                   2/2     Running     1          7m19s

注册您的集群

您必须向项目的队列注册集群,才能获取对 Google Cloud 控制台中的统一界面的访问权限。队列提供一种统一方法来查看和管理集群及其工作负载,包括 Google Cloud 之外的集群。

创建 Google Cloud 服务账号和密钥文件

必须提供包含服务账号凭据的 JSON 文件才能注册集群。为遵循最小权限原则,我们建议您为注册的每个集群创建不同的服务账号。

如需创建服务账号和密钥文件,请执行以下操作:

  1. 为服务账号选择一个名称并为其创建环境变量:

    export SERVICE_ACCOUNT_NAME=SERVICE_ACCOUNT_NAME
    
  2. 创建服务账号:

    gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME}
  3. 列出项目的所有服务账号以确认服务账号已创建:

    gcloud iam service-accounts list
  4. 将 gkehub.connect IAM 角色绑定到服务账号:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
       --member="serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/gkehub.connect"
  5. 为您要保存 JSON 文件的本地文件路径创建环境变量。我们建议您使用服务账号名称和项目 ID 命名文件,例如:/tmp/creds/${SERVICE_ACCOUNT_NAME}-${PROJECT_ID}.json

    export SERVICE_ACCOUNT_KEY_PATH=LOCAL_KEY_PATH
  6. 下载服务账号的私钥 JSON 文件:

    gcloud iam service-accounts keys create ${SERVICE_ACCOUNT_KEY_PATH} \
       --iam-account=${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com

注册集群

在以下命令中,将 MEMBERSHIP_NAME 替换为一个唯一表示要在 Hub 中注册的集群的名称。

gcloud container hub memberships register MEMBERSHIP_NAME \
    --gke-cluster=${CLUSTER_LOCATION}/${CLUSTER_NAME} \
    --service-account-key-file=${SERVICE_ACCOUNT_KEY_PATH}

该命令会返回如下输出:

kubeconfig entry generated for CLUSTER_NAME.
Waiting for membership to be created...done.
Created a new membership [projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_NAME] for the cluster [MEMBERSHIP_NAME]
Generating the Connect Agent manifest...
Deploying the Connect Agent on cluster [MEMBERSHIP_NAME] in namespace [gke-connect]...
Deployed the Connect Agent on cluster [MEMBERSHIP_NAME] in namespace [gke-connect].
Finished registering the cluster [MEMBERSHIP_NAME] with the Hub.

此服务账号密钥作为 Secret(名为 creds-gcp)存储在 gke-connect 命名空间中。

如需详细了解集群注册,请参阅 Connect 文档中的注册集群

注入 Sidecar 代理

Anthos Service Mesh 使用边车代理来增强网络安全性、可靠性和可观测性。借助 Anthos Service Mesh,这些功能可以从应用的主容器中抽象出来,并在作为同一 Pod 中单独的容器提供的常见进程外代理中实现。

在安装 Anthos Service Mesh 之前在集群上运行的任何工作负载都需要注入或更新边车代理,以使其具有当前的 Anthos Service Mesh 版本。在部署新工作负载之前,确保配置边车代理注入,以便 Anthos Service Mesh 可以监控并保护流量。

您可以使用一个命令启用自动 Sidecar 注入,例如:

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

其中,NAMESPACE 是应用服务的命名空间的名称;如果未显式创建命名空间,则为 default

如需了解详情,请参阅注入 Sidecar 代理

查看 Anthos Service Mesh 页面

在集群上部署工作负载并注入边车代理后,您可以在 Google Cloud 控制台中探索 Anthos Service Mesh 页面,以了解 Anthos Service Mesh 提供的所有可观测性功能。请注意,部署工作负载后,遥测数据大约需要一两分钟才会显示在 Google Cloud 控制台中。

在 Google Cloud 控制台中访问 Anthos Service Mesh 的权限由 Identity and Access Management (IAM) 控制。如需访问 Anthos Service Mesh 页面,Project Owner 必须为用户授予 Project Editor 或 Viewer 角色,或者授予在 Google Cloud 控制台中控制对 Anthos Service Mesh 的访问权限中所述的限制性更强的角色。

  1. 在 Google Cloud 控制台中,前往 Anthos Service Mesh

    转到 Anthos Service Mesh

  2. 从菜单栏的下拉列表中选择 Google Cloud 项目。

  3. 如果您有多个服务网格,请从服务网格下拉列表中选择相应网格。

如需了解详情,请参阅在 Google Cloud 控制台中探索 Anthos Service Mesh

除了 Anthos Service Mesh 页面,系统还会将与服务相关的指标(例如特定服务收到的请求数)发送到 Cloud Monitoring,这些指标显示在 Cloud Monitoring 的 Metrics Explorer 中。

如需查看指标,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到监控页面:

    转到“监控”

  2. 选择资源 > Metrics Explorer

如需查看指标的完整列表,请参阅 Cloud Monitoring 文档中的 Istio 指标

使用 kpt 安装示例

(可选)您可以使用 kpt 将 Hipster 示例安装到集群中。

  1. 下载示例:

    kpt pkg get \
    https://github.com/GoogleCloudPlatform/microservices-demo.git/release \
    hipster-demo
    
  2. 启用自动 Sidecar 注入:

    kubectl label namespace default istio-injection=enabled
    
  3. 将示例部署到集群:

    kubectl apply -f hipster-demo
    
  4. 找到应用的外部 IP 地址:

    kubectl get service frontend-external
    
  5. 使用浏览器访问应用,以确认安装:

    http://EXTERNAL_IP/

    现在您已在运行一个示例,接下来您可以在 Google Cloud 控制台中探索 Anthos Service Mesh 可观测性功能。请注意,拓扑图最长可能需要 10 分钟才会显示网格中的服务。

探索完毕后,移除 Hipster 示例:

kubectl delete -f hipster-demo

后续步骤