內容目錄
Anthos Service Mesh 是一套工具,可幫助您在本地或 Google Cloud 上監控和管理可靠的服務網格。我最近測試了它作為非託管 Istio 安裝的替代方案,我驚訝發現 Anthos 使在 Kubernetes 集群上部署服務網格變得如此容易。 在本文中,我將逐步說明如何使用 Anthos Service Mesh 部署多集群、多區域服務網格。在我的概念驗證過程中,我閱讀了https://cloud.google.com/service-mesh/docs/install上的文檔,但沒有任何指南完全涵蓋我的要求,它們是:
- 多集群、多區域服務網格
- Google管理的 Istio 控制平面(增加彈性,並儘量減少我的工作)
- 適用於 Istio mTLS 的 Google 管理的 CA 證書
部署 GKE 集群
部署兩個 GKE 集群。我稱它們為asm-a
and asm-b
(更容易記住)並將它們部署在兩個不同的區域(asia-east1-a
和asia-northeast1-a
)。因為 Anthos Service Mesh 要求節點至少有 4 個 vCPU(以及更多要求,請參閱完整列表:https ://cloud.google.com/service-mesh/docs/scripted-install/asm-onboarding ) ,至少使用e2-standard-4
機器。
作為準備工作,將 Google Cloud 項目 ID 存儲在環境變量中,以便可以直接複製和貼上其餘命令。
export PROJECT_ID=$(gcloud info --format='value(config.project)')
然後,要部署集群,請運行:
gcloud container clusters create asm-a \ --zone asia-east1-a \ --machine-type "e2-standard-4" \ --disk-size "100" \ --num-nodes "2" \ --workload-pool=${PROJECT_ID}.svc.id.goog --async gcloud container clusters create asm-b \ --zone asia-northeast1-a \ --machine-type "e2-standard-4" \ --disk-size "100" \ --num-nodes "2" \ --workload-pool=${PROJECT_ID}.svc.id.goog --async
這些命令還啟用了工作負載身份,您可以在以下位置閱讀更多信息:https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity 。
獲取集群的憑證
創建集群後,通過 獲取連接到它們所需的憑證 kubectl
。使用以下命令:
gcloud container clusters get-credentials asm-a \ --zone asia-east1-a --project ${PROJECT_ID} gcloud container clusters get-credentials asm-b \ --zone asia-northeast1-a --project ${PROJECT_ID}
使用 kubectx 輕鬆切換 kubectl 上下文
kubectx
asma
通過為它們創建一個令人難忘的別名 ,可以輕鬆地在 kubectl(也稱為上下文)中的集群和命名空間之間切換asmb
。在以下位置了解有關該工具的更多信息:https ://github.com/ahmetb/kubectx 。
kubectx asma=gke_${PROJECT_ID}_asia-east1-a_asm-a kubectx asmb=gke_${PROJECT_ID}_asia-northeast1-a_asm-b
為集群設置 Mesh ID 標籤
在安裝 Anthos Service Mesh 之前在集群上設置mesh_id
標籤,Anthos 需要使用該標籤來識別哪些集群屬於哪個網格。mesh_id
始終採用 格式,proj-
可以通過運行以下命令找到項目的項目編號:
gcloud projects list
使用這些命令mesh_id
在兩個集群上創建標籤(替換在上一個命令中找到的項目編號PROJECT_NUMBE:
export MESH_ID="proj-${PROJECT_NUMBE}" gcloud container clusters update asm-a \ --region asia-east1-a \ --project=${PROJECT_ID} \ --update-labels=mesh_id=${MESH_ID} gcloud container clusters update asm-b \ --region asia-northeast1-a \ --project=${PROJECT_ID} \ --update-labels=mesh_id=${MESH_ID}
啟用 StackDriver
如果在設置過程中出現任何問題,請在集群上啟用 StackDriver 以便能夠查看日誌! 這個步驟不一定要做
gcloud container clusters update asm-a \ --region asia-east1-a \ --project=${PROJECT_ID} \ --enable-stackdriver-kubernetes gcloud container clusters update asm-b \ --region asia-northeast1-a \ --project=${PROJECT_ID} \ --enable-stackdriver-kubernetes
創建跨區域通信的防火牆規則
集群位於不同的區域,因此必須創建新的防火牆規則以允許它們與其 pod 之間的通信。
sh cluster-firewall.sh
#!/bin/bash function join_by { local IFS="$1"; shift; echo "$*"; } ASMA_POD_CIDR=$(gcloud container clusters describe asm-a \ --zone asia-east1-a --format=json | jq -r '.clusterIpv4Cidr') ASMB_POD_CIDR=$(gcloud container clusters describe asm-b \ --zone asia-northeast1-a --format=json | jq -r '.clusterIpv4Cidr') ASMA_PRIMARY_CIDR=$(gcloud compute networks subnets describe default \ --region=asia-east1-a --format=json | jq -r '.ipCidrRange') ASMB_PRIMARY_CIDR=$(gcloud compute networks subnets describe default \ --region=asia-northeast1-a --format=json | jq -r '.ipCidrRange') ALL_CLUSTER_CIDRS=$ASMA_POD_CIDR,$ASMB_POD_CIDR,$ASMA_PRIMARY_CIDR,$ASMB_PRIMARY_CIDR ALL_CLUSTER_NETTAGS=$(gcloud compute instances list --project ${PROJECT_ID} --format='value(tags.items.[0])' | sort | uniq) ALL_CLUSTER_NETTAGS=$(join_by , $(echo "${ALL_CLUSTER_NETTAGS}")) echo ${ALL_CLUSTER_CIDRS} echo ${ALL_CLUSTER_NETTAGS} gcloud compute firewall-rules create asm-multicluster-rule \ --allow=tcp,udp,icmp,esp,ah,sctp \ --direction=INGRESS \ --priority=900 \ --source-ranges="${ALL_CLUSTER_CIDRS}" \ --target-tags="${ALL_CLUSTER_NETTAGS}" --quiet
安裝 Anthos 服務網格
首先,按照此處的說明安裝所需的本地工具:https://cloud.google.com/service-mesh/docs/scripted-install/asm-onboarding#installing_required_tools 。
該asmcli
工具將在集群上安裝 Anthos Service Mesh。以下這些安裝請在GCLOUD CLI底下執行 :
./asmcli install \ -p ${PROJECT_ID} \ -l asia-east1-a \ -n asm-a \ --fleet_id ${PROJECT_ID} \ --managed \ --verbose \ --output_dir asma \ --enable-all \ --channel Regular ./asmcli install \ -p ${PROJECT_ID} \ -l asia-northeast1-a \ -n asm-b \ --fleet_id ${PROJECT_ID} \ --managed \ --verbose \ --output_dir asmb \ --enable-all \ --channel Regular
執行安裝過程這邊需要y繼續
安裝完成到gcp後台查看服務網格
在集群之間配置端點發現
端點發現使集群能夠相互通信,例如,它可以發現集群之間的服務端點。
按照此處的說明安裝所需的本地工具:https://cloud.google.com/service-mesh/docs/downloading-istioctl ,然後運行以下命令:
istioctl x create-remote-secret \ --context=asma --name=asm-a| \ kubectl apply -f - --context=asmb istioctl x create-remote-secret \ --context=asmb --name=asm-b| \ kubectl apply -f - --context=asma
測試服務網格
Anthos Service Mesh 現已準備就緒!讓我們部署一個示例應用程序來驗證跨集群流量和故障轉移。
為 Hello World 應用創建命名空間
在兩個集群上創建一個新的命名空間,並為它們啟用自動 Istio sidecar 注入。由於 Istio 控制平面由 Google 管理,因此istio-injection- istio.io/rev=
標籤設置為asm-managed
。
kubectl create --context=asma namespace sample kubectl label --context=asma namespace sample \ istio-injection- istio.io/rev=asm-managed --overwrite kubectl create --context=asmb namespace sample kubectl label --context=asmb namespace sample istio-injection- \ istio.io/rev=asm-managed --overwrite
創建 Hello World 服務
Hello World
使用以下命令在兩個集群上部署應用程序的服務:
kubectl create --context=asma -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l service=helloworld -n sample kubectl create --context=asmb -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l service=helloworld -n sample
創建 Hello World 部署
部署Hello World
示例應用程序,它提供一個端點,該端點將返回應用程序的版本號(兩個集群中的版本號不同)和一條Hello World
消息。
kubectl create --context=asma -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l version=v1 -n sample kubectl create --context=asmb -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/helloworld/helloworld.yaml -l version=v2 -n sample
可以看到pod有sidecar服務istio-proxy
部署sleep pod
睡眠應用程序模擬停機時間。讓我們用它來測試服務網格的彈性!要部署sleep pod應用程序,請使用:
kubectl apply --context=asma -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/sleep/sleep.yaml -n sample kubectl apply --context=asmb -f https://raw.githubusercontent.com/istio/istio/1.9.5/samples/sleep/sleep.yaml -n sample
驗證跨集群流量
要驗證跨集群負載平衡是否按預期工作(服務網格真的能在區域故障中倖存下來嗎?), HelloWorld
使用 Sleep pod 多次調用該服務。為確保負載平衡正常工作,請HelloWorld
從部署中的所有集群調用該服務。
kubectl exec --context=asma -n sample -c sleep "$(kubectl get pod --context=asma -n sample -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- curl -sS helloworld.sample:5000/hello kubectl exec --context=asmb -n sample -c sleep "$(kubectl get pod --context=asmb -n sample -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- curl -sS helloworld.sample:5000/hello
多次重複此請求並驗證版本是否應在和HelloWorld
之間切換。這意味著當另一個沒有響應時,請求被轉發到健康的集群!v1
v2
總結
在本文中,我解釋瞭如何使用 Google 管理的 Istio 控制平面和 CA 證書在不同區域的兩個 GKE 集群上部署 Anthos Service Mesh。
Anthos Service Mesh 使部署多集群服務網格變得簡單,因為 Istio 的大部分複雜性現在都由 Google 管理。