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

PaaS小魔仙發表於2018-08-30

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 工具並複製至環境,連結

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543630/viewspace-2213216/,如需轉載,請註明出處,否則將追究法律責任。

相關文章