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=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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Istio技術與實踐04:最佳實踐之教你寫一個完整的Mixer AdapterAPT
- Istio技術與實踐05:如何用istio實現流量管理
- Vue路由自動注入實踐Vue路由
- Istio Sidecar注入原理IDE
- 最佳實踐|Apache Pulsar 在拉卡拉的技術實踐Apache
- Istio技術與實踐6:Istio如何為服務提供安全防護能力
- 美團開放平臺SDK自動生成技術與實踐
- UI自動化技術在高德的實踐UI
- 自動化測試的最佳實踐
- 得物技術埋點自動化驗證的探索和最佳實踐
- Istio實踐(4)- 故障注入、熔斷及ServiceEntry
- 聊聊Go程式碼覆蓋率技術與最佳實踐Go
- IBM,將技術與最佳實踐方法結合(轉)IBM
- Istio最佳實踐系列:如何實現方法級呼叫跟蹤?
- 技術沙龍|京東雲DevOps自動化運維技術實踐dev運維
- UITableViewCell使用自動佈局的“最佳實踐”UIView
- Selenium 自動化最佳實踐技巧 (中)
- kubernetes實踐之七十二:Istio之策略與遙測
- 容器技術在企業落地的最佳實踐
- React最佳實踐嘗試(一)技術選型React
- 美團智慧客服核心技術與實踐
- pkg版本規範管理自動化最佳實踐
- 測試自動化中遵循的最佳實踐
- Rational 軟體交付平臺的技術資源與最佳實踐
- 技術集錦 | 大資料雲原生技術實戰及最佳實踐系列大資料
- 騰訊 iOA 技術實踐
- SVG Sprite 技術實踐SVG
- Istio 技術與實踐01: 原始碼解析之 Pilot 多雲平臺服務發現機制原始碼
- WebSocket簡介與最佳實踐Web
- MobX流程分析與最佳實踐
- vivo直播應用技術實踐與探索
- Docker容器編排技術解析與實踐Docker
- 分散式資料庫企業級功能技術解密與最佳實踐分散式資料庫解密
- Go 專案依賴注入wire工具最佳實踐介紹與使用Go依賴注入
- Lighthouse與Google的移動端最佳實踐Go
- 前端技術演進(六):前端專案與技術實踐前端
- Pika最佳實踐
- Flutter 最佳實踐Flutter