设置多集群服务网格
此配置适用于预览版客户,但我们不建议新 Cloud Service Mesh 用户采用此配置。如需了解详情,请参阅 Cloud Service Mesh 概览。
本指南演示了如何向现有服务网格添加新的 GKE 集群。
准备工作
在添加集群之前,请务必完成准备使用 GKE Gateway API 进行部署中的步骤,包括启用多集群服务。
创建新的 GKE 集群
使用以下命令创建一个新集群:
gcloud container clusters create gke-2 \ --zone=us-west1-a \ --enable-ip-alias \ --workload-pool=PROJECT_ID.svc.id.goog \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --release-channel regular \ --project=PROJECT_ID
通过发出以下命令切换到刚创建的集群:
gcloud container clusters get-credentials gke-2 --zone us-west1-a
重命名集群上下文:
kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-2 gke-2
将集群注册到舰队
创建集群后,将该集群注册到舰队:
gcloud alpha container hub memberships register gke-2 \ --gke-cluster us-west1-a/gke-2 \ --enable-workload-identity \ --project=PROJECT_ID
验证是否已向舰队注册集群:
gcloud alpha container hub memberships list --project=PROJECT_ID
舰队应包含您刚刚创建的集群以及您之前创建的集群:
NAME EXTERNAL_ID gke-1 657e835d-3b6b-4bc5-9283-99d2da8c2e1b gke-2 f3727836-9cb0-4ffa-b0c8-d51001742f19
将 Envoy Sidecar 注入器部署到新的 GKE 集群
按照部署 Envoy Sidecar 注入器的说明将注入器部署到集群 gke-2
。
将服务网格扩展到新的 GKE 集群
部署 Envoy Sidecar 服务网格部分介绍了如何在运行 store
服务的集群 gke-1
中配置服务网格。本部分介绍如何扩展服务网格,使其包含集群 gke-2
中运行的 payments
服务。Mesh
资源已存在于配置集群中,因此您无需在新集群中创建 Mesh
资源。
部署 payments
服务
在
payments.yaml
文件中,保存以下清单:kind: Namespace apiVersion: v1 metadata: name: payments --- apiVersion: apps/v1 kind: Deployment metadata: name: payments namespace: payments spec: replicas: 2 selector: matchLabels: app: payments version: v1 template: metadata: labels: app: payments version: v1 spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: payments namespace: payments spec: selector: app: payments ports: - port: 8080 targetPort: 8080
将清单应用于集群
gke-2
:kubectl apply --context gke-2 -f payments.yaml
导出 payments
服务
所有 Gateway API 资源都集中存储在配置集群 gke-1
中。必须导出舰队中的其他集群中的服务,以便 gke-1
集群中的 Gateway API 资源可以在您配置服务网格的网络行为时引用这些服务。
如需详细了解 ServiceExport
和 ServiceImport
的工作原理,请参阅多集群服务。
在集群
gke-1
中创建命名空间payments
。集群gke-1
中的payments
服务将导出到舰队中位于同一命名空间的所有集群。kubectl create namespace payments --context gke-1
在
export-payments.yaml
文件中,保存以下清单:kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: payments namespace: payments
在
gke-2
集群中应用ServiceExport
清单:kubectl apply --context gke-2 -f export-payments.yaml
几分钟后,运行以下命令以验证是否已通过
gke-1
中的多集群服务控制器创建随附的serviceImports
:kubectl get serviceimports --context gke-1 --namespace payments
输出应类似如下所示:
NAME TYPE IP AGE payments ClusterSetIP ["10.112.31.15"] 6m54s
为 payments
服务配置 HTTPRoute
资源
在
payments-route.yaml
文件中,保存以下HTTPRoute
清单:apiVersion: gateway.networking.k8s.io/v1alpha2 kind: HTTPRoute metadata: name: payments-route namespace: payments spec: parentRefs: - name: td-mesh namespace: default group: net.gke.io kind: TDMesh hostnames: - "example.com" rules: - matches: - path: type: PathPrefix value: /payments backendRefs: - group: net.gke.io kind: ServiceImport namespace: payments name: payments port: 8080
将路由清单应用于
gke-1
:kubectl apply --context gke-1 -f payments-route.yaml
验证部署
检查 Mesh
状态和事件,以验证 Mesh
和 HTTPRoute
是否已成功部署。
运行以下命令:
kubectl describe tdmesh td-mesh -–context gke-1
输出应类似如下所示:
... Status: Conditions: Last Transition Time: 2022-04-14T22:49:56Z Message: Reason: MeshReady Status: True Type: Ready Last Transition Time: 2022-04-14T22:27:17Z Message: Reason: Scheduled Status: True Type: Scheduled Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 23m mc-mesh-controller Processing mesh default/td-mesh Normal UPDATE 23m mc-mesh-controller Processing mesh default/td-mesh Normal SYNC 23m mc-mesh-controller Processing mesh default/td-mesh Normal SYNC 71s mc-mesh-controller SYNC on default/td-mesh was a success
如需验证部署,请将客户端 Pod 部署到其中一个集群。在
client.yaml
文件中,保存以下内容:apiVersion: apps/v1 kind: Deployment metadata: labels: run: client name: client namespace: default spec: replicas: 1 selector: matchLabels: run: client template: metadata: labels: run: client spec: containers: - name: client image: curlimages/curl command: - sh - -c - while true; do sleep 1; done
应用清单:
kubectl apply -f client.yaml --context $CLUSTER
在集群中运行的 Sidecar 注入器会将 Envoy 容器自动注入客户端 Pod。
如需验证 Envoy 容器是否已注入,请运行以下命令:
kubectl describe pods -l run=client --context $CLUSTER
输出内容类似如下:
... Init Containers: # Istio-init sets up traffic interception for the Pod. istio-init: ... # td-bootstrap-writer generates the Envoy bootstrap file for the Envoy container td-bootstrap-writer: ... Containers: # client is the client container that runs application code. client: ... # Envoy is the container that runs the injected Envoy proxy. envoy: ...
预配
mesh
和客户端 Pod 后,从客户端 Pod 向store
服务发送请求:# Get the name of the client Pod. CLIENT_POD=$(kubectl get pod --context $CLUSTER -l run=client -o=jsonpath='{.items[0].metadata.name}') # The VIP where the following request will be sent. Because requests from the # Busybox container are redirected to the Envoy proxy, the IP address can # be any other address, such as 10.0.0.2 or 192.168.0.1. VIP='10.0.0.1' # Command to send a request to store. TEST_CMD="curl -v -H 'Host: example.com' $VIP/store" # Execute the test command in the client container. kubectl exec -it $CLIENT_POD -c client --context $CLUSTER -- /bin/sh -c "$TEST_CMD"
输出应显示
gke-1
中的一个store
Pod 将处理请求:{ "cluster_name": "gke-1", "zone": "us-central1-a", "host_header": "example.com", ... }
向
payments
服务发送请求:# Command to send a request to payments. TEST_CMD="curl -v -H 'host: example.com' $VIP/payments" # Execute the test command in the client container. kubectl exec -it $CLIENT_POD -c client -- /bin/sh -c "$TEST_CMD"
输出应显示 gke-2 中的一个
payments
Pod 将处理请求:{ "cluster_name": "gke-2", "zone": "us-west1-a", "host_header": "example.com", ... }