概述
应用服务网格基于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.ctyun.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