灵活控制流量免于经过Sidecar代理
功能介绍
Sidecar 代理主要用于管理服务间流量、网络安全性、可观测性。默认情况下,Sidecar 代理会全部拦截进出 Pod 的流量。然而,在一些特定场景下,有需求灵活设置 Pod 中某些端口进出流量是否经过 Sidecar 代理。
本文将以配置 9999 端口的入站流量不经过 Sidecar 代理(sidecar-exclude-inbound-ports),而 80 端口的出站流量经过 Sidecar 代理(sidecar-include-outbound-ports)为例,展示如何实现特定的入站流量免于经过 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"
前提条件
- 已创建CSM网格实例。具体操作,请参见CSM实例管理。
- 已添加CCE集群到CSM实例。
- 已开启目标命名空间 sidecar 自动注入。
操作步骤
添加命名空间级别注解
- 为目标命名空间添加以下注解,以配置 9999 端口的入站流量不经过 Sidecar 代理,同时确保 80 端口的出站流量经过 Sidecar 代理:
kubectl annotate ns <namespaceName> sidecar-exclude-inbound-ports=9999
kubectl annotate ns <namespaceName> sidecar-include-outbound-ports=80
注意⚠️ 如果命名空间下已有 Pod,需要重启这些 Pod 以使配置生效。此配置在命名空间级别全局生效,配置错误将导致该命名空间下所有 Pod 在新建或重启时出现异常。
部署应用
- 通过 CSM > 集群管理 跳转到 CCE 集群,进行应用部署。
- 点击 “工作负载 > 无状态部署 > 使用YAML部署”,部署测试应用。
测试Yaml文件如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-a
labels:
app: pod-a
spec:
replicas: 1
selector:
matchLabels:
app: pod-a
template:
metadata:
labels:
app: pod-a
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: pod-a
image: registry.baidubce.com/csm-offline/helloworld:v1
resources:
requests:
cpu: "100m"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-b
labels:
app: pod-b
spec:
replicas: 1
selector:
matchLabels:
app: pod-b
template:
metadata:
labels:
app: pod-b
spec:
restartPolicy: Always
containers:
- name: pod-b
image: registry.baidubce.com/csm-offline/bms-orignal-consumer:dev
imagePullPolicy: Always
ports:
- containerPort: 9999
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-c
labels:
app: pod-c
spec:
replicas: 1
selector:
matchLabels:
app: pod-c
template:
metadata:
labels:
app: pod-c
annotations:
sidecar.istio.io/inject: "false"
spec:
restartPolicy: Always
containers:
- name: pod-c
image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev
imagePullPolicy: Always
ports:
- containerPort: 10001
工作负载如下所示:
- 点击 “流量接入 > 服务 > 使用YAML部署”,部署测试应用的服务。
测试Yaml文件如下所示:
apiVersion: v1
kind: Service
metadata:
name: service-a
labels:
app: pod-a
spec:
ports:
- port: 5000
name: http
selector:
app: pod-a
---
apiVersion: v1
kind: Service
metadata:
name: service-b
annotations:
prometheus.io/scrape: "true"
spec:
selector:
app: pod-b
type: ClusterIP
sessionAffinity: None
ports:
- protocol: TCP
port: 9999
targetPort: 9999
name: http-port
---
apiVersion: v1
kind: Service
metadata:
name: provider-demo
annotations:
prometheus.io/scrape: "true"
spec:
selector:
app: pod-c
type: ClusterIP
sessionAffinity: None
ports:
- protocol: TCP
port: 80
targetPort: 10001
name: http-port
服务 service 如下所示:
流量验证
进入 pod-b pod 中 istio-proxy 容器,执行下述命令开启 pod-b 容器的 Sidecar debug 日志:
curl -s -X POST 127.1:15000/logging\?level\=debug
进入 pod-a 容器中执行以下命令,并查看 pod-b 的 Sidecar debug 日志。
curl http://<pod-b-podIP>:9999/echo-rest/hello && echo
预期输出
流量应正常通过,且 Sidecar 日志中仅记录 80 端口的出站流量,而没有 9999 端口的入站流量。
请注意,当 Pod 单独设置了注解 traffic.sidecar.istio.io/excludeInboundPorts 或 traffic.sidecar.istio.io/includeOutboundPorts,且这些注解值与命名空间的注解值不一致时,Pod 的注解将优先于命名空间的注解。