天天看點

最佳實踐之sidecar自動注入

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工作流程圖

最佳實踐之sidecar自動注入

介紹了自動注入的注意事項與原理,終于可以測試下自動注入的結果了

首先安裝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資源等。