本指南介绍如何使用 Mesh CA 或 Citadel 以及启用跨集群负载均衡将两个集群联接到单个 Anthos Service Mesh。您可以轻松扩展此流程,将任意数量的集群整合到网格中。
多集群 Anthos Service Mesh 配置可以满足一些重要企业场景,例如扩缩、位置和隔离。如需了解详情,请参阅多集群用例。此外,您还应优化您的应用,以充分利用服务网格。如需了解详情,请参阅准备适用于 Anthos Service Mesh 的应用。
前提条件
本指南假定您有两个或多个满足以下要求的 Google Cloud GKE 集群:
- 集群上安装有 Anthos Service Mesh 1.6.8 或更高版本。
- 如果您要联接的集群不在同一个项目中,则必须使用
asm-gcp-multiproject
配置文件进行安装,并且这些集群必须位于同一网络的共享 VPC 配置中。此外,我们建议您用一个项目托管共享 VPC,以及两个服务项目用于创建集群的。如需了解详情,请参阅通过共享 VPC 设置集群。 - 如果您使用 Citadel CA,请对这两个集群使用同一自定义根 CA。
- 如果您的 Anthos Service Mesh 基于专用集群构建,我们建议您在同一 VPC 中创建单个子网否则您必须确保:
- 控制层面可以通过集群专用 IP 访问远程专用集群控制层面。
- 您可以将调用控制层面的 IP 范围添加到远程专用集群的已获授权的网络。如需了解详情,请参阅在专用集群之间配置端点发现。
设置项目和集群变量
为方便起见,请设置工作文件夹。这是您在之前的步骤准备安装 Anthos Service Mesh 中下载并解压缩 Anthos Service Mesh 文件的文件夹。
export PROJECT_DIR=YOUR_WORKING_FOLDER
为每个集群创建上下文变量。上下文是由集群项目 ID、集群名称和位置构成的字符串。对于位置值,请使用集群的位置,例如
us-west2-a
。在此示例中,网格包含一个集群,您需要向网格添加另一个集群:export CTX_1=gke_CLUSTER_1_PROJECT_ID_CLUSTER_1_LOCATION_CLUSTER_1_NAME export CTX_2=gke_CLUSTER_2_PROJECT_ID_CLUSTER_2_LOCATION_CLUSTER_2_NAME
在集群之间配置端点发现
使用以下命令为跨集群负载均衡配置端点发现。此步骤执行以下任务:
istioctl
命令会创建密钥,以授予对集群的 Kube API 服务器的访问权限。kubectl
命令将密钥应用于另一个集群,以便第二个集群从第一个集群中读取服务端点。
istioctl x create-remote-secret --context=${CTX_1} --name=${CLUSTER_1_NAME} | \ kubectl apply -f - --context=${CTX_2}
istioctl x create-remote-secret --context=${CTX_2} --name=${CLUSTER_2_NAME} | \ kubectl apply -f - --context=${CTX_1}
验证您的部署
本部分介绍如何将示例 HelloWorld
服务部署到多集群环境,以验证跨集群负载均衡是否正常工作。
启用 Sidecar 注入
使用以下命令查找
istiod
服务中使用的修订版本标签值,您将在后续步骤中用到该值。kubectl -n istio-system get pods -l app=istiod --show-labels
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
在输出中的
LABELS
列下,记下istiod
修订版本标签的值,该值位于前缀istio.io/rev=
之后。在此示例中,该值为asm-173-3
。在下一部分的步骤中使用该修订版本值。
安装 HelloWorld 服务
在每个集群中创建示例命名空间和服务定义。
在每个集群中创建示例命名空间:
kubectl create --context=${CTX_1} namespace sample
kubectl create --context=${CTX_2} namespace sample
覆盖修订版本标签:
kubectl label --context=${CTX_1} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite
kubectl label --context=${CTX_2} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite
其中,REVISION 是您之前记下的
istiod
修订版本标签。输出如下:
label "istio-injection" not found. namespace/sample labeled
您可以安全地忽略
label "istio-injection" not found.
在这两个集群中创建 HelloWorld 服务:
kubectl create --context=${CTX_1} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
将 HelloWorld v1 和 v2 部署到每个集群
将
HelloWorld v1
部署到CLUSTER_1
,并将v2
部署到CLUSTER_2
,这可帮助以后验证跨集群负载均衡:kubectl create --context=${CTX_1} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
使用以下命令确认
HelloWorld v1
和v2
正在运行。验证输出是否如下所示:kubectl get pod --context=${CTX_1} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
部署 Sleep 服务
将
Sleep
服务部署到这两个集群。此 pod 将出于演示目的生成虚假网络流量:for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${PROJECT_DIR}/samples/sleep/sleep.yaml -n sample done
等待在每个集群中启动
Sleep
服务。验证输出是否如下所示:kubectl get pod --context=${CTX_1} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
验证跨集群负载均衡
多次调用 HelloWorld
服务,并检查输出以验证来自 v1 和 v2 的交替回复:
调用
HelloWorld
服务:kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello
输出类似于如下所示内容:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
再次调用
HelloWorld
服务:kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello
输出类似于如下所示内容:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
恭喜,您已成功验证负载均衡的多集群 Anthos Service Mesh!
清理 HelloWorld 服务
完成负载均衡验证后,请从集群中移除 HelloWorld
和 Sleep
服务。
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}