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 可观测性功能。
- Anthos Service Mesh 安全功能,包括 Anthos Service Mesh 证书授权机构 (Mesh CA)。
- 支持的 Istio 功能。
准备工作
本指南假定您已具备:
- 具有一个 Google Cloud 项目。
- Cloud Billing 账号。
在开始设置前,请查看以下要求和限制。
使用要求
您必须拥有 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 服务账号名称
设置项目
-
获取将在其中创建集群的项目的 ID:
gcloud
gcloud projects list
控制台
- 在 Google Cloud 控制台中,转到信息中心页面:
-
点击页面顶部的从以下列表中选择:下拉列表。在随即显示的从以下列表中选择:窗口中,选择您的项目。
项目 ID 会显示在项目信息中心的项目信息卡片上。
- 为项目 ID 创建环境变量:
export PROJECT_ID=YOUR_PROJECT_ID
-
为
gcloud
命令行工具设置默认项目 ID:gcloud config set project ${PROJECT_ID}
- 为项目编号创建环境变量:
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
-
设置所需的 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 所需的权限
- 启用以下 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 发布版本。Anthos Service Mesh 所需的最小机器类型为 e2-standard-4e2-standard-4。您可以使用任何发布版本选项。
创建以下环境变量:
设置集群名称:
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
替换为以下某个值:regular
、stable
或rapid
。export CHANNEL=YOUR_CHANNEL
如需了解每个发布版本,请参阅您可以获得哪些发布版本。
为 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
配置。使用 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 命令。
- 初始化您的项目,以便准备好安装。除此之外,此命令还将创建一个服务账号,让 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,则无需重新运行命令,但再次运行该命令不会影响安装。
-
获取用于与集群交互的身份验证凭据:
gcloud container clusters get-credentials ${CLUSTER_NAME}
-
向当前用户授予集群管理员权限。您需要这些权限,以便为 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 文件才能注册集群。为遵循最小权限原则,我们建议您为注册的每个集群创建不同的服务账号。
如需创建服务账号和密钥文件,请执行以下操作:
为服务账号选择一个名称并为其创建环境变量:
export SERVICE_ACCOUNT_NAME=SERVICE_ACCOUNT_NAME
创建服务账号:
gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME}
列出项目的所有服务账号以确认服务账号已创建:
gcloud iam service-accounts list
将 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"
为您要保存 JSON 文件的本地文件路径创建环境变量。我们建议您使用服务账号名称和项目 ID 命名文件,例如:
/tmp/creds/${SERVICE_ACCOUNT_NAME}-${PROJECT_ID}.json
export SERVICE_ACCOUNT_KEY_PATH=LOCAL_KEY_PATH
下载服务账号的私钥 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
命令。
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-linux.tar.gz
-
下载签名文件并使用
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
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-osx.tar.gz
-
下载签名文件并使用
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
-
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-win.zip
-
下载签名文件并使用
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
-
将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
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
。)
-
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.4.10-asm.18
-
为方便起见,请将
/bin
目录中的工具添加到 PATH:export PATH=$PWD/bin:$PATH
Linux
Mac OS
Windows
安装 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
命令会运行检查以下项的基本测试:
- 在项目中启用 Anthos Service Mesh 所需的 API。
- Istio-Ingressgateway 是否已正确配置为调用 Mesh CA。
- Istiod 和 Istio-Ingressgateway 的整体运行状况。
如果您运行带有可选 --with-testing-workloads
标志的 asmctl validate
命令,则除了基本测试外,asmctl
还会运行检查以下项的安全测试:
- 双向 TLS (mTLS) 通信是否配置正确。
- Mesh CA 是否可以颁发证书。
为了运行安全测试,asmctl
会在测试命名空间中的集群上部署工作负载,运行 mTLS 通信测试,输出结果,并删除测试命名空间。
如需运行 asmctl
,请执行以下操作:
确保已设置 gcloud application-default 凭据:
gcloud auth application-default login
获取身份验证凭据以与集群进行交互(如果尚未这样做):
gcloud container clusters get-credentials ${CLUSTER_NAME}
如需同时运行基本和安全测试(假设
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 的访问权限中所述的限制性更强的角色。
在 Google Cloud 控制台中,前往 Anthos Service Mesh。
从菜单栏的下拉列表中选择 Google Cloud 项目。
如果您有多个服务网格,请从服务网格下拉列表中选择相应网格。
如需了解详情,请参阅在 Google Cloud 控制台中探索 Anthos Service Mesh。
除了 Anthos Service Mesh 页面,系统还会将与服务相关的指标(例如特定服务收到的请求数)发送到 Cloud Monitoring,这些指标显示在 Cloud Monitoring 的 Metrics Explorer 中。
如需查看指标,请执行以下操作:
在 Google Cloud 控制台中,转到监控页面:
选择资源 > Metrics Explorer。
如需查看指标的完整列表,请参阅 Cloud Monitoring 文档中的 Istio 指标。