快速上手 Anthos | GKE 叢集加入 Anthos - GKE 叢集掛入 Anthos

先備知識 #

在這篇文章中,我們會將應用程式透過 Service Mesh 可管理的方式部署起來,在 GKE Cluster 上運行,接著我們會將這個 GKE Cluster 加入 Anthos 艦隊。
閱讀或操作時,可能會需要一些 Service MeshIstio 的小知識,可以在這個部落格先簡單地惡補起來,將有助於理解正在做的事。

將叢集註冊到 Anthos #

以下先使用 GUI 進行操作,比較知道在幹嘛,全程其實是可以使用 command line 替代,改天再更新一版:

為 Anthos 啟用 Service Mesh #

來到 Anthos Console,找到「功能」tab,確認 Service Mesh 已經啟用,若沒啟用則需要啟用它:

為 project 啟用 Anthos API #

Anthos 是一個額外的管理平台,Project 下的資源要能使用或被使用於 Anthos,需要我們幫所建立的 project 啟用 Anthos API 的存取權限。

註冊這次的範例 Cluster 到 Anthos Fleet #

可透過「註冊現有的叢集」,將 GKE Clsuter 註冊到 Anthos Fleet:

官方的文件其實到這 part 就結束了

以下是額外的一些操作,讓我們的 Cluster 不只是掛到 Anthos,還可以擁有 Service Mesh 的強大功能。


為範例 Cluster 啟用 Anthos Service Mesh #

這邊的「變更」其實就是 Service Mesh 對叢集與 service 的要件:


部署 Service Mesh 監控的應用程式 #

想要使用 Service Mesh,則必需要創建一個命名空間,並貼上 istio-injection=enabled 的標籤,應用程式則需要部署在這個命名空間下。

沒做這個步驟,即使叢集加入 Anthos Fleet 被控管,也不會享受到 Service Mesh 的強大功能。

Envoy 沒有注入的情形 #

這邊可以看看加入 Anthos 但沒有使用 Istio label 的狀況,Envoy 並不會注入:

~/Doc/_L/anthos/gcloud_tutorial/istio-samples/sample-apps/helloserver/server master ?1                ✘ INT ⎈ asm-ready 09:04:08 ─╮
❯ k apply -f server.yaml ─╯
deployment.apps/helloserver created
service/hellosvc created

~/Doc/_L/anthos/gcloud_tutorial/istio-samples/sample-apps/helloserver/server master ?1 09:04:15 ─╮
cd ../loadgen ─╯

~/Doc/_L/anthos/gcloud_tutorial/istio-samples/sample-apps/helloserver/loadgen master ?1 ⎈ asm-ready 09:04:20 ─╮
❯ k get po ─╯
NAME READY STATUS RESTARTS AGE
helloserver-65d68bb88f-9bffq 1/1 Running 0 13s

~/Doc/_L/anthos/gcloud_tutorial/istio-samples/sample-apps/helloserver/loadgen master ?1 09:04:28 ─╮

準備注入 sidecar 的命名空間 #

以下開始,我們將準備供 Service Mesh 辨識注入 sidecar proxy container 的命名空間:

創建一個命名空間 #

k create ns **hello-istio**

貼上標籤 #

k label ns **hello-istio** istio-injection=enabled

接著應該會看到 namespace/hello-istio labeled 的訊息。

部署應用程式到 Service Mesh 管控的命名空間 #

重新 apply yaml file #

記得要加上命名空間參數,Istio 才會注入 Envoy:

k apply -n **hello-istio** -f server/server.yaml
k apply -n **hello-istio** -f loadgen/loadgen.yaml

這時 Deployment 與 Service 都已經部署上去了。

每個 Pod 的 Containers 都是 2 顆,成功注入 sidecar proxy:

且因為 Anthos Service Mesh 有接管,所以可以看到服務網格 (Service Mesh) tab 已經有我們的應用程式,運作在範例的命名空間中:

Service 也正常運作著:

外部 IP 可正常拜訪:

拓墣與遙測 #

在 Service Mesh 下點入 helloserver:

剛創建時看不到什麼數據,是因為右邊所選的時間軸以 1 小時為單位,而搜集資訊會有一小段時間的延遲。

~/Doc/_L/anthos/gcloud_tutorial/istio-samples/sample-apps/helloserver/loadgen master ?1                     ⎈ asm-ready 09:15:44 ─╮
❯ k logs -n hello-istio loadgenerator-5bc4474bd5-znx6z -c main ─╯
🚀 Starting loadgen: 2023-01-07 01:04:06.475779
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa395c88>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa37ec50>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa285160>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa285630>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa285b00>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa2990b8>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa2996a0>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa299c88>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa2a32b0>: Failed to establish a new connection: [Errno -2] Name or service not known'))
Request failed: HTTPConnectionPool(host='hellosvc', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f08fa2a3898>: Failed to establish a new connection: [Errno -2] Name or service not known'))
10 request(s) complete to http://hellosvc:80/

中間略,實在重複了非常多次XD
最後會看到:

10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/
10 request(s) complete to http://hellosvc:80/

過了幾分鐘並縮短時間間距後,loadgen 打向 helloserver 的流量看起來有按照我們的預期了:

在前面我們有設定 RPS 是 5 次一秒,loadgen 確實有達到:

過了三小時之後進來看,數字就對了:


清理 #

這個 Lab 到這邊結束,接著我們再把這個 GKE Cluster 刪除,以節省費用。

gcloud container clusters delete asm-ready

需要花點時間:


其他參考資料 #

🙏🙏🙏

感謝你的閱讀 💖!
歡迎將本篇文章 分享 📋 出去,也歡迎到 我的 LinkedIn 聊聊。

Published