深入解析容器 夸网络通信

2021-06-25  本文已影响0人  simok

flannel框架

提供容器网络功能的,是 Flannel 的后端实现
后端支持三种网络实现
1 UDP
2 vxlan
3 host-gw

一 udp模式

flannel设备

linux 上是一个tunnel设备 工作在三层的虚拟网络设备
功能 就是 操作系统内核 与用户应用程序之间传递 ip包

flannel设备 子网的概念

docker0 网桥的地址范围必须是 Flannel 为宿主机分配的子网
子网与宿主机ip 的关系 保存在etcd当中


$ etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/100.96.1.0-24
/coreos.com/network/subnets/100.96.2.0-24
/coreos.com/network/subnets/100.96.3.0-24



$ etcdctl get /coreos.com/network/subnets/100.96.2.0-24
{"PublicIP":"10.168.0.3"}

场景

宿主机 Node 1 上有一个容器 container-1,它的 IP 地址是 100.96.1.2,对应的 docker0 网桥的地址是:100.96.1.1/24。
宿主机Node2 上有一个容器 container-2 ip 地址是 100.96.2.3对应的 docker0网桥的地址是:100.96.2.1/24。

任务让 container-1 访问 container-2。
container-1 发起ip包 源地址是100.96.1.2 目的地址100.96.2.3
node1发送时期:
在node1上的路由表规则只有flannel设备路由规则可以匹配到这个100.96.2.3
从而进入到flannel设备, flanneld 进程在处理由 flannel0 传入的 IP 包时 根据etcd存储的子网范围 与node ip之间的关系 获取到node2的ip地址 ,因为每台node 都会起一个flannel进程 端口为8285,所以 flanneld只要把udp 包发送给
node2的flannel进程即可.
node2接收时期
node2上flannel进程接收到udp包之后传递ip包给flannel0设备 flannel0根据里面的ip包的源地址 100.96.2.3 根据node2上路由表规则进行匹配 从而进入到docker0. 之后的流程就是容器的通信过成了。

image.png

UDP方式的缺点

1 通信的ip包总是要从flannel0设备 与flannel进程之间传递, 从内核态到用户态

三次切换数据拷贝

第一次,用户态的容器进程发出的 IP 包经过 docker0 网桥进入内核态;
第二次,IP 包根据路由表进入 TUN(flannel0)设备,从而回到用户态的 flanneld 进程;
第三次,flanneld 进行 UDP 封包之后重新进入内核态,将 UDP 包通过宿主机的 eth0 发出去。

二 vxlan模式

vxlan概念

VXLAN virtual extensible lan 虚拟可扩展局域网

目的

在内核态封装完成 udp模式中的对ip包的封装和解封装操作

image.png

场景

node1 container-1 访问 container-2
node2 加入集群之后
1: 会在node1 生成路由规则凡是发往 10.1.16.0/24 网段的 IP 包,都需要经过 flannel.1 设备发出,并且,它最后被发往的网关地址是:10.1.16.0。
2: 找出目的vtep设备mac地址 ,要用到的 ARP 记录也是 flanneld 进程在 Node2节点启动时,自动添加在 Node 1 上的
3: flannel.1“网桥”对应的 FDB 信息,也是 flanneld 进程负责维护的

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
10.1.16.0       10.1.16.0       255.255.255.0   UG    0      0        0 flannel.1
# 在Node 1上
$ ip neigh show dev flannel.1
10.1.16.0 lladdr 5e:f8:4f:00:e3:37 PERMANENT

# 在Node 1上,使用“目的VTEP设备”的MAC地址进行查询
$ bridge fdb show flannel.1 | grep 5e:f8:4f:00:e3:37
5e:f8:4f:00:e3:37 dev flannel.1 dst 10.168.0.3 self permanent

接下来的流程,就是一个正常的、宿主机网络上的封包工作。

上一篇下一篇

猜你喜欢

热点阅读