概述
應用服務網格基于K8s webhook技術攔截pod創建過程,并將sidecar容器注入到pod中,實現邊車代理注入。服務網格支持靈活的sidecar注入策略,本文說明注入策略配置及sidecar注入過程。
Sidecar注入策略
服務網格支持根據pod及其所在的命名空間的標簽、注解以及一些特殊規則決定是否注入sidecar。當前支持的注入策略配置說明如下:
| 配置 | 說明 |
|---|---|
| Pod所在命名空間的標簽需要滿足的條件 | 包含istio-inject:enabled:需要注入sidecar的Pod所在命名空間必須包含istio-inject:enabled標簽。 不包含istio-inject:disabled:需要注入sidecar的Pod所在命名空間不能包含istio-inject:disabled標簽。 |
| Pod標簽/注解需要滿足的條件 |
不包含sidecar.istio.io/inject:false:pod標簽/注解不能包含sidecar.istio.io/inject:false。 |
| AlwaysInjectSelector | 總是會注入sidecar的匹配標簽匹配條件,多個標簽是and關系;被選中的pod總是會注入sidecar。 |
| NeverInjectSelector | 總是不注入sidecar的匹配標簽匹配條件,多個標簽是and關系;被選中的pod總是不會注入sidecar。優先級高于AlwaysInjectSelector。 |
說明
AlwaysInjectSelector和NeverInjectSelector分別看作為匹配的Pod添加sidecar.istio.io/inject:true和sidecar.istio.io/inject:false,但是這個添加的標簽優先級低于Pod原本的標簽。也就是說,即使 Pod 匹配 NeverInjectSelector,但 Pod 本身具有 sidecar.istio.io/inject:true 標簽時,仍然會被視為只包含 sidecar.istio.io/inject:true 標簽。
在不同注入策略設置下,對于各種Pod所在命名空間標簽以及Pod自身注解情況,Pod最終注入策略生效結果參考下表(表中的“Pod所在命名空間需要滿足的條件”列中“包含標簽”表示包含istio-inject:enabled設置;“不包含標簽”表示不包含istio-inject:disabled設置。同理“Pod自身的注解/標簽需要滿足的條件”列中的“包含標簽”表示包含sidecar.istio.io/inject:true設置;“不包含標簽”表示不包含sidecar.istio.io/inject:false設置):
| 命名空間標簽(istio-injection) | Pod自身注解(sidecar.istio.io/inject) | Pod所在命名空間需要滿足的條件 | Pod自身的注解/標簽需要滿足的條件 | AlwaysInjectSelector | NeverInjectSelector | 結果 |
|---|---|---|---|---|---|---|
| enabled | true | × | × | × | × | 注入 |
| enabled | false | × | × | × | × | 不注入 |
| enabled | 未設置 | × | × | 匹配 | 匹配 | 不注入 |
| enabled | 未設置 | × | × | 匹配 | 不匹配 | 注入 |
| enabled | 未設置 | × | × | 不匹配 | 匹配 | 不注入 |
| enabled | 未設置 | × | 包含 | 不匹配 | 不匹配 | 不注入 |
| enabled | 未設置 | × | 不包含 | 不匹配 | 不匹配 | 注入 |
| disabled | × | × | × | × | × | 不注入 |
| 未設置 | true | 包含 | × | × | × | 不注入 |
| 未設置 | true | 不包含 | × | × | × | 注入 |
| 未設置 | false | × | × | × | × | 不注入 |
| 未設置 | 未設置 | × | × | × | × | 不注入 |
為工作負載安裝sidecar
進入服務網格控制臺 -> sidecar管理 -> 注入策略配置,將注入策略配置為
pod所在的命名空間需要包含istio-injection:enabled標簽
pod自身不包含sidecar.istio.io/inject:false標簽或注解
創建測試命名空間并部署測試工作負載
# kubectl get ns demo -o yaml apiVersion: v1 kind: Namespace metadata: creationTimestamp: "2025-02-13T03:32:09Z" labels: istio-injection: enabled kubernetes.io/metadata.name: demo name: demo resourceVersion: "5968" uid: 1e324ef3-1d72-473c-a865-21c4dfda78e4 spec: finalizers: - kubernetes status: phase: Active # cat httpbin.yaml apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: registry-vpc-crs-huanan2.cnsp-internal.daliqc.cn/library/httpbin:stable imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80 # kubectl apply -f httpbin.yaml -n demo serviceaccount/httpbin configured service/httpbin configured deployment.apps/httpbin configured # kubectl get po -n demo NAME READY STATUS RESTARTS AGE httpbin-655587688-m5dql 2/2 Running 0 10s