这是我的集群环境:
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主服务器正常访问SVC IP。 在主主机上,我已经部署了kube-proxy和法兰绒。
我的kubernetes集群的所有组件都是通过发行版二进制文件部署的。
我已经正常部署了群集,并且在大多数情况下,它可以在外部提供服务。 我已经部署了一个nginx服务器,我的屏幕截图:
Service IP: 10.254.126.228
Pod IP: 172.30.21.3
当我直接在kubernetes主主机上访问Pod IP(172.30.21.3)时,就可以正常访问它。
我的屏幕截图: http request
但是当我访问服务IP时,会发生访问超时。
我的屏幕截图: Access SVC IP time out
仅当在容器外部的主机上请求SVC IP时才会发生。如果我在容器中,则可以正常访问SVC IP。
我的屏幕截图: in the container http request
这是我的ipvs规则列表: ipvs rule list
我使用tcpdump监听了nginx Pod节点主机上的法兰绒.1 NIC和docker0 NIC,发现了以下问题:
当我直接在kubernetes主主机上访问Pod IP时,我的主主机上的法兰NIC会将数据包发送到节点主机法兰NIC,然后将其转发到docker0 NIC,最后转发到Pod IP。同时,pod IP将响应我的请求,一切正常。 但是,当我在kubernetes主主机上访问SVC IP时,我发现发送数据包的NIC更改为eth0而不是使用法兰绒NIC,因此节点主机上的法兰绒NIC直接丢弃了请求,并且没有继续转发到docker0。
我意识到这可能是基于策略的路由的问题。如果我将目标地址为10.254的请求转发到正确的网关,可以解决此问题吗?
但这应该有一个更标准的解决方案。谁能帮我吗?
(对不起,我的英语不太好...)
答案 0 :(得分:0)
您的svc CIDR似乎与主机CIDR相交
答案 1 :(得分:0)
内核IP路由表
目标网关Genmask标志度量标准引用使用Iface
0.0.0.0 10.125.232.1 0.0.0.0 UG 0 0 0 eth0
10.125.232.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.30.1.0 172.30.1.0 255.255.255.0 UG 0 0 0法兰绒1。
172.30.3.0 172.30.3.0 255.255.255.0 UG 0 0 0法兰绒1。
172.30.21.0 172.30.21.0 255.255.255.0 UG 0 0 0法兰绒。1
172.30.81.0 172.30.81.0 255.255.255.0 UG 0 0 0法兰绒。1
172.30.92.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
172.30.94.0 172.30.94.0 255.255.255.0 UG 0 0 0法兰绒。1
这是我的路由表。
@白栋天