本指南介绍如何在 Google Kubernetes Engine (GKE) Autopilot 集群上设置托管式 Cloud Service Mesh。Cloud Service Mesh 是基于 Istio 的全托管式服务网格。
本教程介绍如何使用默认设置,配置在单个 GKE Autopilot 集群上运行的支持生产环境的服务网格。我们建议您在设计环境时还参考完整的 Cloud Service Mesh 预配指南。
使用 GKE Autopilot 运行托管式 Cloud Service Mesh 的优势
当您在 Autopilot 模式下使用 GKE 时,Google 会自动处理集群的设置和管理。Autopilot 模式简化了操作集群的体验,可让您专注于自己的应用。同样,托管式 Cloud Service Mesh 是一种全托管式服务网格,您可以按照以下几个步骤进行预配。
- 您可以使用 Fleet API 预配托管式 Cloud Service Mesh,而无需
istioctl
等客户端工具。 - Cloud Service Mesh 会自动将边车代理注入到工作负载中,而无需向容器授予提升的权限。
- 您无需进行任何额外配置,即可查看适用于网格和服务的丰富信息中心,然后使用这些指标配置服务等级目标 (SLO) 和提醒,以监控应用的运行状况
- 托管式 Cloud Service Mesh 控制平面会自动升级,以确保您获得最新的安全补丁和功能
- Cloud Service Mesh 托管式数据平面会自动升级工作负载中的边车代理,以便在代理升级和安全补丁可用时,您无需自行重启服务
- Cloud Service Mesh 是受支持的产品,可以使用标准开源 Istio API 进行配置。请参阅支持的功能。
目标
- 创建 GKE Autopilot 集群
- 使用 Fleet API 预配托管式 Cloud Service Mesh
- 将网格入站流量网关部署到专用命名空间中
- 部署一个示例应用
- 配置 Cloud Service Mesh,以对服务间通信强制执行严格的双向 TLS (mTLS) 身份验证
- 查看 Cloud Service Mesh 信息中心,并验证服务是否与 mTLS 连接
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
Cloud Shell 预安装了本教程所需的软件,包括 kubectl
、gcloud CLI、Helm 和 Terraform。如果您不使用 Cloud Shell,则必须安装 gcloud CLI。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
设置您的环境
您可以使用 gcloud CLI 或 Terraform 设置环境。
gcloud
设置环境变量:
PROJECT_ID=PROJECT_ID gcloud config set project ${PROJECT_ID}
启用 Mesh API:
gcloud services enable mesh.googleapis.com
启用 mesh.googleapis.com 会启用以下 API:
API 用途 是否可以停用 meshconfig.googleapis.com
Cloud Service Mesh 使用 Mesh Configuration API 将配置数据从网格中继到 Google Cloud。此外,启用 Mesh Configuration API 后,您可以访问 Google Cloud 控制台中的 Cloud Service Mesh 页面以及使用 Cloud Service Mesh 证书授权机构。 否 meshca.googleapis.com
与托管式 Cloud Service Mesh 使用的 Cloud Service Mesh 证书授权机构相关。 否 container.googleapis.com
必须启用此 API 才能创建 Google Kubernetes Engine (GKE) 集群。 否 gkehub.googleapis.com
必须启用此 API 才能以舰队形式管理网格。 否 monitoring.googleapis.com
必须启用此 API 才能捕获网格工作负载的遥测数据。 否 stackdriver.googleapis.com
必须启用此 API 才能使用服务界面。 否 opsconfigmonitoring.googleapis.com
必须启用此 API 才能将服务界面用于 Google Cloud 外部的集群。 否 connectgateway.googleapis.com
此 API 是必需的,以便托管式 Cloud Service Mesh 控制平面可以访问网格工作负载。 是* trafficdirector.googleapis.com
实现可用性高且可伸缩的托管式控制平面。 是* networkservices.googleapis.com
实现可用性高且可伸缩的托管式控制平面。 是* networksecurity.googleapis.com
实现可用性高且可伸缩的托管式控制平面。 是*
Terraform
gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT
创建 GKE 集群
在 Autopilot 模式下创建 GKE 集群。
gcloud
创建一个注册为舰队成员的集群:
gcloud container clusters create-auto asm-cluster \ --location="us-central1" \ --enable-fleet
验证是否已向舰队注册集群:
gcloud container fleet memberships list
输出类似于以下内容:
NAME: asm-cluster EXTERNAL_ID: LOCATION: us-central1
记下成员资格名称,因为您需要使用它配置 Cloud Service Mesh。
Terraform
如需创建 GKE 集群,您可以使用 google_container_cluster
资源。您可以设置 fleet
块,以便在创建集群时将其添加到舰队中。
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
预配托管式 Cloud Service Mesh
您可以针对集群的舰队成员资格,使用 servicemesh
功能预配托管式 Cloud Service Mesh。
gcloud
在项目上启用 Cloud Service Mesh 舰队功能:
gcloud container fleet mesh enable
启用网格的自动管理:
gcloud container fleet mesh update \ --management=automatic \ --memberships=MEMBERSHIP_NAME \ --location=us-central1
将
MEMBERSHIP_NAME
替换为您在验证集群是否已注册到舰队时列出的成员资格名称。
Terraform
如需启用 Mesh API,您可以使用 google_project_service
资源。
您可以使用 google_gke_hub_feature
和 google_gke_hub_feature_membership
资源在集群上配置托管式 Cloud Service Mesh。
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
验证控制平面是否处于活动状态
等待 controlPlaneManagement.state
成为 ACTIVE
。此过程最多可能需要 15 分钟。
watch -n 30 gcloud container fleet mesh describe
输出类似于以下内容:
membershipSpecs:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
mesh:
management: MANAGEMENT_AUTOMATIC
membershipStates:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
servicemesh:
controlPlaneManagement:
details:
- code: REVISION_READY
details: 'Ready: asm-managed'
state: ACTIVE
dataPlaneManagement:
details:
- code: PROVISIONING
details: Service is provisioning.
state: PROVISIONING
state:
code: OK
description: 'Revision(s) ready for use: asm-managed.'
dataPlaneManagement
部分会保持 PROVISIONING
状态,直到您部署入站流量网关,因为 Autopilot 集群在您部署工作负载之前不会预配任何节点。
部署网格入站流量网关
在本部分中,您将部署网格入站流量网关来处理示例应用的传入流量。入站流量网关是在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。
将网关部署到专用命名空间并为部署添加标签,以确保可以由 Cloud Service Mesh 控制平面安全地管理和自动升级网关。
下载凭据,以便您可以访问集群:
gcloud container clusters get-credentials asm-cluster --location=us-central1
为网关部署创建命名空间:
kubectl create namespace bank-gateways
向命名空间添加标签,以便 Cloud Service Mesh 控制平面自动将网关配置注入到部署中。
kubectl label namespace bank-gateways istio-injection=enabled
将入站流量网关部署到命名空间:
Helm
helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update helm install --wait --namespace bank-gateways \ --set resources.requests.cpu=250m \ --set resources.requests.memory=512Mi \ --set resources.requests.ephemeral-storage=1Gi \ --set resources.limits.cpu=250m \ --set resources.limits.memory=512Mi \ --set resources.limits.ephemeral-storage=1Gi \ istio-ingressgateway istio/gateway
kubectl
kubectl apply -n bank-gateways \ -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway kubectl -n bank-gateway wait "deployment/istio-ingressgateway" \ --for=condition=available --timeout=240s
确保在部署到生产环境时设置足够的资源请求。GKE Autopilot 仅考虑在
requests
中设置的资源值,而不考虑limits
。Istio 项目会发布有关性能和可伸缩性的信息。
部署示例应用
为代理创建 Kubernetes 命名空间:
kubectl create namespace bank-sample
向命名空间添加标签,以便 Cloud Service Mesh 自动将边车代理注入到示例 Pod 中:
kubectl label namespace bank-sample istio-injection=enabled
部署示例应用:
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
等待应用准备就绪。这需要几分钟时间。
watch kubectl -n bank-sample get pods
应用准备就绪后,输出类似于以下内容:
NAME READY STATUS RESTARTS AGE accounts-db-0 2/2 Running 0 2m16s balancereader-5c695f78f5-x4wlz 2/2 Running 0 3m8s contacts-557fc79c5-5d7fg 2/2 Running 0 3m7s frontend-7dd589c5d7-b4cgq 2/2 Running 0 3m7s ledger-db-0 2/2 Running 0 3m6s ledgerwriter-6497f5cf9b-25c6x 2/2 Running 0 3m5s loadgenerator-57f6896fd6-lx5df 2/2 Running 0 3m5s transactionhistory-6c498965f-tl2sk 2/2 Running 0 3m4s userservice-95f44b65b-mlk2p 2/2 Running 0 3m4s
创建 Istio
Gateway
和VirtualService
资源以公开处于入站流量网关后面的应用:kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
获取示例应用的链接:
INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"
在浏览器中,点击链接以打开示例应用。使用默认用户名和密码登录以查看应用。
强制执行双向 TLS
确保已启用 STRICT 双向 TLS (mTLS) 模式。为 istio-system 命名空间中的网格应用默认的 PeerAuthentication
政策。
将以下清单保存为
mesh-peer-authn.yaml
:apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: STRICT
将清单应用于集群:
kubectl apply -f mesh-peer-authn.yaml
您可以通过在特定命名空间中创建 PeerAuthentication
资源来替换此配置。
探索 Cloud Service Mesh 信息中心
在 Google Cloud 控制台中,前往 Cloud Service Mesh 以查看您的网格的信息中心:
从菜单栏的下拉列表中选择项目。
您会看到一个包含网格中所有微服务的概览表格,以及微服务之间的连接的图形直观呈现。对于每个微服务,该表格显示了三个 SRE“黄金信号”:
- 流量 - 每秒请求数
- 错误率 - 百分比
- 延迟时间 - 毫秒
这些指标基于微服务所处理的实际流量。持续测试流量由作为示例应用的一部分部署的
loadgenerator
客户端自动发送到frontend
服务。Cloud Service Mesh 会自动将指标、日志和(可选)跟踪记录发送到 Google Cloud Observability。点击表格中的
frontend
服务可查看服务的概览信息中心。您会看到服务的其他指标以及入站和出站连接的直观呈现。您还可以创建服务等级目标 (SLO),以监控服务并发出提醒。
验证是否已启用 mTLS
点击面板中的安全性链接,查看 frontend
服务的安全性概览。表格和直观呈现会对微服务之间的每个入站和出站连接显示绿色锁形图标。此图标表示连接使用 mTLS 进行身份验证和加密。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请执行以下操作:
删除项目
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
逐个删除资源
如果您使用的是现有项目,并且不想将其删除,请逐个删除资源。
gcloud
删除示例应用和网关:
kubectl delete namespace bank-sample kubectl delete namespace bank-gateways
删除 GKE 集群:
gcloud container clusters delete --region us-central1 asm-cluster --quiet
Terraform
删除您使用 Terraform 创建的资源:
terraform destroy