如何查看Kubernetes Pod访问的目标IP地址以配置网络策略
针对配置Network Policy Egress规则时无法确认Azure CDN管理接口目标IP的问题,可通过以下几种零侵入/低侵入的方案精准获取需要放行的IP与主机名,无需依赖官方公开文档:
临时调试侧车抓包(最推荐,对业务影响最小)
找到运行业务代码的目标Pod,通过kubectl debug注入带网络工具的临时容器,和业务容器共享网络命名空间,无需修改原有业务镜像:kubectl debug -it <业务Pod名称> --image=nicolaka/netshoot --target=<业务容器名称> -- bash
进入临时容器后,先执行命令抓取HTTPS出向流量,过滤掉你已经放行的已知IP段:tcpdump -nn dst port 443 and not src net <已放行的已知IP段> -i eth0
手动触发一次CdnManagementClient.Endpoints.PurgeContent调用,终端输出中dst字段对应的IP就是待放行的目标地址。如果需要获取访问的主机名,额外抓53端口的DNS请求即可:tcpdump -nn dst port 53 -i eth0注意:如果集群版本低于1.23未开启临时容器特性,可临时将业务副本数调整为1,在Pod定义中新增一个共享网络命名空间的netshoot侧车容器,抓包完成后删除调试配置恢复即可,不要在生产环境长期留存调试容器。
节点侧零侵入抓流
如果有集群节点的SSH权限,完全不需要触碰业务Pod,直接在运行业务Pod的节点上抓包即可。先查询业务Pod的IP,执行tcpdump过滤对应源IP的443出向流量:tcpdump -nn dst port 443 and src host <业务PodIP> -i any
触发CDN清除操作后,就能直接看到所有发起的连接目标IP。也可以用conntrack命令直接读取主机上的连接跟踪表,获取已经建立的出向连接记录:conntrack -L | grep <业务PodIP> | grep 443临时全放行+流量审计
如果不想手动抓包,可以临时给业务Pod配置一条允许全出向的Network Policy规则,覆盖所有业务操作场景(包括CDN Purge调用),运行10-15分钟后从节点连接跟踪表、或者集群的CNI流量日志中导出所有业务Pod发起的出向连接记录,筛选出对应Azure管理服务的IP段后,删除临时全放行规则,将整理好的IP段配置到正式的Egress规则中即可。
额外说明:你使用的CdnManagementClient属于Azure官方SDK,默认会调用Azure资源管理端点,对应域名通常为management.azure.com以及CDN实例所属区域的管理域名,抓包时看到解析到这类域名的IP即为目标地址。注意Azure公有云服务的端点IP会定期动态调整,长期运维建议直接同步对应服务标签的IP段配置规则,比手动维护静态IP稳定性更高。
内容的提问来源于stack exchange,提问作者Water

