sidecar-inject程式碼分析
Istio 透過對 serviceMesh 中的每個 pod 注入 sidecar ,來實現無侵入式的服務治理能力。其中, sidecar 的注入是其能力實現的重要一環(本文主要介紹在 kubernetes 叢集中的注入方式)。 sidecar 注入有兩種方式,一是透過建立 webhook 資源,利用 k8s 的 webhook 能力實現 pod 的自動注入,二是透過 istioctl 工具,對 yaml 檔案進行手動注入。在這裡對這兩種方式進行簡單介紹。
一、webhook 自動注入:
a) 準備條件:
i. 自動注入功能需要 kubernetes 1.9 或更高版本;
ii. 需要在 kube-apiserver 的啟動引數中加入 --admission-control=MutatingAdmissionWebhook , ValidatingAdmissionWebhook
iii. k8s 中 webhook 需要簽名金鑰對,用於自動注入時的認證鑑權。(此處可透過 install/kubernetes/webhook-create-signed-cert.sh 指令碼生成,這個指令碼會呼叫 kubernetes 的 CSR API 生成一個具有 K8S 簽名的金鑰對,用於 Webhook 。然後建立一個 secret 存放證書資訊。)
iv. 可透過在 sidecar-injector 的 configmap 中設定 policy=disabled 欄位來設定是否啟用自動注入,同時也可以在 deployment 中透過設定 annotation , sidecar.istio.io/inject=true 來控制 pod 級別的自動注入。
v. 為需要自動注入的 namespace 打上標籤 istio-injection: enabled 。
vi. 確保 master 到 node 容器網路通訊正常。
b) 定義 webhook 檔案,格式如下(在 helm 包的 sidecarInject 中)。這裡的語義就是,監聽具有 istio-injection: enabled 的 label 的 namespace 下的 pod 資源,當發生 rules ( CREATE POD )的動作時,則呼叫 services ( istio-sidecar-injector.namespace 的 /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
c) webhook 工作流程圖
d) inject 程式碼分析 ( 程式碼位置 pilot/pkg/kube/inject/webhook.go) :
i. sidecar-inject 接收 kube-master 發出的自動注入請求,並校驗、解析請求結構體(請求體中包含觸發條件中, creating 的 pod 的結構體。)
ii. 判斷是否需要注入,篩選滿足條件的 pod ,篩選條件包括:是否開啟了 hostNewWork 、是否為需要注入的 ns 、 annotation 中是否指定為需要注入等條件;
iii. 若滿足條件則進行注入,注入的 sidecar 的映象資訊、啟動引數、掛載資訊等內容,儲存在 sidecar-inject 的 configmap 中,注入時會從 configmap 中提取對應的值,填到模板中,再將填好值的模板注入到 pod 中;
iv. 將注入好的 pod 資訊返還給 kube-master ,完成自動注入。
二、istioctl 手動注入(程式碼位置 istioctl/cmd/istioctl/inject; pilot/pkg/kube/inject/inject.go ):
a) 手動注入操作步驟:
i. 下載 istioctl 工具並複製至環境,連結 ;
ii. 將 istioctl 二進位制複製至 /usr/local/bin 目錄下
mv -f istioctl /usr/local/bin
iii. 安裝 Istio 控制面,確認注入相關 configmap 已建立成功
$ kubectl get cm -n istio-system | grep istio-sidecar-injector
istio-sidecar-injector 1 15h
iv. 準備需要注入的檔案 test.yaml
v. 執行 istioctl 會在原始內容的基礎上加入 sidecar 的配置內容,並輸出到控制檯。
$ istioctl kube-inject -f test.yaml
vi. 將 istioctl 處理之後的內容部署到 kubernetes 上
$ kubectl apply -f <(istioctl kube-inject -f test.yaml)
vii. 可以透過 k8s 命令檢視 pod 詳細內容
$ kubectl describe pod test-c9f4b55c7-np4cf
b) 程式碼分析:
i. 首先開啟原始 deploy.yaml 檔案或讀取控制檯輸入,讀取為檔案流;
ii. 從 config 檔案或 k8s 的 configmap 中讀取 sidecar 模板所需的值(同上述 c 中第三步)。
iii. 將上步得到的值填入 sidecar 模板中,生成模板例項;
iv. 將模板例項注入到源 deployment 中,生成注入好的檔案。
三、 總結:
這裡更推薦自動注入的方式來實現 sidecar 的注入,可以透過在 deployment 的 annotation 中加入對應的 key 來實現自動注入的控制。而原始碼部分,注入的邏輯並不複雜,主要是對 k8s 中 webhook 的使用,以及透過模板,向 deployment 中注入相應的 container 資源等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543630/viewspace-2213730/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AsyncTask 程式碼分析
- LNet程式碼分析
- 以太坊原始碼分析(5)accounts程式碼分析原始碼
- beego框架程式碼分析Go框架
- Android UsbDeviceManager 程式碼分析Androiddev
- 藉助ai來分析程式碼,理解程式碼AI
- qt程式建立及模板程式碼分析QT
- JS彈幕程式碼分析JS
- Swift iOS : 程式碼分析DrawControllerSwiftiOSController
- 搭建sonarqube分析golang程式碼Golang
- golang http/transport 程式碼分析GolangHTTP
- 1初學程式碼分析
- 程式碼分析工具小結
- a002-pylint 程式碼分析
- kvm-PLE程式碼分析
- ABAP程式碼分析工具 - 事務碼SQF
- Hacking Team攻擊程式碼分析
- Linux下init程式原始碼分析Linux原始碼
- jscodeshift入門簡介&程式碼重構&程式碼分析&&ReactJSReact
- 無程式碼相對於低程式碼的優勢分析
- 【程式碼視覺化實踐】程式碼變更影響分析視覺化
- 二維陣列程式碼案例分析陣列
- max30102程式碼分析總篇
- 程式碼分析引擎 CodeQL 初體驗
- mimalloc記憶體分配程式碼分析記憶體
- Facades 原理 (程式碼執行流程分析)
- Java程式碼中字串拼接方式分析Java字串
- 紅黑樹核心程式碼分析(JAVA)Java
- SQL隱碼攻擊原理及程式碼分析(二)SQL
- SQL隱碼攻擊原理及程式碼分析(一)SQL
- 惡意程式碼分析之行為分析及樣本收集
- 影片聊天原始碼,同步、非同步示例程式碼分析原始碼非同步
- Android HAL 層框架分析以及程式碼示例Android框架
- 併發程式設計—— FutureTask 原始碼分析程式設計原始碼
- 併發程式設計 —— Timer 原始碼分析程式設計原始碼
- Storm的wordcount程式碼編寫與分析ORM
- JavaScript簡單計算器程式碼分析JavaScript
- Joomla遠端程式碼執行漏洞分析OOM