1、同一节点不同pod之间的通信原理
[root@server2 ~]# kubectl get pod -o wide 查看pod 的ip
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deployment-2-77cd76f9c5-2zrkd 1/1 Running 1 (7h40m ago) 25h 10.244.2.68 server4 <none> <none>
deployment-2-77cd76f9c5-96cwp 1/1 Running 1 (7h40m ago) 25h 10.244.2.69 server4 <none> <none>
deployment-2-77cd76f9c5-stppk 1/1 Running 1 (7h40m ago) 25h 10.244.1.77 server3 <none> <none>
deployment-678fcbc488-2lf22 1/1 Running 1 (7h40m ago) 30h 10.244.1.80 server3 <none> <none>
deployment-678fcbc488-5ms5s 1/1 Running 1 (7h40m ago) 30h 10.244.2.70 server4 <none> <none>
deployment-678fcbc488-sgcd6 1/1 Running 1 30h 10.244.1.79 server3 <none> <none>
[root@server2 ~]# kubectl exec -it deployment-2-77cd76f9c5-stppk -- sh 进入其中一个pod
/ # route -n 查看容器的网关
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.244.1.1 0.0.0.0 UG 0 0 0 eth0
10.244.0.0 10.244.1.1 255.255.0.0 UG 0 0 0 eth0
10.244.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
/ # ping 10.244.1.80 可以看出同一节点server3上不同pod可以通信,原理是数据包通过默认网关连接网桥cni0通信,然后网桥连接另一个pod
PING 10.244.1.80 (10.244.1.80): 56 data bytes
64 bytes from 10.244.1.80: seq=0 ttl=64 time=0.212 ms
64 bytes from 10.244.1.80: seq=1 ttl=64 time=0.071 ms
2、不同节点不同pod之间的通信原理
flannel网络原理图:
[root@server2 ~]# kubectl exec -it deployment-2-77cd76f9c5-stppk -- sh
/ # ping 10.244.2.70 此节点地址在server4上,
PING 10.244.2.70 (10.244.2.70): 56 data bytes
64 bytes from 10.244.2.70: seq=0 ttl=62 time=1.059 ms
64 bytes from 10.244.2.70: seq=1 ttl=62 time=0.445 ms
节点上的pod的ip地址是由是由subnet划分的,如下
[root@server3 ~]# cd /var/run/flannel
[root@server3 flannel]# cat subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.1.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
封装信息如何得知?
知道原地址10.244.1.77和目标地址10.244.2.70,现在需要知道原mac地址和目标mac地址,原mac地址好找
[root@server3 flannel]# ip addr show flannel.1 可以查看原mac地址
但是server3是如何知道server4上的mac地址
[root@server3 flannel]# route -n 可以看出0网段和2网段的都要走隧道模式到flannel.1
[root@server3 flannel]# arp -an
后端mac地址的获取是由后台程序 flanneld运行在后端,他在分配子网段后,他还会获取整个集群节点的内部信息,他还会把每个设备的mac地址缓存到本地
[root@server3 flannel]# ps ax | grep flanneld
6163 ? Ssl 0:38 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
17409 pts/0 S+ 0:00 grep --color=auto flannel
知道原地址和mac地址,目标地址和mac地址,然后通过vxlan进行1此封装,现在还需要知道对端flannel.1连接的eth0 ip地址和mac地址,需要查询转发数据库
[root@server3 flannel]# bridge fdb 查询,可以查出目标eth0的设备地址为172.25.50.4
然后再通过[root@server3 flannel]# arp -an 查寻172.25.50.4的mac地址
知道eth0这些地址后进行一个正常的udp封装,内部数据帧承载着正常的udp数据包传到对端eth0上,然后对端开始解包,匹配到内部数据帧是flannel.1d的然后由对端flannel.1 vtep进行解包,拿到原地址和目标地址
[root@server4 ~]# route -n 可以看到目标地址走的是2网段所以开始走cni0,这样就可以通信了