使用 Cloud Service Mesh 和 gcloud CLI 创建 GKE 集群
在本教程中,您将在新的 GKE 公共集群上使用 Google Kubernetes Engine (GKE) Fleet API 预配托管式 Cloud Service Mesh。本教程将引导您完成以下操作:
- 配置 Google Cloud 项目。
- 创建具有 Cloud Service Mesh 所需的最低 vCPU 数量的 GKE 集群。
- 将 GKE 集群注册到项目的舰队。
- 使用 Fleet API 在集群上预配托管式 Cloud Service Mesh。
- 部署入站流量网关以公开应用。
- 部署一个示例应用,以便在 Google Cloud 控制台中的 Cloud Service Mesh 信息中心上查看遥测数据。
- 公开和访问示例应用。
Fleet API
本指南假定您熟悉舰队,舰队是 GKE 集群和可以一起管理的其他资源的逻辑分组。舰队是 GKE 概念,而不是 Kubernetes 概念。将集群注册到舰队后,您可以使用 gcloud container fleet mesh update
命令在该集群上预配托管式 Cloud Service Mesh。舰队的使用由 Fleet API (gkehub.googleapis.com
) 启用,您会在开始本教程时启用它。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成此快速入门后,您可以通过删除集群来避免继续计费。如需了解详情,请参阅清理。
准备工作
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
- 记下您的项目 ID。
安装所需的工具
您可以在 Cloud Shell 或本地机器上运行该工具。Cloud Shell 会预安装所有必需的工具。
Cloud Shell
Cloud Shell 预配一个运行基于 Debian 的 Linux 操作系统的 g1-small Compute Engine 虚拟机 (VM)。使用 Cloud Shell 的优势如下:
Cloud Shell 包含您需要的
gcloud
、kubectl
、git
和其他命令行工具。您的 Cloud Shell $HOME 目录具有 5GB 永久性存储空间。
您可以选择文本编辑器:
代码编辑器,可通过点击 Cloud Shell 窗口顶部的 edit 来访问。
Emac、Vim 或 Nano,可从 Cloud Shell 中的命令行访问。
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
本地计算机
请确保已安装以下工具:
使用 Google Cloud CLI 进行身份验证:
gcloud auth login --project PROJECT_ID
更新组件:
gcloud components update
创建 GKE 集群
运行以下命令,创建具有 Cloud Service Mesh 所需的最少 vCPU 数的集群。在此命令中,将占位符替换为以下信息:
- CLUSTER_NAME:您的集群的名称。名称只能包含小写字母、数字和
-
,并且必必须以字母开头,以字母数字结尾,并且不能超过 40 个字符。 - PROJECT_ID:将在其中创建集群的项目 ID。
- CLUSTER_LOCATION:集群的可用区,例如
us-central1-a
。
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --workload-pool=PROJECT_ID.svc.id.goog
创建集群需要几分钟时间。创建集群时,
gcloud
命令会显示以下内容:Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
成功创建后,预期输出如下所示:
Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID kubeconfig entry generated for CLUSTER_NAME. NAME: CLUSTER_NAME LOCATION: CLUSTER_LOCATION MASTER_VERSION: 1.20.10-gke.1600 MASTER_IP: 198.51.100.1 MACHINE_TYPE: e2-standard-4 NODE_VERSION: 1.20.10-gke.1600 NUM_NODES: 2 STATUS: RUNNING
- CLUSTER_NAME:您的集群的名称。名称只能包含小写字母、数字和
获取身份验证凭据以便与集群进行交互。
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
预期输出:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
将
kubectl
的当前上下文设置为该集群。kubectl config set-context CLUSTER_NAME
预期输出:
Context "CLUSTER_NAME" created.
预配 Cloud Service Mesh
如果您在创建集群以来未关闭过此页面,则占位符具有您为 gcloud container clusters create
命令输入的值。
在项目的舰队上启用 Cloud Service Mesh。
gcloud container fleet mesh enable --project PROJECT_ID
输出类似于以下内容:
Waiting for Feature Service Mesh to be created...done.
将集群注册到项目的舰队:
gcloud container fleet memberships register CLUSTER_NAME-membership \ --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
输出类似于以下内容:
Waiting for membership to be created...done. Finished registering to the Fleet.
使用 Fleet API 在集群上预配托管式 Cloud Service Mesh:
gcloud container fleet mesh update \ --management automatic \ --memberships CLUSTER_NAME-membership \ --project PROJECT_ID
输出类似于以下内容:
Waiting for Feature Service Mesh to be updated...done.
验证已为集群启用代管式 Cloud Service Mesh 并且可供使用:
gcloud container fleet mesh describe --project PROJECT_ID
Cloud Service Mesh 可能需要大约 10 分钟才能完成预配且可在集群上使用。如果您看到
controlPlaneManagement.state: DISABLED
或controlPlaneManagement.state: PROVISIONING
,则需要每隔几分钟重新运行一次上述命令,直到您看到controlPlaneManagement.state: ACTIVE
。输出类似于以下内容:
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/your-cluster-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/your-cluster-membership: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: 'Revision(s) ready for use: asm-managed.' updateTime: '2022-07-06T01:19:24.243993678Z' name: projects/your-project-id/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-07-06T01:19:27.475885687Z'
下载示例代码
克隆包含本教程中使用的示例代码的 Git 代码库:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
本教程的后续部分将使用 DIR_PATH 变量。将此变量设置为您克隆的 anthos-service-mesh-packages
代码库的路径(例如 ./anthos-service-mesh-packages
)。
部署入站流量网关
Cloud Service Mesh 允许您将网关部署和管理为服务网格的一部分。网关描述了在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。网关是 Envoy 代理,可让您精确控制进出网格的流量。
为入站流量网关创建命名空间(如果您还没有命名空间)。网关是用户工作负载,最佳做法是不应部署在控制平面命名空间中。将
GATEWAY_NAMESPACE
替换为您的命名空间名称。kubectl create namespace GATEWAY_NAMESPACE
预期输出:
namespace/GATEWAY_NAMESPACE created
在网关上启用自动注入功能。所需步骤取决于您是要在网关命名空间中使用默认注入标签(例如
istio-injection=enabled
)还是修订版本标签。Sidecar 注入器网络钩子会使用默认的修订版本标记和修订版本标签来将注入的代理与特定控制层面修订版本相关联。默认注入标签
将默认注入标签应用于命名空间。
kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
修订版本标签
使用以下命令查找
istiod
的修订版本标签:kubectl get deploy -n istio-system -l app=istiod -o \ "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
该命令会输出与 Cloud Service Mesh 版本对应的修订版本标签,例如:
asm-1187-26
将修订版本标签应用于命名空间。在以下命令中,
REVISION
是您在上一步中记下的istiod
修订版本标签的值。kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev=REVISION --overwrite
预期输出:
namespace/GATEWAY_NAMESPACE labeled
您可以忽略输出中的
"istio.io/rev" not found
消息。这意味着命名空间之前没有istio.io/rev
标签,对于 Cloud Service Mesh 的新安装或新部署,这是预期现象。如果命名空间同时具有istio.io/rev
和istio-injection
标签,自动注入将失败,因此 Cloud Service Mesh 文档中的所有kubectl label
命令都会明确指定这两个标签。如果网关命名空间未添加标签,则在网关尝试拉取
auto
映像时,istio-ingressgateway
Pod 将失败并显示ImagePullBackOff
错误。此映像应替换为 webhook。从
anthos-service-mesh-packages
代码库下载示例入站流量网关 .yaml 配置文件。按原样应用示例入站流量网关 .yaml 配置,或根据需要进行修改。
kubectl apply -n GATEWAY_NAMESPACE \ -f CONFIG_PATH/istio-ingressgateway
预期输出:
deployment.apps/istio-ingressgateway created poddisruptionbudget.policy/istio-ingressgateway created horizontalpodautoscaler.autoscaling/istio-ingressgateway created role.rbac.authorization.k8s.io/istio-ingressgateway created rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created service/istio-ingressgateway created serviceaccount/istio-ingressgateway created
详细了解网关的最佳做法。
部署 Online Boutique 示例
anthos-service-mesh-packages
代码库中的 Online Boutique 示例应用在 microservices-demo
代码库中原始清单集的基础上进行了修改。按照最佳做法,每项服务都会部署在具有唯一服务账号的单独命名空间中。
为应用创建命名空间:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
预期输出:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
启用自动 Sidecar 注入(自动注入)。所需命令取决于您是要使用默认注入标签(例如
istio-injection=enabled
)还是使用用于注释入站流量网关命名空间的相同修订版本标签。默认注入标签
将默认注入标签应用于命名空间。在以下命令中,GATEWAY_NAMESPACE 与您用于为入站流量网关命名空间添加注释的值相同。
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio-injection=enabled istio.io/rev- done;
预期输出:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
修订版本标签
将修订版本标签应用于应用命名空间。 在以下命令中,REVISION 与您用于为入站流量网关命名空间添加注释的值相同。
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
预期输出:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
将示例应用部署到集群。
创建服务账号和部署:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
预期输出:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
创建服务:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/services
预期输出:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
创建服务条目:
kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
预期输出:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
公开和访问应用
您可以通过多种方式公开应用。在本指南中,我们将使用上面部署的入站流量网关执行此操作。如需了解公开 Online Boutique 应用的其他方法,请参阅部署 Online Boutique 示例应用指南中的公开和访问应用部分。
为前端服务部署
Gateway
和VirtualService
kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
预期输出:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
获取入站流量网关的外部 IP 地址,将占位符替换为以下信息:
- GATEWAY_SERVICE_NAME:入站流量网关服务的名称。如果您部署了示例网关而未进行修改,则网关为
istio-ingressgateway
。 - GATEWAY_NAMESPACE:部署入站流量网关的命名空间:
kubectl get service GATEWAY_SERVICE_NAME \ -n GATEWAY_NAMESPACE
输出类似于以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
在此示例中,入站流量网关的 IP 地址为
35.239.7.64
。- GATEWAY_SERVICE_NAME:入站流量网关服务的名称。如果您部署了示例网关而未进行修改,则网关为
使用浏览器访问应用,以确认安装:
http://EXTERNAL_IP/
查看 Service Mesh 信息中心
在集群上部署工作负载并注入边车代理后,您可以在 Google Cloud 控制台中探索 Cloud Service Mesh 页面,以了解 Cloud Service Mesh 提供的所有可观测性功能。请注意,部署工作负载后,遥测数据大约需要一两分钟才会显示在 Google Cloud 控制台中。
在 Google Cloud 控制台中访问 Cloud Service Mesh 的权限由 Identity and Access Management (IAM) 控制。如需访问 Cloud Service Mesh 页面,Project Owner 必须为用户授予 Project Editor 或 Viewer 角色,或者授予在 Google Cloud 控制台中控制对 Cloud Service Mesh 的访问权限中所述的限制性更强的角色。
在 Google Cloud 控制台中,前往 Cloud Service Mesh。
从菜单栏的下拉列表中选择 Google Cloud 项目。
如果您有多个服务网格,请从服务网格下拉列表中选择相应网格。
如需了解详情,请参阅在 Google Cloud 控制台中探索 Cloud Service Mesh。
清理
在清理之前,如果您有兴趣详细了解双向 TLS,请参阅 Cloud Service Mesh(例如:mTLS)。
如果您希望保留集群并移除 Online Boutique 示例,请执行以下操作:
删除应用命名空间:
kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
预期输出:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
删除服务条目:
kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
预期输出:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
如果您想防止产生额外费用,请删除集群:
运行以下命令:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
在是否要继续(是/否)?提示处,输入是。
几分钟后,您将看到以下输出:
Deleting cluster CLUSTER_NAME...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
后续步骤
- 如需详细了解托管式 Cloud Service Mesh,请参阅预配托管式 Cloud Service Mesh
- 如需快速了解本教程中使用的 gcloud CLI,请参阅
gcloud
命令 - 如需了解如何在 Google Cloud 控制台中探索 Cloud Service Mesh,请参阅在 Google Cloud 控制台中探索 Cloud Service Mesh
- 如需探索 Cloud Service Mesh 的可选功能(例如 Cloud Trace、Distroless 代理映像和最终用户身份验证),请参阅在代管式 Cloud Service Mesh 上启用可选功能
- 如需详细了解 Cloud Service Mesh 中的安全性,请参阅 Cloud Service Mesh 安全概览和 Cloud Service Mesh 安全性最佳实践
- 如需详细了解 Cloud Service Mesh 中的遥测功能,请参阅可观测性概览