如何排查Kubernetes Pod所需全部连接以配置最严格Network Policy
要创建最严格的Network Policy,得先明确Pod的所有必要连接,以下是实操步骤:
抓包分析实时流量
直接在Pod内运行tcpdump抓取所有网络包,记录一段时间内的所有连接:kubectl exec -it <pod-name> -n <namespace> -- tcpdump -i any -w /tmp/pod-traffic.pcap运行足够长时间覆盖Pod的所有业务场景后,将抓包文件导出到本地用Wireshark分析,筛选出所有源/目标IP、端口和协议,这是最直接的流量记录。
排查关联的Service与Endpoint
查看Pod关联的Service(包括作为后端被访问的和主动访问的):- 列出命名空间内的所有Service:
kubectl get svc -n <namespace>,检查哪些Service的选择器匹配该Pod的标签。 - 查看Pod内注入的Service环境变量:
kubectl exec -it <pod-name> -n <namespace> -- env | grep SERVICE,这些变量通常对应Pod会访问的内部服务。 - 查看Service对应的Endpoint:
kubectl get endpoints <service-name> -n <namespace>,确认Pod连接的后端IP。
- 列出命名空间内的所有Service:
分析应用日志定位依赖
查看Pod的应用日志,寻找连接相关的关键词(如connect、timeout、failed to reach):kubectl logs -f <pod-name> -n <namespace>日志里通常会明确记载依赖的外部服务地址、API端点或数据库地址,这些都是必需的连接目标。
临时放宽策略并记录允许的流量
先创建一个允许所有进出流量的临时Network Policy:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: temp-allow-all namespace: <namespace> spec: podSelector: matchLabels: <pod-label-key>: <pod-label-value> policyTypes: - Ingress - Egress ingress: - {} egress: - {}然后开启CNI插件的流量日志功能(比如Calico、Cilium都支持),过滤该Pod的所有流量记录,整理出实际发生的连接规则,这能避免遗漏偶发的业务连接。
监控DNS查询记录
Pod访问内部Service或外部域名时会发起DNS请求,抓取DNS流量:kubectl exec -it <pod-name> -n <namespace> -- tcpdump -i any port 53分析查询的域名,对应到内部Service(通常是
<service-name>.<namespace>.svc.cluster.local格式)或外部域名,这些都是需要允许的目标。逐个禁用连接验证必要性
基于前面收集到的连接列表,逐个创建限制策略(比如禁止某个IP/端口),观察Pod的运行状态和业务是否正常。如果禁用后出现报错或功能失效,说明该连接是必需的;反之则可以排除。
内容的提问来源于stack exchange,提问作者k_roszczak

