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


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=MutatingAdmissionWebhookValidatingAdmissionWebhook

                      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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM