virtualbox搭建k8s后flannel网络节点之间ping不通问题


环境介绍:virtualbox 创建三个节点,一个master, 两个node 节点。每个节点都采用 net 网络(访问外网)和host-only网络(内网访问)。信息如下:
master:
网卡1 enp0s3 :192.168.99.100/24 (Host-only 网络,通过此IP 和 node1 和 node2 互通)
网卡1 enp0s8 :10.0.3.15/24 (Net 网络)
node1:
网卡1 enp0s3 :192.168.57.3/24 (Host-only 网络,通过此IP 和 master 和 node1 互通)
网卡1 enp0s8 :10.0.3.16/24(Net 网络)
node2:
网卡1 enp0s3 :192.168.58.2/24(Host-only 网络,通过此IP 和 master 和 node1 互通)
网卡1 enp0s8 :10.0.3.17/24(Net 网络)

master 通过host-only网络可以和node1和node2 互通,也就是 可以ping 通 192.168.57.3, 但是不能ping通 10.0.3.16。

通过yum 安装kubernetes(v1.5.2),ectd( 3.1.7),flannel(0.7.0)。
master上设置网络: etcdctl set /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
node1: 设置 /run/flannel/subnet.env 为:
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.94.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
/etc/sysconfig/flanneld 为:
FLANNEL_ETCD_ENDPOINTS="http://192.168.99.100:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
FLANNEL_OPTIONS="-iface=enp0s3 -public-ip=192.168.58.2 -ip-masq=true"

node2:设置 /run/flannel/subnet.env 为:
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.50.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
/etc/sysconfig/flanneld 为:
FLANNEL_ETCD_ENDPOINTS="http://192.168.99.100:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
FLANNEL_OPTIONS="-iface=enp0s3 -public-ip=192.168.57.3 -ip-masq=true"

然后启动master 和 两个node后,
node1 新增了网卡:
flannel0:172.17.94.0/16
docker0:172.17.94.1/24
执行route -n:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.3.2 0.0.0.0 UG 100 0 0 enp0s8
10.0.3.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s8
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
172.17.94.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.57.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3

执行 ip route:
default via 10.0.3.2 dev enp0s8 proto static metric 100
10.0.3.0/24 dev enp0s8 proto kernel scope link src 10.0.3.16 metric 100
172.17.0.0/16 dev flannel0 proto kernel scope link src 172.17.94.0
172.17.94.0/24 dev docker0 proto kernel scope link src 172.17.94.1
192.168.57.0/24 dev enp0s3 proto kernel scope link src 192.168.57.3 metric 100

node2 新增了网卡:
flannel0: 172.17.50.0/16
docker0: 172.17.50.1/24
执行route -n :
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.3.2 0.0.0.0 UG 0 0 0 enp0s8
10.0.3.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 enp0s8
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
172.17.0.0 0.0.0.0 255.255.0.0 U 1 0 0 flannel0
172.17.50.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.58.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3

执行 ip route:
default via 10.0.3.2 dev enp0s8
10.0.3.0/24 dev enp0s8 proto kernel scope link src 10.0.3.17
169.254.0.0/16 dev enp0s8 scope link metric 1003
172.17.0.0/16 dev flannel0
172.17.0.0/16 dev flannel0 scope link metric 1
172.17.50.0/24 dev docker0 proto kernel scope link src 172.17.50.1
192.168.58.0/24 dev enp0s3 proto kernel scope link src 192.168.58.2 metric 100

但是这时在node1 上ping 172.17.50.1 不通, node2 上ping 172.17.94.1 也不通。所以之后部署了dns服务后,如果kubernetes 服务在node2 上是,在node2 上执行 nslookup kubernetes.default.svc.cluster.local 10.254.254.254 可以正常返回:
Server: 10.254.254.254
Address: 10.254.254.254#53

Non-authoritative answer:
Name: kubernetes.default.svc.cluster.local
Address: 10.254.0.1

但是在node1上执行,就会返回:
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached

使用tcpdump抓包,发现在node1上ping node2 的docker 网卡地址时,使用的是enp0s8出去的,不晓得这里是不是有问题,具体表现如下图:

111.jpeg


不知有没有前辈遇到类似的问题,求助,谢谢。
已邀请:

wisen

赞同来自:


两个问题很奇怪:
1. 你虚拟机的三个hostonly IP就不在同一个网段,真能ping通?

master: 192.168.99.100/24
node1: 192.168.57.3/24
node2: 192.168.58.2/24

2. flannel 中明明指定了iface为enp0s3, public IP,但是抓包截图完全不对劲。
IP 不对,应该是你设置的iface 的IP
协议也不对,默认封包是UDP(你可以看看本地7890端口有没有开起来)

liyj144

赞同来自:


问题1, 通过hostonly 网络这三个ip确实是互通的。
问题2: flannel中确实指定了iface,但是就是不知道为什么抓包却不正常。在stackoverflow上提问,有人回答说升级到k8s 1.6 版本试一下,今晚升级下试试。

qlu

赞同来自:


我在虚拟机上尝试过。我没有使用host-only的网卡。只使用的nat的网卡,三台nat的机器在一个nat的network里面。
在我的环境里面flannel 确实应该是桥接到enp0s8上,Node1的报文从enp0s8上出去也是对的。

你可以尝试在Node2的enp0s8上抓包看能不能收到。如果能收到,再进一步到flannel端口上抓包,一步一步排查。

如果发现enp0s8/flannel可以收到报文,但是没有往docker0端口转发的话,很有可能是centos 防火墙的问题。

要回复问题请先登录注册