終於進入大家都比較感興趣的服務網格系列了,在前面已經講解了:
kubernetes
kubernetes
自帶的設定 ConfigMap
基本上已經夠我們開發一般規模的 web 應用了;但在企業中往往有著複雜的應用呼叫關係,應用與應用之間的請求也需要進行管理。
比如常見的限流、降級、trace、監控、負載均衡等功能。
在我們使用 kubernetes
之前往往都是由微服務架構來解決這些問題,比如 Dubbo、SpringCloud 都有對應的功能。
但當我們上了 kubernetes
之後這些事情就應該交給一個專門的雲原生元件來解決,也就是本次會講到的 Istio
,它是目前使用最為廣泛的服務網格解決方案。
官方對於 Istio 的解釋比較簡潔,落到具體的功能點也就是剛才提到的:
TLS安全認證
再結合官方的架構圖可知:Istio 分為控制面 control plane
和資料面 data plane
。
控制面可以理解為 Istio 自身的管理功能:
而資料面可以簡單的把他理解為由 Envoy
代理的我們的業務應用,我們應用中所有的流量進出都會經過 Envoy
代理。
所以它可以實現負載均衡、熔斷保護、認證授權等功能。
首先安裝 Istio 命令列工具
這裡的前提是有一個 kubernetes 執行環境
Linux 使用:
curl -L https://istio.io/downloadIstio | sh -
Mac 可以使用 brew:
brew install istioctl
其他環境可以下載 Istio 後設定環境變數:
export PATH=$PWD/bin:$PATH
之後我們可以使用 install
命令安裝控制面。
這裡預設使用的是
kubectl
所設定的kubernetes
叢集
istioctl install --set profile=demo -y
這個的 profile
還有以下不同的值,為了演示我們使用 demo
即可。
# 開啟 default 名稱空間自動注入
$ k label namespace default istio-injection=enabled
$ k describe ns default
Name: default
Labels: istio-injection=enabled
kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
之後我們為 namespace
打上 label
,使得 Istio 控制面知道哪個 namespace
下的 Pod
會自動注入 sidecar
。
這裡我們為 default 這個名稱空間開啟自動注入 sidecar
,然後在這裡部署我們之前使用到的 deployment-istio.yaml
$ k apply -f deployment/deployment-istio.yaml
$ k get pod
NAME READY STATUS RESTARTS
k8s-combat-service-5bfd78856f-8zjjf 2/2 Running 0
k8s-combat-service-5bfd78856f-mblqd 2/2 Running 0
k8s-combat-service-5bfd78856f-wlc8z 2/2 Running 0
此時會看到每個Pod 有兩個 container(其中一個就是 istio-proxy sidecar),也就是之前做 gRPC 負載均衡測試時的程式碼。
還是進行負載均衡測試,效果是一樣的,說明 Istio
起作用了。
此時我們再觀察 sidecar
的紀錄檔時,會看到剛才我們所發出和接受到的流量:
$ k logs -f k8s-combat-service-5bfd78856f-wlc8z -c istio-proxy
[2023-10-31T14:52:14.279Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 14 9 "-" "grpc-go/1.58.3" "6d293d32-af96-9f87-a8e4-6665632f7236" "k8s-combat-service:50051" "172.17.0.9:50051" inbound|50051|| 127.0.0.6:42051 172.17.0.9:50051 172.17.0.9:40804 outbound_.50051_._.k8s-combat-service.default.svc.cluster.local default
[2023-10-31T14:52:14.246Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 58 39 "-" "grpc-go/1.58.3" "6d293d32-af96-9f87-a8e4-6665632f7236" "k8s-combat-service:50051" "172.17.0.9:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:40804 10.101.204.13:50051 172.17.0.9:54012 - default
[2023-10-31T14:52:15.659Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 35 34 "-" "grpc-go/1.58.3" "ed8ab4f2-384d-98da-81b7-d4466eaf0207" "k8s-combat-service:50051" "172.17.0.10:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:39800 10.101.204.13:50051 172.17.0.9:54012 - default
[2023-10-31T14:52:16.524Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 28 26 "-" "grpc-go/1.58.3" "67a22028-dfb3-92ca-aa23-573660b30dd4" "k8s-combat-service:50051" "172.17.0.8:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:44580 10.101.204.13:50051 172.17.0.9:54012 - default
[2023-10-31T14:52:16.680Z] "POST /helloworld.Greeter/SayHello HTTP/2" 200 - via_upstream - "-" 12 61 2 2 "-" "grpc-go/1.58.3" "b4761d9f-7e4c-9f2c-b06f-64a028faa5bc" "k8s-combat-service:50051" "172.17.0.10:50051" outbound|50051||k8s-combat-service.default.svc.cluster.local 172.17.0.9:39800 10.101.204.13:50051 172.17.0.9:54012 - default
本期的內容比較簡單,主要和安裝設定相關,下一期更新如何設定內部服務呼叫的超時、限流等功能。
其實目前大部分操作都是偏運維的,即便是後續的超時設定等功能都只是編寫 yaml 資源。
但在生產使用時,我們會給開發者提供一個管理臺的視覺化頁面,可供他們自己靈活設定這些原本需要在 yaml
中設定的功能。
其實各大雲平臺廠商都有提供類似的能力,比如阿里雲的 EDAS 等。
本文的所有原始碼在這裡可以存取:
https://github.com/crossoverJie/k8s-combat
作者: crossoverJie
歡迎關注博主公眾號與我交流。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出, 如有問題, 可郵件(crossoverJie#gmail.com)諮詢。