使用 GKE Enterprise CLI 安装 Anthos Service Mesh

本指南介绍了如何使用 GKE Enterprise 命令行界面 (CLI) 在新的 Google Cloud GKE 集群上安装 Anthos Service Mesh 1.4.10-asm.18 并启用以下功能:

目前,GKE Enterprise CLI 不支持在现有 GKE 集群或 GKE on VMware 上安装。

准备工作

本指南假定您已具备:

使用要求

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

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

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

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

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

限制

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

证书数据

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

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

安装 kpt 和 Anthos CLI

您可以使用 kpt 来安装 GKE Enterprise CLI。您还可以使用 kpt 来下载、管理和自定义存储在 GitHub 中的 Anthos Service Mesh 资源配置文件。配置文件包含特定 Google Cloud 项目和 GKE 集群信息的占位符。自定义配置文件后,您可以将其签入您自己的 GitHub 代码库或其他源代码控制系统中。

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

    gcloud auth login
    
  2. 获取您的 Google Cloud 项目 ID 并为其创建环境变量:

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

    gcloud config set project ${PROJECT_ID}
    
  4. 为新集群选择区域或地区机器类型。Anthos Service Mesh 所需的最小机器类型为 n1-standard-4。您可以使用任何发布版本选项。

    • 如果您要创建单区域集群,请运行以下命令来获取可用 GCP 区域的列表:

      gcloud compute zones list
      
    • 如果您要创建地区级集群,请运行以下命令来获取可用地区的列表:

      gcloud compute regions list
      
    • 如需获取机器类型列表,请执行以下操作:

      gcloud compute machine-types list | more
      
  5. 创建以下环境变量:

    • 设置集群名称:

      export CLUSTER_NAME=YOUR_CLUSTER_NAME

      集群名称只能包含小写字母、数字和“-”,必须以字母开头,以字母数字结尾,并且不能超过 40 个字符。

    • CLUSTER_LOCATION 设置为您的集群可用区或集群区域:

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
  6. 安装 GKE Enterprise CLI 并更新组件。如果您使用的是 Cloud Shell,请将 sudo 添加到以下命令:

    gcloud components install kpt anthoscli alpha
    gcloud components update --version 292.0.0
  7. (可选)为 Anthos Service Mesh 软件包创建一个新目录,并为其创建 cd

  8. 将 Anthos Service Mesh 软件包下载到当前工作目录:

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

    默认情况下,kpt pkg get 命令会填充软件包文件中的计算可用区以与当前配置匹配。

  9. 在配置文件中设置以下值:

    • 设置项目 ID:

      kpt cfg set asm gcloud.core.project ${PROJECT_ID}
    • 设置集群名称:

      kpt cfg set asm cluster-name ${CLUSTER_NAME}
    • 设置默认区域或地区:

      kpt cfg set asm gcloud.compute.zone ${CLUSTER_LOCATION}
    • (可选)从默认值 REGULAR 更改发布版本。在以下命令中,将 YOUR_CHANNEL 替换为 STABLERAPID

      kpt cfg set asm gcloud.container.cluster.releaseChannel YOUR_CHANNEL

      如需了解每个发布版本,请参阅您可以获得哪些发布版本

在新集群上安装 Anthos Service Mesh

  1. 运行以下命令以创建一个新集群,并使用您自定义的 Anthos Service Mesh 配置文件安装 Anthos Service Mesh:

    anthoscli apply -f asm
    
  2. 等待部署完成:

    kubectl wait --for=condition=available --timeout=600s deployment --all -n istio-system
    

    输出:

    deployment.extensions/istio-galley condition met
    deployment.extensions/istio-ingressgateway condition met
    deployment.extensions/istio-pilot condition met
    deployment.extensions/istio-sidecar-injector condition met
    deployment.extensions/promsd condition met

检查控制层面组件

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

kubectl get pod -n istio-system

预期会看到类似如下所示的输出:

NAME                                      READY   STATUS      RESTARTS   AGE
istio-galley-5c65896ff7-m2pls             2/2     Running     0          18m
istio-ingressgateway-587cd459f-q6hqt      2/2     Running     0          18m
istio-nodeagent-74w69                     1/1     Running     0          18m
istio-nodeagent-7524w                     1/1     Running     0          18m
istio-nodeagent-7652w                     1/1     Running     0          18m
istio-nodeagent-7948w                     1/1     Running     0          18m
istio-pilot-9db77b99f-7wfb6               2/2     Running     0          18m
istio-sidecar-injector-69c4d9f875-dt8rn   1/1     Running     0          18m
promsd-55f464d964-lqs7w                   2/2     Running     0          18m

您应该会看到集群中每个节点的 istio-nodeagent 实例。Mesh CA 取代了 Citadel OSS Istio 组件,用于创建节点代理来为服务网格中运行的工作负载颁发 mTLS 证书。

验证 Mesh CA 是否正常工作:

  kubectl get pods -n istio-system -l app=istio-nodeagent \
  --output=jsonpath={​.items..metadata.name} -o yaml | grep CA_ADDR -A 1

预期输出:meshca.googleapis.com:443.

注册您的集群

您必须向项目的队列注册集群,才能获取对 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 文档中的注册集群

启用 Pod 安全政策

为在服务网格上获得最佳安全性,我们建议您启用 Pod 安全政策

注入 Sidecar 代理

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

在部署工作负载之前,请务必配置边车代理注入,以便 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
    

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

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

kubectl delete -f hipster-demo

后续步骤