节点的地址段
在节点加入集群之后,默认会分配一块地址段:
这是集群根据规则预先分配好的,所以作者的node1节点中的Pod都是10.244.36.xx地址,node2节点都是10.244.169.xx地址。
以下的大段文章是作者的个人理解,有歧义的地方可以讨论。
创建Pod之后发生什么
创建Pod之后,节点机会创建一个veth设备对,一头连接Pod,另一头挂载到节点的网络命名空间内。
部署了三个副本,其中node2节点分配了两个,每个Pod里面只有一个容器,现在就在node2机器上观察。
(1)每创建一个Pod,就会生成一对veth设备。我们可以通俗的认为就是一对虚拟网卡,它的一头挂在Pod内,也就是容器内。另一头挂到节点机的默认网络命名空间内。我们这里有两个Pod,因此就创建了两对这样的设备。
(2)什么是veth设备呢?
在实际生活中,我们知道两个电脑可以用一根网线对连,因为网线两端就是两个网卡,linux就想,我能不能照着这个情景也模拟一下,于是就产生了veth设备。这个设备是软件模拟的,成对出现,从一头进,就马上从另一头出,这就是它的特性。
Ping节点内的Pod怎么走
当我们ping 10.244.169.154时,系统会发现这个网段是自己内部的。因为这个网卡是属于自己的,就是说当前系统认为自己有三个网卡(见拓扑图),所以它就把这个数据直接转给veth设备一头的calidc35cdcb4a6,然后这个数据就流到容器内部的eth0设备。
查看本机路由进一步验证
在本机路由中,可以查看它路由的规则
#执行命令
ip route show
----------- 结果 ----------------
...
10.244.169.154 dev calif0a25e5265a scope link
10.244.169.155 dev calidc35cdcb4a6 scope link
...
规则表示:凡是发到这两个地址的数据,直接通过dev cali....发送。
如何验证这两个设备就是一对呢?
第一步:进入Pod内部的容器查看,命令:
#进入容器,其中92d43f5f168b是创建的一个容器
docker exec -it 92d43f5f168b sh
#执行ip addr show命令
ip addr show
----------- 结果 ----------------
eth0@if35: <BROADCAST,MULTICAST.......
可以看到eth0虚拟网卡的对端序号是35,退出容器。
第二步:根据序号查找veth设备
#在节点机内(的网络命名空间)执行
ip link show | grep -E '^35:'
----------- 结果 ----------------
35: calidc35cdcb4a6@if4: <BROADCAST,MULTICAST,UP.....
可以看到就是另一端的calidc35cdcb4a6,这说明容器内的eth0和calidc35cdcb4a6是一对设备。在另一个Pod操作方法相同。
总结
同学们看完本篇之后考试一下(做题是最快的成长方式):
- 节点上ping本地的Pod,为什么能ping通?
- 在容器中的网卡设备名字叫什么?怎样能找到它的配对设备?
评论聊一聊。