灵活控制流量免于经过Sidecar代理
功能介绍
Sidecar 代理主要用于管理服务间流量、网络安全性、可观测性。默认情况下,Sidecar 代理会全部拦截进出 Pod 的流量。然而,在一些特定场景下,有需求灵活设置 Pod 中某些端口进出流量是否经过 Sidecar 代理。
本文将以配置所有端口的入站流量不经过 Sidecar 代理(sidecar-include-inbound-ports=""),而 80 端口的出站流量经过 Sidecar 代理(sidecar-include-outbound-ports="80")为例,展示如何实现特定的入站流量免于经过 Sidecar 代理,特定的出站流量经过 Sidecar 代理。
注解说明
下述注解作用在命名空间级别,注解说明如下:
- sidecar-exclude-inbound-ports:在命名空间级别上配置端口 使配置的端口入口流量不经过 Sidecar 代理,其他端口入口流量将继续通过 Sidecar 代理处理。若为多个端口,可以设置为一个以逗号分隔的端口列表,如:sidecar-exclude-inbound-ports: "9999"
- sidecar-include-outbound-ports:在命名空间级别上配置端口使 配置的特定出口流量经过 Sidecar 代理,其他出口流量不经过 Sidecar 代理。若为多个端口,可以设置为一个以逗号分隔的端口列表,如:sidecar-include-outbound-ports: "80,8099"
-
sidecar-include-inbound-ports:在命名空间级别上配置端口使 配置的特定入口流量经过 Sidecar 代理,其他出口流量不经过 Sidecar 代理。若为多个端口,可以设置为一个以逗号分隔的端口列表,如:sidecar-include-inbound-ports: "80,8099"
- 如果想让所有的端口入口流量都不经过 Sidecar,可以设置为 sidecar-include-inbound-ports="",这样所有的流量都会绕过 Sidecar 代理。
注意:因为上述配置为命名空间级别,请谨慎配置。
如果流量链路上涉及的上下游应用开启了 Sidecar 注入,不能配置 Client 某端口出口流量经过 Sidecar 代理,而 Server 端入口流量不经过 Sidecar 代理,该场景会出现 TLS 报错。 举个例子:如设置 Client 端 sidecar-include-outbound-ports="80" ,设置了 Server 端 sidecar-include-inbound-ports="",请求会报错查看日志显示 TLS error: 268435703:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER
前提条件
- 已创建CSM网格实例。具体操作,请参见CSM实例管理。
- 已添加CCE集群到CSM实例。
- 已开启目标命名空间 sidecar 自动注入。
操作步骤
添加命名空间级别注解
为目标命名空间添加以下注解,以配置所有端口的入站流量不经过 Sidecar 代理,同时确保 80 端口的出站流量经过 Sidecar 代理:
1kubectl annotate ns default sidecar-include-inbound-ports=""
2kubectl annotate ns default sidecar-include-outbound-ports="80"
注意⚠️ 如果命名空间下已有 Pod,需要重启这些 Pod 以使配置生效。此配置在命名空间级别全局生效,配置错误将导致该命名空间下所有 Pod 在新建或重启时出现异常。
部署应用
- 通过 CSM > 集群管理 跳转到 CCE 集群,进行应用部署。
- 点击 “工作负载 > 无状态部署 > 使用YAML部署”,部署测试应用。
测试Yaml文件如下所示:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: pod-a
5 labels:
6 app: pod-a
7spec:
8 replicas: 1
9 selector:
10 matchLabels:
11 app: pod-a
12 template:
13 metadata:
14 labels:
15 app: pod-a
16 annotations:
17 sidecar.istio.io/inject: "false"
18 spec:
19 containers:
20 - name: pod-a
21 image: registry.baidubce.com/csm-offline/helloworld:v1
22 resources:
23 requests:
24 cpu: "100m"
25 imagePullPolicy: IfNotPresent
26 ports:
27 - containerPort: 5000
28---
29apiVersion: apps/v1
30kind: Deployment
31metadata:
32 name: pod-b
33 labels:
34 app: pod-b
35spec:
36 replicas: 1
37 selector:
38 matchLabels:
39 app: pod-b
40 template:
41 metadata:
42 labels:
43 app: pod-b
44 spec:
45 restartPolicy: Always
46 containers:
47 - name: pod-b
48 image: registry.baidubce.com/csm-offline/bms-orignal-consumer:dev
49 imagePullPolicy: Always
50 ports:
51 - containerPort: 9999
52---
53apiVersion: apps/v1
54kind: Deployment
55metadata:
56 name: pod-c
57 labels:
58 app: pod-c
59spec:
60 replicas: 1
61 selector:
62 matchLabels:
63 app: pod-c
64 template:
65 metadata:
66 labels:
67 app: pod-c
68 annotations:
69 sidecar.istio.io/inject: "false"
70 spec:
71 restartPolicy: Always
72 containers:
73 - name: pod-c
74 image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev
75 imagePullPolicy: Always
76 ports:
77 - containerPort: 10001
工作负载如下所示:
- 点击 “流量接入 > 服务 > 使用YAML部署”,部署测试应用的服务。
测试Yaml文件如下所示:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-a
5 labels:
6 app: pod-a
7spec:
8 ports:
9 - port: 5000
10 name: http
11 selector:
12 app: pod-a
13---
14apiVersion: v1
15kind: Service
16metadata:
17 name: service-b
18 annotations:
19 prometheus.io/scrape: "true"
20spec:
21 selector:
22 app: pod-b
23 type: ClusterIP
24 sessionAffinity: None
25 ports:
26 - protocol: TCP
27 port: 9999
28 targetPort: 9999
29 name: http-port
30---
31apiVersion: v1
32kind: Service
33metadata:
34 name: provider-demo
35 annotations:
36 prometheus.io/scrape: "true"
37spec:
38 selector:
39 app: pod-c
40 type: ClusterIP
41 sessionAffinity: None
42 ports:
43 - protocol: TCP
44 port: 80
45 targetPort: 10001
46 name: http-port
服务 service 如下所示:
流量验证
进入 pod-b pod 中 istio-proxy 容器,执行下述命令开启 pod-b 容器的 Sidecar debug 日志:
1curl -s -X POST 127.1:15000/logging\?level\=debug
进入 pod-a 容器中执行以下命令,并查看 pod-b 的 Sidecar debug 日志。
1curl http://<pod-b-podIP>:9999/echo-rest/hello && echo
预期输出
流量正常通过,且 Sidecar 日志中仅记录 80 端口的出站流量,而没有入站端口的流量。
请注意,当 Pod 单独设置了注解 traffic.sidecar.istio.io/excludeInboundPorts、traffic.sidecar.istio.io/includeInboundPorts 或 traffic.sidecar.istio.io/includeOutboundPorts,且这些注解值与命名空间的注解值不一致时,Pod 的注解将优先于命名空间的注解。