背景
sidecar模式下,服务网格默认通过给业务pod注入一个istio-init容器配置iptabels规则,实现业务无感的流量拦截,但是这种配置方式需要较高的权限(NET_ADMIN 和 NET_RAW),在对安全较为敏感的场景,这种配置方式可能带来安全风险。通过CNI插件方式,不需要用户提权的情况完成和istio-init相同的能力,实现容器流量拦截配置功能。CNI插件以DaemonSet方式部署在集群中,创建pod时完成容器网络配置。
操作
进入服务网格控制台 -> sidecar管理 -> 网格CNI插件 菜单,您可以选择对应的istio版本和相关配置,开启或关闭CNI插件,配置说明如下
配置 | 说明 |
---|---|
版本 | 升级过程中可能同时存在多个版本,您可以选择一个版本开启CNI插件 |
排除的命名空间 | 排除的命名空间下的pod不会被CNI插件处理,一般配置为一些不希望注入网格sidecar的命名空间。请勿将需要注入sidecar的命名空间添加到CNI排除的命名空间列表中,可能导致pod启动失败。 |
使用CNI插件实现sidecar流量拦截配置
-
进入服务网格控制台 -> sidecar管理 -> 网格CNI插件 菜单,开启网格CNI插件,完成后可以看到云容器引擎中已经部署了网格CNI
-
部署应用服务,确保pod所在的命名空间及pod的标签满足sidecar注入规则,且pod所在的命名空间不在网格CNI插件的排除命名空间里;部署完成后可以看到pod注入了sidecar
# kubectl get po -n demo NAME READY STATUS RESTARTS AGE httpbin-6878558fdc-4c9gx 2/2 Running 0 38s # kubectl get po -n demo -o yaml ... initContainers: - args: - istio-iptables - -p - "15001" - -z - "15006" - -u - "1337" - -m - REDIRECT - -i - '*' - -x - "" - -b - '*' - -d - 15090,15021,15020 - -o - 18181,18282 - --log_output_level=default:info - --run-validation - --skip-rule-apply image: registry-vpc-crs-huadong1.cnsp-internal.ctyun.cn/library/proxyv2:1.20.0-v1.7 imagePullPolicy: IfNotPresent name: istio-validation ...
可以看到pod中注入的initContainers为istio-validation容器,发起请求再查看sidecar日志可以看到流量被拦截到了sidecar:
# kubectl exec -it -n istio-system istio-eastwestgateway-79567ccc4-w4hg9 -- curl httpbin.demo.svc.cluster.local:8000/headers -sv
* Trying 10.96.243.161:8000...
* Connected to httpbin.demo.svc.cluster.local (10.96.243.161) port 8000 (#0)
> GET /headers HTTP/1.1
> Host: httpbin.demo.svc.cluster.local:8000
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: istio-envoy
< date: Tue, 11 Feb 2025 09:08:05 GMT
< content-type: application/json
< content-length: 203
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 1
< x-request-id: e6700048-aa01-44d2-806b-f8e5355c50f7
< x-envoy-decorator-operation: httpbin.demo.svc.cluster.local:8000/*
<
{"headers":{"Accept":"*/*","Host":"httpbin.demo.svc.cluster.local:8000","User-Agent":"curl/7.81.0","X-B3-Sampled":"0","X-B3-Spanid":"abfdf79e32accb74","X-B3-Traceid":"3051a310747c75f7abfdf79e32accb74"}}
* Connection #0 to host httpbin.demo.svc.cluster.local left intact
# kubectl logs -n demo httpbin-6878558fdc-4c9gx -c istio-proxy
...
[2025-02-11T09:07:59.411Z] "GET /headers HTTP/1.1" 200 - via_upstream - "-" 0 203 3 3 "-" "curl/7.81.0" "9dfa83ca-6b06-47b7-ade6-22f136614071" "httpbin.demo.svc.cluster.local:8000" "172.16.0.19:80" inbound|80|| 127.0.0.6:55875 172.16.0.19:80 172.16.0.82:59942 - default
[2025-02-11T09:08:05.777Z] "GET /headers HTTP/1.1" 200 - via_upstream - "-" 0 203 1 1 "-" "curl/7.81.0" "e6700048-aa01-44d2-806b-f8e5355c50f7" "httpbin.demo.svc.cluster.local:8000" "172.16.0.19:80" inbound|80|| 127.0.0.6:45489 172.16.0.19:80 172.16.0.82:42988 - default
...
CNI插件升级说明
升级过程中您可以选择一个版本安装CNI插件,在升级完成之后将CNI插件也切换到新版本。