在新集群上安装 Anthos Service Mesh

Anthos Service Mesh 是一种与 Istio 兼容的框架,用于连接、监控和保护在 Google Kubernetes Engine (GKE) 和 GKE on VMware 上运行的服务。它可让您创建部署服务的网络并进行负载均衡、服务到服务身份验证、监控等,无需对服务代码进行任何更改。Anthos Service Mesh 会自动为每个应用的 Pod 注入边车代理。边车代理会拦截进出 pod 的所有网络流量。Anthos Service Mesh 还配置了一个入站流量网关来管理该网格的入站流量。您可以使用开源 Istio API 来配置在辅助信息文件和网关上强制执行的政策。

本指南介绍了如何在启用了以下功能的新 Google Cloud GKE 集群上安装 Anthos Service Mesh 版本 1.4.10-asm.18:

准备工作

本指南假定您已具备:

在开始设置前,请查看以下要求和限制。

使用要求

  • 您必须拥有 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 服务账号名称

设置项目

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

    gcloud

    gcloud projects list

    控制台

    1. 在 Google Cloud 控制台中,转到信息中心页面

      转到“信息中心”页面

    2. 点击页面顶部的从以下列表中选择:下拉列表。在随即显示的从以下列表中选择:窗口中,选择您的项目。

      项目 ID 会显示在项目信息中心的项目信息卡片上。

  2. 为项目 ID 创建环境变量:
    export PROJECT_ID=YOUR_PROJECT_ID
    
  3. gcloud 命令行工具设置默认项目 ID:
    gcloud config set project ${PROJECT_ID}
  4. 为项目编号创建环境变量:
    export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")

  5. 设置所需的 Identity and Access Management (IAM) 角色。如果您是 Project Owner,则拥有完成安装和向 Environ 注册集群所需的所有必要权限。如果您不是 Project Owner,则需要有人授予您以下特定 IAM 角色。在以下命令中,将 GCP_EMAIL_ADDRESS 更改为您用于登录 Google Cloud 的账号。
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
         --member user:GCP_EMAIL_ADDRESS \
         --role=roles/editor \
         --role=roles/compute.admin \
         --role=roles/container.admin \
         --role=roles/resourcemanager.projectIamAdmin \
         --role=roles/iam.serviceAccountAdmin \
         --role=roles/iam.serviceAccountKeyAdmin \
         --role=roles/gkehub.admin

    如需详细了解如何授予 IAM 角色,请参阅授予、更改和撤消对资源的访问权限。如需了解这些角色,请参阅安装 Anthos Service Mesh 所需的权限

  6. 启用以下 API:
    gcloud services enable \
        container.googleapis.com \
        compute.googleapis.com \
        monitoring.googleapis.com \
        logging.googleapis.com \
        cloudtrace.googleapis.com \
        meshca.googleapis.com \
        meshtelemetry.googleapis.com \
        meshconfig.googleapis.com \
        iamcredentials.googleapis.com \
        anthos.googleapis.com \
        gkeconnect.googleapis.com \
        gkehub.googleapis.com \
        cloudresourcemanager.googleapis.com

    启用 API 可能需要 1 分钟或更长时间才能完成。启用这些 API 后,您将看到如下输出:

    Operation "operations/acf.601db672-88e6-4f98-8ceb-aa3b5725533c" finished
    successfully.
    

设置新的 GKE 集群

本部分介绍使用 Anthos Service Mesh 所需的选项创建 GKE 集群的基础知识。如需了解详情,请参阅创建集群

如需设置新集群,请执行以下操作:

  1. 为新集群选择区域或地区机器类型和 GKE 发布版本。Anthos Service Mesh 所需的最小机器类型为 e2-standard-4e2-standard-4。您可以使用任何发布版本选项。

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

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

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

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

    • 设置集群名称:

      export CLUSTER_NAME=YOUR_CLUSTER_NAME

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

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

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
    • 设置工作负载池:

      export WORKLOAD_POOL=${PROJECT_ID}.svc.id.goog
    • 设置网格 ID:

      export MESH_ID="proj-${PROJECT_NUMBER}"
    • 设置发布版本。将 YOUR_CHANNEL 替换为以下某个值:regularstablerapid

      export CHANNEL=YOUR_CHANNEL

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

  3. 为 Google Cloud CLI 设置默认可用区或区域。

    • 对于单区域集群,请设置默认区域:

      gcloud config set compute/zone ${CLUSTER_LOCATION}
    • 对于地区级集群,请设置默认地区:

      gcloud config set compute/region ${CLUSTER_LOCATION}

    提示:为了让您以后更轻松地设置 shell 环境,您可以将每个环境变量的 export 语句复制并粘贴到启动新 shell 时将对其执行 source 的简单 shell 脚本。您还可以添加 gcloud 命令,以将默认值设置为脚本。或者,您可以使用 gcloud init 创建并激活命名的 gcloud 配置。

  4. 使用 Anthos Service Mesh 所需的选项创建集群。以下命令会创建一个集群,其中包含 4 个机器类型为 e2-standard-4e2-standard-4 的节点,该机器类型具有 4 个 vCPU。这是 Anthos Service Mesh 所需的最小机器类型和节点数。您可以指定其他机器类型,前提是该机器类型至少有 4 个 vCPU,并且您可以根据系统要求增加节点数。

    gcloud beta container clusters create ${CLUSTER_NAME} \
        --machine-type=e2-standard-4 \
        --num-nodes=4 \
        --workload-pool=${WORKLOAD_POOL} \
        --enable-stackdriver-kubernetes \
        --subnetwork=default \
        --labels=mesh_id=${MESH_ID} \
        --release-channel=${CHANNEL}

    clusters create 命令包含:

    • workload-pool=${WORKLOAD_POOL}:启用 Workload Identity,这是从 GKE 应用安全访问 Google Cloud 服务的推荐方法。

    • enable-stackdriver-kubernetes:启用 GKE 上的 Cloud Monitoring 和 Cloud Logging

    • subnetwork=default:创建默认子网

    • labels mesh_id=${MESH_ID}:在集群上设置 mesh_id 标签,该标签对于在 Google Cloud 控制台中的 Anthos Service Mesh 页面上显示指标必不可少。

    • release-channel ${CHANNEL}:在指定的发布版本中注册集群。

设置凭据和权限

在继续操作之前,确保您已启用所有必需 API。如果您有任何疑问,不妨再次运行 gcloud services enable 命令。

  1. 初始化您的项目,以便准备好安装。除此之外,此命令还将创建一个服务账号,让 Istio 组件(例如边车代理)可安全地访问您项目的数据和资源:
    curl --request POST \
      --header "Authorization: Bearer $(gcloud auth print-access-token)" \
      --data '' \
      https://meshconfig.googleapis.com/v1alpha1/projects/${PROJECT_ID}:initialize

    该命令会以空花括号作为响应:{}

    如果您日后在此集群上安装新版本的 Anthos Service Mesh,则无需重新运行命令,但再次运行该命令不会影响安装。

  2. 获取用于与集群交互的身份验证凭据
    gcloud container clusters get-credentials ${CLUSTER_NAME}
  3. 向当前用户授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:
    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"

    如果您看到 "cluster-admin-binding" already exists 错误,可以放心地忽略该错误并继续使用现有的集群管理员绑定。

注册您的集群

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

准备安装 Anthos Service Mesh

在继续操作之前,请验证 ASM 网格数据平面服务账号是否为项目成员:

gcloud projects get-iam-policy ${PROJECT_ID} | grep -B 1 'roles/meshdataplane.serviceAgent'

如果上一个命令没有输出任何内容,请返回设置凭据和权限部分,然后运行 curl 命令。

    Linux

  1. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-linux.tar.gz
  2. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-linux.tar.gz.1.sig
    openssl dgst -verify - -signature istio-1.4.10-asm.18-linux.tar.gz.1.sig istio-1.4.10-asm.18-linux.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  3. Mac OS

  4. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-osx.tar.gz
  5. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.4.10-asm.18-osx.tar.gz.1.sig istio-1.4.10-asm.18-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  6. Windows

  7. 将 Anthos Service Mesh 安装文件下载到当前工作目录中:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-win.zip
  8. 下载签名文件并使用 openssl 验证签名:
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.4.10-asm.18-win.zip.1.sig istio-1.4.10-asm.18-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    预期输出为 Verified OK

  9. 将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
    tar xzf istio-1.4.10-asm.18-linux.tar.gz

    该命令会在当前工作目录中创建一个名为 istio-1.4.10-asm.18 的安装目录,其中包含:

    • samples 中的示例应用
    • bin 目录中的以下工具:
      • istioctl:您使用 istioctl 来安装 Anthos Service Mesh。
      • asmctl:安装 Anthos Service Mesh 后,您可以使用 asmctl 来帮助验证安全配置。(目前,GKE on VMware 不支持 asmctl。)

  10. 确保您位于 Anthos Service Mesh 安装的根目录。
    cd istio-1.4.10-asm.18
  11. 为方便起见,请将 /bin 目录中的工具添加到 PATH:
    export PATH=$PWD/bin:$PATH

安装 Anthos Service Mesh

本部分介绍如何安装 Anthos Service Mesh 并启用:

  • 支持的功能页面上列出的支持的默认功能。
  • Anthos Service Mesh 证书授权机构 (Mesh CA)。
  • 为 Google Cloud 控制台中的 Anthos Service Mesh 信息中心提供支持的遥测数据流水线。

如需了解如何启用支持的可选功能,请参阅启用可选功能

如需安装 Anthos Service Mesh,请运行以下命令:

选择以下任一命令,以在 PERMISSIVE 双向 TLS (mTLS) 身份验证模式或 STRICT mTLS 模式下配置 Anthos Service Mesh。

PERMISSIVE mTLS

istioctl manifest apply --set profile=asm \
  --set values.global.trustDomain=${WORKLOAD_POOL} \
  --set values.global.sds.token.aud=${WORKLOAD_POOL} \
  --set values.nodeagent.env.GKE_CLUSTER_URL=https://container.googleapis.com/v1/projects/${PROJECT_ID}/locations/${CLUSTER_LOCATION}/clusters/${CLUSTER_NAME} \
  --set values.global.meshID=${MESH_ID} \
  --set values.global.proxy.env.GCP_METADATA="${PROJECT_ID}|${PROJECT_NUMBER}|${CLUSTER_NAME}|${CLUSTER_LOCATION}"

STRICT mTLS

istioctl manifest apply --set profile=asm \
  --set values.global.trustDomain=${WORKLOAD_POOL} \
  --set values.global.sds.token.aud=${WORKLOAD_POOL} \
  --set values.nodeagent.env.GKE_CLUSTER_URL=https://container.googleapis.com/v1/projects/${PROJECT_ID}/locations/${CLUSTER_LOCATION}/clusters/${CLUSTER_NAME} \
  --set values.global.meshID=${MESH_ID} \
  --set values.global.proxy.env.GCP_METADATA="${PROJECT_ID}|${PROJECT_NUMBER}|${CLUSTER_NAME}|${CLUSTER_LOCATION}" \
  --set values.global.mtls.enabled=true

检查控制层面组件

检查 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 证书。

验证安全功能

我们建议您使用 asmctl 分析工具来验证项目、集群和工作负载的基本配置。如果 asmctl 测试失败,则 asmctl 会尽可能推荐解决方案。asmctl validate 命令会运行检查以下项的基本测试:

  1. 在项目中启用 Anthos Service Mesh 所需的 API。
  2. Istio-Ingressgateway 是否已正确配置为调用 Mesh CA。
  3. Istiod 和 Istio-Ingressgateway 的整体运行状况。

如果您运行带有可选 --with-testing-workloads 标志的 asmctl validate 命令,则除了基本测试外,asmctl 还会运行检查以下项的安全测试:

  1. 双向 TLS (mTLS) 通信是否配置正确。
  2. Mesh CA 是否可以颁发证书。

为了运行安全测试,asmctl 会在测试命名空间中的集群上部署工作负载,运行 mTLS 通信测试,输出结果,并删除测试命名空间。

如需运行 asmctl,请执行以下操作:

  1. 确保已设置 gcloud application-default 凭据:

     gcloud auth application-default login
    
  2. 获取身份验证凭据以与集群进行交互(如果尚未这样做):

     gcloud container clusters get-credentials ${CLUSTER_NAME}
    
  3. 如需同时运行基本和安全测试(假设 istio-1.4.10-asm.18/bin 位于 PATH 中),请运行以下命令:

    asmctl validate --with-testing-workloads
    

    成功后,该命令会以如下所示的输出作为响应:

    [asmctl version 0.3.0]
    Using Kubernetes context: example-project_us-central1-example-cluster
    To change the context, use the --context flag
    Validating enabled APIs
    OK
    Validating ingressgateway configuration
    OK
    Validating istio system
    OK
    Validating sample traffic
    Launching example services...
    Sent traffic to example service http code: 200
    verified mTLS configuration
    OK
    Validating issued certs
    OK
    

注入 Sidecar 代理

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

在部署工作负载之前,请务必配置边车代理注入,以便 Anthos Service Mesh 可以监控和保护流量。

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

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

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

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

启用 Pod 安全政策

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

查看 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 指标

后续步骤