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-aand asm-b(更容易記住)並將它們部署在兩個不同的區域(asia-east1-aasia-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 上下文

kubectxasma通過為它們創建一個令人難忘的別名 ,可以輕鬆地在 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之間切換。這意味著當另一個沒有響應時,請求被轉發到健康的集群!v1v2

總結

在本文中,我解釋瞭如何使用 Google 管理的 Istio 控制平面和 CA 證書在不同區域的兩個 GKE 集群上部署 Anthos Service Mesh。

Anthos Service Mesh 使部署多集群服務網格變得簡單,因為 Istio 的大部分複雜性現在都由 Google 管理。

By tony

自由軟體愛好者~喜歡不斷的思考各種問題,有新的事物都會想去學習嘗試 做實驗並熱衷研究 沒有所謂頂天的技術 只有謙虛及不斷的學習 精進專業,本站主要以分享系統及網路相關知識、資源而建立。 Github http://stnet253.github.io

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料