这是我的集群环境:</p>
service cluster ip cidr:10.254.0.0/16
pod ip cidr: 172.30.0.0/16
kube-proxy: ipvs mode
flannel : vxlan
kubectl 版本
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.4", GitCommit:"5ca598b4ba5abb89bb773071ce452e33fb66339d", GitTreeState:"clean", BuildDate:"2018-06-06T08:13:03Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.4", GitCommit:"5ca598b4ba5abb89bb773071ce452e33fb66339d", GitTreeState:"clean", BuildDate:"2018-06-06T08:00:59Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
我期望的结果:我可以从kubernetes master正常访问SVC IP。在master主机上,我已经部署了kube-proxy和flannel。
我的 kubernetes 集群的所有组件都是通过发布二进制文件部署的。
我已经正常部署了我的集群,大部分情况下,它可以对外提供服务。我已经部署了一个nginx服务器,我的截图:
Service IP: 10.254.126.228
Pod IP: 172.30.21.3
我在kubernetes master主机上直接访问pod IP(172.30.21.3)时,可以正常访问。
我的截图: http请求
但是当我访问服务IP时,会出现访问超时。
我的截图: 访问 SVC IP 超时
这只会在容器外部的主机上请求 SVC IP 时发生。如果我在容器中,我可以正常访问 SVC IP。
我的截图: 在容器http请求中
这是我的 ipvs 规则列表: ipvs rule list
使用tcpdump监听nginx pod节点主机上的flannel.1网卡和docker0网卡,发现如下问题:
当我在 kubernetes master 主机上直接访问 pod IP 时,我的 master 主机上的 flannel 网卡会将数据包发送到节点主机 flannel NIC ,然后转发到 docker0 网卡,最后是 pod IP。同时pod IP会响应我的请求,一切正常。但是当我在kubernetes master主机上访问SVC IP时,发现发包的网卡变成了eth0而不是使用flannel网卡,所以node主机上的flannel网卡直接丢掉了请求,没有继续转发到码头工人0。
我意识到这可能是基于策略的路由的问题。如果我将目标为 10.254 的请求转发到正确的网关,我可以解决这个问题吗?
但这应该有一个更标准的解决方案。谁能帮我?
(对不起,我的英文不是很好……)</p>