Type=ClusterIP类型Service的源IP异常:与文档预期不符
问题原因与解决办法
核心原因
你的集群中部署了Linkerd服务网格(从请求头里的l5d-client-id字段可以确认),Pod被注入了Sidecar代理容器。此时流量的实际路径是:
- 源Pod的toolbox容器 → 本地Linkerd Sidecar代理
- Linkerd代理转发流量到ClusterIP Service
- 流量到达目标Pod的Linkerd Sidecar代理 → 转发到目标容器
Linkerd默认会对出站流量做SNAT(源地址转换),导致目标容器接收到的请求源IP变成了目标Pod自身的IP(因为Sidecar和业务容器共享网络命名空间,Sidecar的IP就是Pod的IP),这就和Kubernetes原生文档描述的行为不符了。
解决方法
要保留源Pod的真实IP,需要修改Linkerd的配置,让特定Service的流量跳过SNAT:
- 给你的ClusterIP Service添加Linkerd注解,指定需要保留源IP的端口:
apiVersion: v1 kind: Service metadata: name: clusterip annotations: linkerd.io/skip-outbound-ports: "80" # 填写Service暴露的端口 spec: type: ClusterIP selector: # 你的Pod标签 ports: - port: 80 targetPort: 8080
- 重新应用Service配置后,再次从toolbox Pod访问Service,目标容器就能获取到源Pod的真实IP了。
另外,也可以通过Linkerd的TrafficPolicy配置全局或特定服务的SNAT行为,不过针对单个Service添加注解是最直接的方式。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

