設定多叢集服務網格
搶先體驗方案客戶可使用這項設定,但我們不建議新 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 附加元件注入器部署至新的 GKE 叢集
請按照部署 Envoy 附屬元件插入器的操作說明,將插入器部署至叢集 gke-2
。
將服務網格擴充至新的 GKE 叢集
部署 Envoy 補充服務網格一文說明如何在叢集 gke-1
中設定服務網格,該叢集會執行 store
服務。本節說明如何擴充服務網格,納入在叢集 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
在叢集中執行的補充注入器會自動將 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", ... }