先備知識 #
在這篇文章中,我們會將應用程式透過 Service Mesh 可管理的方式部署起來,在 GKE Cluster 上運行,接著我們會將這個 GKE Cluster 加入 Anthos 艦隊。
閱讀或操作時,可能會需要一些 Service Mesh 與 Istio 的小知識,可以在這個部落格先簡單地惡補起來,將有助於理解正在做的事。
將叢集註冊到 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
需要花點時間:
其他參考資料 #
Published