追踪链路--使用iptables/ipvs来记录后端pod真实ip
·
使用iptables记录后端Pod真实IP
在Kubernetes集群中,可以通过修改iptables规则来记录经过Service转发的流量真实来源IP。以下是具体实现方法:
修改kube-proxy配置,确保--proxy-mode=iptables并启用--feature-gates=ProxyTrafficEndpoints=true
在iptables的PREROUTING或INPUT链添加日志规则:
iptables -t raw -I PREROUTING -p tcp -m tcp --dport <服务端口> -j LOG --log-prefix "K8S Traffic: "
iptables -t raw -I PREROUTING -p udp -m udp --dport <服务端口> -j LOG --log-prefix "K8S Traffic: "
查看日志时需要过滤特定标记:
journalctl -k -f | grep "K8S Traffic"
使用ipvs模式记录真实IP
当kube-proxy使用ipvs模式时(--proxy-mode=ipvs),可通过以下方式获取真实客户端IP:
启用ipvs连接追踪:
sysctl -w net.ipv4.vs.conntrack=1
查看连接状态信息:
ipvsadm -ln --stats
ipvsadm -ln --connection
在Pod的应用程序中获取X-Forwarded-For头信息,需要配置Service的externalTrafficPolicy: Local并确保负载均衡器传递原始IP。
网络策略增强方案
结合NetworkPolicy资源定义更精细的访问控制:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: log-traffic
spec:
podSelector: {}
ingress:
- from:
- podSelector: {}
ports:
- protocol: TCP
port: <端口号>
日志分析优化
对于大规模集群,建议将iptables日志发送到集中式日志系统:
iptables -t raw -I PREROUTING -p tcp -j NFLOG --nflog-group 100 --nflog-prefix "k8s_trace:"
使用ulogd工具收集nflog分组100的日志,并配置日志解析规则提取源IP、目标IP和端口信息。
注意事项
- 在生产环境启用详细日志可能影响性能,建议按需采样
- 需要确保节点有足够日志存储空间
- 在IPVS模式下,原始客户端IP可能被SNAT替换,需要正确配置kube-proxy的
--ipvs-exclude-cidrs参数 - 对于NodePort类型的Service,客户端IP记录取决于
externalTrafficPolicy配置
更多推荐



所有评论(0)