发布时间:2020-03-02 09:50:30来源:阅读:
我们这里假设flannel使用VXLAN协议。每台主机都安装有flannel。k8s定义的flannel网络为10.0.0.0/16,各主机的flannel从这个网络申请一个子网。pod1所在的主机的flannel子网为10.0.14.1/24,pod2所在主机的flannel子网为10.0.5.1/24。每台主机有cni0和flannel.1虚拟网卡。cni0为在同一主机pod共用的网桥,当kubelet创建容器时,将为此容器创建虚拟网卡vethxxx,并桥接到cni0网桥。flannel.1是一个tun虚拟网卡,接收不在同一主机的POD的数据,然后将收到的数据转发给flanneld进程。原理图:
pod1路由表:
default via 10.0.14.1 dev eth0
10.0.0.0/16 via 10.0.14.1 dev eth0
10.0.14.0/24 dev eth0 proto kernel scope link src 10.0.14.15
host1路由表:
default via 192.168.93.254 dev eno16777984 proto static metric 100
10.0.0.0/16 dev flannel.1
10.0.14.0/24 dev cni0 proto kernel scope link src 10.0.14.1
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.93.0/24 dev eno16777984 proto kernel scope link src 192.168.93.212 metric 100
pod1 IP地址:10.0.14.15
pod2 IP地址:10.0.5.150
下面是从pod1 ping pod2的数据包流向
1. pod1(10.0.14.15)向pod2(10.0.5.150)发送ping,查找pod1路由表,把数据包发送到cni0(10.0.14.1)
2. cni0查找host1路由,把数据包转发到flannel.1
3. flannel.1虚拟网卡再把数据包转发到它的驱动程序flannel
4. flannel程序使用VXLAN协议封装这个数据包,向api-server查询目的IP所在的主机IP,称为host2(不清楚什么时候查询)
5. flannel向查找到的host2 IP的UDP端口8472传输数据包
6. host2的flannel收到数据包后,解包,然后转发给flannel.1虚拟网卡
7. flannel.1虚拟网卡查找host2路由表,把数据包转发给cni0网桥,cni0网桥再把数据包转发给pod2
8. pod2响应给pod1的数据包与1-7步类似
下面是这次ping数据包的wireshark解析出的协议数据:
pod1 ping请求:
pod2响应:
pod1和pod2在同一台主机的话,由cni0网桥直接转发请求到pod2,不需要经过flannel。
创建一个service时,相应会创建一个指向这个service的域名,域名规则为{服务名}.{namespace}.svc.{集群名称}。之前service ip的转发由iptables和kube-proxy负责,目前基于性能考虑,全部为iptables维护和转发。iptables则由kubelet维护。service仅支持udp和tcp协议,所以像ping的icmp协议是用不了的,所以无法ping通service ip。
现在我们尝试看看在pod1向kube-dns的service ip 10.16.0.10:53发送udp请求是如何转发的。
我们先找出与此IP相关的iptables规则:
【PREROUTING链】
-m comment --comment "kubernetes service portals" -j KUBE-SERVICES
【KUBE-SERVICES链】
-d 10.16.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
【KUBE-SVC-TCOU7JCQXEZGVUNU链】
-m comment --comment "kube-system/kube-dns:dns" -j KUBE-SEP-L5MHPWJPDKD7XIFG
【KUBE-SEP-L5MHPWJPDKD7XIFG链】
-p udp -m comment --comment "kube-system/kube-dns:dns" -m udp -j DNAT --to-destination 10.0.0.46:53
pod1向service ip 10.16.0.10:53发送udp请求,查找路由表,把数据包转发给网桥cni0(10.0.14.1)
在数据包进入cnio网桥时,数据包经过PREROUTING链,然后跳至KUBE-SERVICES链
KUBE-SERVICES链中一条匹配此数据包的规则,跳至KUBE-SVC-TCOU7JCQXEZGVUNU链
KUBE-SVC-TCOU7JCQXEZGVUNU不做任何操作,跳至KUBE-SEP-L5MHPWJPDKD7XIFG链
KUBE-SEP-L5MHPWJPDKD7XIFG里对此数据包作了DNAT到10.0.0.46:53,其中10.0.0.46即为kube-dns的pod ip
查找与10.0.0.46匹配的路由,转发数据包到flannel.1
之后的数据包流向就与上面的pod1到pod2的网络一样了
eyebeam(网络电话软件) v1.5 破解版
7.6M
ppstream(网络电视观看平台)v1.0 绿色版
1.29MB
wifi共享软件(网络共享工具) v7.8.8.9 免费版
6MB
三好网络电视下载
18.7MB
腾讯网游加速器(网络游戏加速软件) 3.0.8861.134 免费版
36.1M
长角牛网络监控机(局域网管理辅助软件) V3.48 破解版
2.8M
MusicTools下载
4.6M
cisco模拟器
166M
ipcamera下载
3.1M
kiftd下载
178.8M
netxray下载
10MB
protel99下载
81M
scanport下载
146K
sniffer pro下载
40.59 MB
tftpd32下载
0.52MB
微信域名防封检测工具
7.6M
美萍安全卫士下载
387.32KB
2020-02-17
外接音箱或耳机和内置喇叭同时发声
USB接口无法识别设备的解决方法
B305一体机在Windows XP系统下网卡驱动下载及安装过程
CentOS-5 yum安装mysql-5.5/5.1
开机提示invalid partition table的解决方案
Excel横坐标变成数字
如何通过联想电源管理软件调整电源模式
Ubuntu系统安装Nginx web服务器
天禧二的摄像头、手写板,以及电视卡是否有WINXP下的驱动程序?