本指南介绍如何在 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 进行配置。请参阅支持的功能。
设置环境
您可以使用 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
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages kubectl apply -n bank-gateways \ -f ./anthos-service-mesh-packages/samples/gateways/istio-ingressgateway kubectl -n bank-gateways 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 进行身份验证和加密。