1. 程式人生 > >Istio技術與實踐03:最佳實踐之sidecar自動註入

Istio技術與實踐03:最佳實踐之sidecar自動註入

初始 aml emp tco git master oct 介紹 bec

Istio通過對serviceMesh中的每個pod註入sidecar,來實現無侵入式的服務治理能力。其中,sidecar的註入是其能力實現的重要一環(本文主要介紹在kubernetes集群中的註入方式)。sidecar註入有兩種方式,一是通過創建webhook資源,利用k8s的webhook能力實現pod的自動註入,二是通過istioctl工具,對yaml文件進行手動註入。在這裏對這兩種方式進行簡單介紹。

一、 webhook自動註入:
a) 準備條件:
i. 自動註入功能需要kubernetes 1.9或更高版本;
ii. kubernetes環境需支持MutatingAdmissionWebhook;

$ kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1
iii. 需要在kube-apiserver的啟動參數中加入;
--admission-control=MutatingAdmissionWebhook,ValidatingAdmissionWebhook
iv. 確保master到node容器網絡通信正常。

b) 自動註入控制:
i. 可通過在sidecar-injector的configmap中設置policy=disabled字段來設置是否啟用自動註入(此處為全局控制是否啟用自動註入功能);

$ kubectl get cm istio-sidecar-injector -nistio-system
apiVersion: v1
kind: ConfigMap
metadata:
name: istio-sidecar-injector
namespace: istio-system
data:
config: |-
policy: enabled //enabeld為開啟,disabeld為關閉
ii. 為需要自動註入的namespace打上標簽istio-injection: enabled(此處為ns級別的自動註入控制)。
$ kubectl get namespace -L istio-injection
NAME STATUS AGE ISTIO-INJECTION
default Active 1h
istio-system Active 1h
kube-public Active 1h
kube-system Active 1h
$ kubectl label namespace default istio-injection=enabled
namespace "default" labeled
$ kubectl get namespace -L istio-injection
NAME STATUS AGE ISTIO-INJECTION
default Active 1h enabled
istio-system Active 1h
kube-public Active 1h
kube-system Active 1h
iii. 同時也可以在deployment中通過設置annotation,sidecar.istio.io/inject=true來控制pod級別的自動註入。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
template:
metadata:
annotations:
sidecar.istio.io/inject: “true”
// true為啟用自動註入,false為關閉自動註入

c) 定義webhook參數文件MutatingWebhookConfiguration,格式如下(在helm包的sidecarInject中)。
這裏的語義就是,監聽具有istio-injection: enabled的label的namespace下的pod資源,當發生rules(CREATE POD)的動作時,則調用services(istio-sidecar-injector.istio-system的/inject接口)。
apiVersion: admissionregistration.k8s.io/v1beta1
kind: MutatingWebhookConfiguration
metadata:
name: istio-sidecar-injector
namespace: {{ .Release.Namespace }}
labels:
app: istio-sidecar-injector
webhooks:

  • name: sidecar-injector.istio.io
    clientConfig:
    service:
    name: istio-sidecar-injector
    namespace: {{ .Release.Namespace }}
    path: "/inject"
    caBundle: ""
    rules:
    • operations: [ "CREATE" ]
      apiGroups: [""]
      apiVersions: ["v1"]
      resources: ["pods"]
      failurePolicy: Fail
      namespaceSelector:
      matchLabels:
      istio-injection: enabled

d) webhook工作流程圖

e) 介紹了自動註入的註意事項與原理,終於可以測試下自動註入的結果了。
i. 首先安裝Istio控制面,確保sidecar-inject安裝完成;
$ kubectl get po -nistio-system | grep sidecar-injector
istio-sidecar-injector-5fb5999bf8-59k79 1/1 Running 0 1d
ii. 部署一個簡單的測試deploy,此處我們以nginx為例;
$ kubectl get po | grep nginx
nginx-v1-74c674fbd5-fl9bh 1/1 Running 0 22s
iii. 我們用步驟b).II中的方式為default的namespace打上自動註入標簽,刪除pod,觀察pod狀態,可以看到pod的容器數由1變為2;
$ kubectl get po | grep nginx
nginx-v1-54fbccf6fd-ff4k2 2/2 Running 0 4s
nginx-v1-74c674fbd5-fl9bh 1/1 Terminating 0 5m
iv. 可以看到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:
Container ID: docker://237781c7ce1e8c1f49f68047142ce1738822bafbe504f836f51873cbb1ac1f5d
Image: nginx:1.12-alpine-perl
Port: 80/TCP
State: Running

...

istio-proxy:
Container ID: docker://7208d32552918a5853fd56171bdbab3de3ae734242d23b140f6e5c2a1a4bce64
Image: istio/proxyv2:0.8.0
Args:
proxy
sidecar
--configPath
/etc/istio/proxy
--binaryPath
/usr/local/bin/envoy
--serviceCluster
nginx

...

二、 istioctl手動註入:
a) 下載istioctl工具並拷貝至環境,鏈接https://github.com/istio/istio/releases/ ;
b) 將istioctl二進制拷貝至/usr/local/bin目錄下
mv -f istioctl /usr/local/bin
c) 安裝Istio控制面,確認註入相關configmap已創建成功
$ kubectl get cm -n istio-system | grep istio-sidecar-injector
istio-sidecar-injector 1 15h
d) 準備需要註入的文件test.yaml
e) 執行istioctl會在原始內容的基礎上加入sidecar的配置內容,並輸出到控制臺。
$ istioctl kube-inject -f test.yaml
f) 將istioctl處理之後的內容部署到kubernetes上
$ kubectl apply -f <(istioctl kube-inject -f test.yaml)
g) 可以通過k8s命令查看pod詳細內容
$ kubectl describe pod test-c9f4b55c7-np4cf

三、 總結:
這裏更推薦自動註入的方式來實現sidecar的註入,可以通過在deployment的annotation中加入對應的key來實現自動註入的控制。自動註入實現的邏輯並不復雜,主要是對k8s中webhook的使用,以及通過模板,向deployment中註入相應的container資源等。
https://console.huaweicloud.com/cce2.0/?region=cn-north-1#/app/istio/istioPublicBeta

Istio技術與實踐03:最佳實踐之sidecar自動註入