在本教程中,您将使用 Google 提供的工具 asmcli
在新的 Google Kubernetes Engine (GKE) 集群上安装 Anthos Service Mesh 1.11.8-asm.4。本教程将引导您完成以下操作:
- 配置 Google Cloud 项目。
- 创建具有 Anthos Service Mesh 所需的最低 vCPU 数量的 GKE 集群。
- 使用集群内控制层面安装 Anthos Service Mesh。
- 部署一个示例应用,以便在 Google Cloud 控制台中的 Anthos Service Mesh 信息中心上查看遥测数据。
- 公开和访问示例应用。
为了简化快速入门以及避免多个不同的路径,实施了以下选项:
- 启用 Anthos Service Mesh 证书授权机构 (Mesh CA)
- 部署入站流量网关以公开应用
费用
在本文档中,您将使用 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 Kubernetes Engine API.
-
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 Kubernetes Engine API.
- 记下您的项目 ID。
虽然 Anthos Service Mesh 需要其他 API,但 asmcli
会为您启用这些 API。为了降低结算费用,asmcli
脚本未启用 GKE Enterprise API。启用 GKE Enterprise API 后,Google Cloud 控制台存在一些细微差别。如需详细了解这些差异,请参阅 GKE Enterprise 和 Anthos Service Mesh 界面差异。
安装所需的工具
您可以在 Cloud Shell 或运行 Linux 的本地计算机上运行该工具。Cloud Shell 会预安装所有必需的工具。请注意,由于 macOS 附带了旧版 bash,因此不支持 macOS。
Cloud Shell
Cloud Shell 预配一个运行基于 Debian 的 Linux 操作系统的 g1-small Compute Engine 虚拟机 (VM)。使用 Cloud Shell 的优势如下:
Cloud Shell 包含您需要的
gcloud
、kubectl
、kpt
和其他命令行工具。您的 Cloud Shell $HOME 目录具有 5GB 永久性存储空间。
您可以选择文本编辑器:
代码编辑器,可通过点击 Cloud Shell 窗口顶部的 edit 来访问。
Emac、Vim 或 Nano,可从 Cloud Shell 中的命令行访问。
如需使用 Cloud Shell,请执行以下操作:
- 前往 Google Cloud 控制台。
- 选择您的 Google Cloud 项目。
点击 Google Cloud 控制台窗口顶部的激活 Cloud Shell 按钮。
一个 Cloud Shell 会话随即会在 Google Cloud 控制台底部的新框内打开,并显示命令行提示符。
本地 Linux 计算机
请确保已安装以下工具:
- Google Cloud CLI
- 标准命令行工具:
awk
、curl
、grep
、sed
、tr
- git
- kpt
- kubectl
- jq
使用 gcloud CLI 进行身份验证:
gcloud auth login
更新组件:
gcloud components update
请确保
git
位于您的路径中,以便kpt
能够找到它。
创建 GKE 集群
运行以下命令,创建具有 Anthos 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.
下载 asmcli
本部分介绍如何下载 asmcli
。
将安装 Anthos Service Mesh 1.11.8 的版本下载到当前工作目录:
curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.11 > asmcli
预期输出:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 167k 100 167k 0 0 701k 0 --:--:-- --:--:-- --:--:-- 701k
让该脚本可执行:
chmod +x asmcli
安装 Anthos Service Mesh
使用以下选项运行 asmcli
工具,以在之前创建的集群上安装 Anthos Service Mesh。如果您在创建集群以来未关闭过此页面,则占位符具有您为 gcloud container clusters create
命令输入的值。
./asmcli install \
--project_id PROJECT_ID \
--cluster_name CLUSTER_NAME \
--cluster_location CLUSTER_LOCATION \
--fleet_id FLEET_PROJECT_ID \
--output_dir DIR_PATH \
--enable_all \
--ca mesh_ca
--project_id
、--cluster_name
和 --cluster_location
指定集群所在的项目 ID、集群名称以及集群区域或地区。--fleet_id
:队列宿主项目的项目 ID。如果您未包含此选项,则 asmcli
会使用注册集群时在其中创建集群的项目。--output_dir
添加此选项可指定 asmcli
在其中下载 anthos-service-mesh
软件包并提取安装文件的目录,其中包含 istioctl
、示例和清单。否则,asmcli
会将文件下载到 tmp
目录。您可以指定相对路径或完整路径。环境变量 $PWD
不适用于此处。
--enable_all
允许脚本执行以下操作:- 授予所需的 IAM 权限
- 启用所需的 Google API。
- 在集群上设置用于标识网格的标签。
- 如果尚未注册集群,请注册集群。
asmcli
工具完成运行可能需要几分钟时间。该工具会输出信息性消息,便于您跟踪其进度。
成功安装后预期输出为:
asmcli: Successfully installed ASM.
部署入站流量网关
Anthos Service Mesh 允许您将网关部署和管理为服务网格的一部分。网关描述了在网格边缘运行的负载均衡器,用于接收传入或传出 HTTP/TCP 连接。网关是 Envoy 代理,可让您精确控制进出网格的流量。
为入站流量网关创建命名空间(如果您还没有命名空间)。网关是用户工作负载,最佳做法是不应部署在控制平面命名空间中。将
GATEWAY_NAMESPACE
替换为您的命名空间名称。kubectl create namespace GATEWAY_NAMESPACE
预期输出:
namespace/GATEWAY_NAMESPACE created
通过在网关命名空间中应用修订版本标签,在网关上启用自动注入功能。边车注入器网络钩子会使用修订版本标签将注入的代理与特定控制平面修订版本相关联。
使用以下命令查找
istiod
的修订版本标签:kubectl get deploy -n istio-system -l app=istiod -o \ "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
该命令会输出与 Anthos Service Mesh 版本对应的修订版本标签,例如:
asm-1118-4
将修订版本标签应用于命名空间。在以下命令中,
REVISION
是您在上一步中记下的istiod
修订版本标签的值。kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev=REVISION --overwrite
预期输出:
namespace/GATEWAY_NAMESPACE labeled
您可以按原样部署位于
samples/gateways/istio-ingressgateway/
目录中的示例入站流量网关配置,也可以根据需要对其进行修改。kubectl apply -n GATEWAY_NAMESPACE \ -f DIR_PATH/samples/gateways/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 注入(自动注入)。此处使用的修订版本标签与用于为入站流量网关命名空间添加注释的标签相同。将修订版本标签应用于应用命名空间。在以下命令中,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 控制台中探索 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。
清理
在清理之前,如果您有兴趣详细了解双向 TLS,请参阅 Anthos 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].
后续步骤
详细了解以下内容:
- 集群要求
asmcli
工具的选项和标志。- 部署 Service
- 在本教程中使用的
gcloud
命令