pod 中部署的是 asp.net core 应用,客户端请求是这样转发的(没有走 ingress)
客户端 -> 阿里云负载均衡 -> nodeport service -> pod
阿里云负载均衡的健康检查地址配置的是网站首页地址,开始一切正常,后来给首页加了 IP 限流,限流代码中忽略了 IPv4 私网 IP 地址(白名单),但阿里云负载均衡的健康检查却失败了
后来跟踪了 pod 的对端(也就是 nodeport service)才发现是下面这样的 IP 地址
::ffff:192.168.2.71
原来在 nodeport service 与 pod 通信时, 竟然将 IPv4 地址转换为 IPv6 地址格式,完美地跳过了 IP 限流的白名单
请问 k8s 为什么要这么做?
::ffff:192.168.2.71 是一个ipv4 mapped 到 ipv6的地址, pod监听了ipv6, 所以socket从ipv4 mapped 到了ipv6. 或者流量转发的路径上有ipv6相关的配置?
本质是因为 Kubernetes 中 Pod 接收到的客户端 IP 被转成了 IPv4-mapped IPv6 地址 的形式,这其实并不是 Kubernetes刻意为之,而是网络协议栈(通常是 Node 上的 kube-proxy 或宿主机内核)在处理方式上的一个标准行为
pod 的健康检查也是这个 IPv6 地址格式
– dudu 4个月前