在现有集群上安装 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。如果您安装了先前版本的 Anthos Service Mesh,请参阅升级 GKE 上的 Anthos Service Mesh

安装会启用以下功能:

准备工作

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

使用要求

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

  • 您的 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 集群。如需了解详情,请参阅 GKE 文档

  1. 创建以下环境变量:

    • 设置集群名称。

      export CLUSTER_NAME=YOUR_CLUSTER_NAME

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

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION

    • 设置工作负载池。

      export WORKLOAD_POOL=${PROJECT_ID}.svc.id.goog

    • 设置网格 ID。

      export MESH_ID="proj-${PROJECT_NUMBER}"

  2. 为 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 配置。

  3. 在集群上设置 mesh_id 标签,该标签对于在 Google Cloud 控制台中的 Anthos Service Mesh 信息中心显示指标必不可少。如果您的集群已有要保留的标签,则在添加 mesh_id 标签时必须将这些标签包含在内。

    1. 如需查看您的集群是否已有标签,请执行以下操作:

      gcloud container clusters describe ${CLUSTER_NAME}

      在输出中查找 resourceLabels 字段。每个标签都存储在 resourceLabels 字段下的单独的一行中,例如:

      resourceLabels:
        csm: ''
        env: dev
        release: stable

      如果 csm 标签位于输出中,则无需保留该标签。mesh_id 标签将替换 csm 标签。

      为方便起见,您可以向环境变量添加标签。在以下命令中,请将 YOUR_EXISTING_LABELS 替换为集群上以英文逗号分隔的现有标签列表,格式为 KEY=VALUE,例如:env=dev,release=stable

      export EXISTING_LABELS="YOUR_EXISTING_LABELS"
    2. 设置 mesh_id 标签:

      • 如果您的集群已有要保留的标签,请使用 mesh_id 和现有标签更新集群:

        gcloud container clusters update ${CLUSTER_NAME} \
          --update-labels=mesh_id=${MESH_ID},${EXISTING_LABELS}
      • 如果您的集群没有任何现有标签,请仅使用 mesh_id 标签更新集群:

        gcloud container clusters update ${CLUSTER_NAME} \
          --update-labels=mesh_id=${MESH_ID}
  4. 启用 Workload Identity

    gcloud container clusters update ${CLUSTER_NAME} \
       --workload-pool=${WORKLOAD_POOL}
  5. 启用 GKE 上的 Cloud Monitoring 和 Cloud Logging

    gcloud container clusters update ${CLUSTER_NAME} \
       --enable-stackdriver-kubernetes
  6. 如果您的集群使用 GKE 静态版本,请在发布版本中注册集群

设置凭据和权限

在继续操作之前,确保您已启用所有必需 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 之前在集群上运行的任何工作负载都需要注入或更新边车代理,以使其具有当前的 Anthos Service Mesh 版本。在部署新工作负载之前,确保配置边车代理注入,以便 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 指标

后续步骤