Istio通過對serviceMesh中的每個pod注入sidecar,來實作無侵入式的服務治理能力。其中,sidecar的注入是其能力實作的重要一環(本文主要介紹在kubernetes叢集中的注入方式)。
sidecar注入有兩種方式,一是通過建立webhook資源,利用k8s的webhook能力實作pod的自動注入,二是通過istioctl工具,對yaml檔案進行手動注入。在這裡對這兩種方式進行簡單介紹。
webhook自動注入:
準備條件:
自動注入功能需要kubernetes 1.9或更高版本;
kubernetes環境需支援MutatingAdmissionWebhook;
需要在kube-apiserver的啟動參數中加入;
——admission-control=MutatingAdmissionWebhook,
ValidatingAdmissionWebhook
確定master到node容器網絡通信正常。
自動注入控制:
可通過在sidecar-injector的configmap中設定policy=disabled字段來設定是否啟用自動注入(此處為全局控制是否啟用自動注入功能);
為需要自動注入的namespace打上标簽istio-injection: enabled(此處為ns級别的自動注入控制)。
同時也可以在deployment中通過設定annotation,sidecar.istio.io/inject=true來控制pod級别的自動注入。
定義webhook參數檔案MutatingWebhookConfiguration,格式如下(在helm包的sidecarInject中)。
這裡的語義就是,監聽具有istio-injection: enabled的label的namespace下的pod資源,當發生rules(CREATE POD)的動作時,則調用services(istio-sidecar-injector.istio-system的/inject接口)。
webhook工作流程圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInVGcq5iYiNGZlZWYhBTYllTZhZmNlZGMyMGMhdjZ5ATM2MWMh9CXxIzLcRDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.jpeg)
介紹了自動注入的注意事項與原理,終于可以測試下自動注入的結果了
首先安裝Istio控制面,確定sidecar-inject安裝完成;
$ kubectl get po -nistio-system | grep sidecar-injector
istio-sidecar-injector-5fb5999bf8-59k79 1/1 Running 0
1d
部署一個簡單的測試deploy,此處我們以nginx為例;
我們用步驟b).II中的方式為default的namespace打上自動注入标簽,删除pod,觀察pod狀态,可以看到pod的容器數由1變為2;
可以看到sidecar容器已經注入成功,我們看下pod的描述資訊,觀察下自動注入做了什麼。可以看到,自動注入向pod中插入了一個初始化容器istio-init和一個sidecar容器istio-proxy(詳細參數可以參考configmap:istio-sidecar-injector);
$ kubectl describe po nginx-v1-54fbccf6fd-ff4k2
Name: nginx-v1-54fbccf6fd-ff4k2
Namespace: default
Status: Running
...
Init Containers:
istio-init:
Container ID:
docker://96951306e214594d0c1e550f732a81781287f79f0e5a3262455f38535d42d61f
Image: istio/proxy_init:0.8.0
Containers:
container-0:
docker://237781c7ce1e8c1f49f68047142ce1738822bafbe504f836f51873cbb1ac1f5d
Image: nginx:1.12-alpine-perl
Port: 80/TCP
State: Running
istio-proxy:
docker://7208d32552918a5853fd56171bdbab3de3ae734242d23b140f6e5c2a1a4bce64
Image: istio/proxyv2:0.8.0
Args:
proxy
sidecar
--configPath
/etc/istio/proxy
--binaryPath
/usr/local/bin/envoy
--serviceCluster
nginx
istioctl手動注入:
下載下傳istioctl工具并拷貝至環境,連結https://github.com/istio/istio/releases/
将istioctl二進制拷貝至/usr/local/bin目錄下
mv -f istioctl /usr/local/bin
準備需要注入的檔案test.yaml
執行istioctl會在原始内容的基礎上加入sidecar的配置内容,并輸出到控制台。
将istioctl處理之後的内容部署到kubernetes上
可以通過k8s指令檢視pod詳細内容
總結:
這裡更推薦自動注入的方式來實作sidecar的注入,可以通過在deployment的annotation中加入對應的key來實作自動注入的控制。自動注入實作的邏輯并不複雜,主要是對k8s中webhook的使用,以及通過模闆,向deployment中注入相應的container資源等。