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的网络一样了
k8s的flannel安装报错Failed to create SubnetManager: error retrieving pod spec解决
02-17
k8s(kubernetes) kube-proxy转发模式及service转发类型介绍
05-19
k8s(kubernetes)部署三个节点的redis cluster
05-24
网络传输协议
06-25
31006599联想网络适配器使用指南 宝龙达8139V1.0.pdf
06-29
CentOS 7配置并更换为本地或网络yum源
07-17
HashMap实现原理学习
06-03
Lenovo G470无法连接无线网络
06-28
Lenovo G485无线网络连接不上的解决方案
06-23
M7655DHF/M7455DNF/M7675DXF如何实现网络PCFAX?
07-09
MySQL InnoDB存储引擎崩溃恢复原理介绍
03-03
Python—网络通信编程之tcp非阻塞通信(socketserver)
07-05
Vista 网络基础概念
07-20
从inotify机制谈FileObserver实现原理
04-28
使用保护卡6.0进行网络同传发现增量同传的选项是灰色的无法使用,如何解决?
06-21
如何开启网卡的网络唤醒功能
07-16
数字证书原理
04-11
杀毒软件的工作原理
07-07
笔记本电脑内置键盘基本原理介绍
05-04
联想天梭LX-AP1500无线网络桥接器(无线网桥)用户手册和应用软件
07-12
MusicTools(网络音乐下载软件) v2.0 免费版
4.6M
下载eyebeam(网络电话软件) v1.5 破解版
7.6M
下载kiftd(网络文件传输系统软) v1.0.28 最新版
178.8M
下载netxray(网络监测软件) 3.03 最新版
10MB
下载ppstream(网络电视观看平台)v1.0 绿色版
1.29MB
下载protel99(电路原理设计图和PCB软件) se 中文版
81M
下载scanport(网络端口扫描工具)v1.0 免费版
146K
下载sniffer pro(网络抓包工具) V4.70 官方版
40.59 MB
下载三好网络电视(视频播放器)v2.4.0.2 官方版
18.7MB
下载腾讯网游加速器(网络游戏加速软件) 3.0.8861.134 免费版
36.1M
下载长角牛网络监控机下载
2.8M
下载cisco模拟器
166M
下载ipcamera下载
3.1M
下载tftpd32下载
0.52MB
下载wifi共享软件下载
6MB
下载微信域名防封检测工具
7.6M
下载美萍安全卫士下载
387.32KB
下载