kube-ovn
kube-ovn copied to clipboard
pod内部获取到的web请求的源ip不是外部请求的真实ip
Expected Behavior
pod内部获取到的web请求的源ip是外部请求发起的IP地址。
Actual Behavior
pod内部获取到的web请求的源ip是node节点在join子网的IP地址。
Steps to Reproduce the Problem
- 集群外node访问nodeport 的ip
- pod内部打印remoteAddr
Additional Info
-
Kubernetes version:
Output of
kubectl version
:[root@master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:58:59Z", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", Compiler:"gc", Platform:"linux/amd64"}
- kube-ovn version:
kube-ovn version v1.8.1 or v1.9.3
- operation-system/kernel version:
**Output of `awk -F '=' '/PRETTY_NAME/ { print $2 }' /etc/os-release`:**
**Output of `uname -r`:**
[root@master ~]# cat /etc/os-release NAME="NFS Server" VERSION="4.0 (RTM2.9)" ID="NFS" ID_LIKE="NFS" VERSION_ID="4.0" SYSTEM_VERSION="4.0.200824" PRETTY_NAME="NFS Server 4.0 (RTM2.9)" ANSI_COLOR="0;31" HOME_URL="http://www.nfschina.com" [root@master ~]# uname -r 4.19.113-1.nfs.25.4.x86_64
外部节点为172.18.171.10,访问nodeport
pod内部打印的remoteAddr为:
抓包:
pod内获取remote ip的程序段:
我们希望应用内部获取到的source ip 不是100.64.0.5 而是 172.18.171.10
请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。
那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。
目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。
请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。
那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。
目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。
请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?
请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。 那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。 目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。
请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?
多对一的关系,都会 snat 成访问 Node 的 ip。snat 成匹配路由网卡的那个 IP,如 ovn0 的 IP
请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。 那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。 目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。
请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?
多对一的关系,都会 snat 成访问 Node 的 ip。snat 成匹配路由网卡的那个 IP,如 ovn0 的 IP
明白了,谢谢
请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。 那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。 目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。
请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?
多对一的关系,都会 snat 成访问 Node 的 ip。snat 成匹配路由网卡的那个 IP,如 ovn0 的 IP
如果我想看到哪些源IP snat成了 ovn0 的 IP,我应该怎样去抓取呢?
@CraneRZz 你可以在 pod 的 netNS 里抓网卡或者直接在 pod 内部抓包
@CraneRZz 你可以在 pod 的 netNS 里抓网卡或者直接在 pod 内部抓包
好的,感谢您的耐心解答!