[toc]
容器间网络#
此章节主要介绍容器之间的网络究竟是如何模拟和通信的
1 linux网络虚拟化#
1.1 网络协议栈#
网络设备->driver->Device->IP->TCP/UDP->Socket->File->接收端
反过来同理
1.2 linux干预网络通信的方式#
linux中有一个netfilter框架, 可以在网络的五个阶段埋入钩子进行函数回调
- PREROUTING: 数据包进入协议栈码上触发
- INPUT:经过IP路由后,如果确定是发往本机的,将会触发钩子
- FORWARD: 不是发往本机的,只是中间路由,触发钩子
- OUTPUT:发出时经过路由前触发
- POSTTROUGIN: 发出时触发,用于NAT
对netfilter应用的一个经典命令是iptalbes命令,里面内置的五个iptables规则表和filter钩子存在对应关系。
k8s的kube-proxy也是依赖iptables完成从clusterIp到Pod的通信。
1.3 虚拟网络设备#
1.虚拟网卡:tun/tap、veth#
tun可以模拟网络层设备操作ip数据包
tap可以模拟一位网设备操作链路层数据包
具体原理是 在网络协议栈 和 下一层物理网卡之间, 嵌入了tun或者tap,他们可以把数据转发给对接的应用程序,处理完成后再重新放进协议栈流动
vpn就是这样处理的。
缺点是要经过2次网络协议栈, 因此另一种网卡实现方案是veth。
veth是一对设备也叫veth pair, 假设有2个网络命名空间, 有2个协议栈,则各自空间中都有一个vethx, 可以让数据从设备的另一端原样不动的流出, 可以模拟网卡直连从解决容器间的通信问题
缺点:veth pair的转发是要写死目的地址的, 如果有多个容器间要交互就需要很多pair,因此需要后面的虚拟交换机
2. 虚拟交换机linux Bridge#
容器自身的veth虚拟网卡迟早得接入到物理网卡, 1台宿主机上有多个容器但物理网卡有限,物理网卡怎么知道对应关系呢?
这时候就可以用linux bridge,当有二层数据包(链路层以太帧)从网卡进入linuxBridge时,将根据数据包的类型和目标MAC地址, 选择广播或者单播或者发给自身。
可以理解为在物理网卡和容器虚拟网卡之间,加了一层下图所示的br0进行地址切换或者映射转发。
3. 虚拟网络VXLAN#
很早就有虚拟局域网VLAN, 可以进行同一个物理区域范围内的广播域划分,通过在以太帧里加入VLAN tag。
但是VLAN的缺陷在于tag设置的位数太小,导致不够用。
于是后来EFTF定义了VXLA能规范, 做了报文封装支持扩展, 需要有VTEP设置对VXLAN协议做封包和解包。
通过VXLAN可以实现 容器间网络的虚拟划分。
4. 副本网卡MACLAN#
如果希望在同一个物理网卡上, 针对不同的VLAN绑定不同的IP地址, 可以使用子接口, 而MACVLAN就是借用了VLAN子接口的思路, 支持为同一个网卡设置多个IP地址以及多个MAC地址。
用MACLAN虚拟出来的副本网卡,和真实网卡在功能上基本对等
真实网卡收到数据报,根据目标MAC地址判断包应该转发给哪块副本网卡处理, 副本网卡处于同一个VLAN中可以直接在链路层通信无需转发给外部网络由路由跳转。,
1.4 容器间通信#
docker有三种网络模式:
- 桥接模式(–network=bridge):为容器分配独立的名称空间,加入网桥的容器可以直接依靠链路层层网络通信
- 主机模式(–network=host):直接使用宿主机上的网络设置和名称空间,性能高但是容易端口号冲突,没有网络隔离
- 空置模式(–network=none):只能看到一个换回地址,无网络设备
还支持自行创建的网络模式 - 容器模式(–network=container:容器名称)
新创建的容器会加入指定的容器网络名称空间,只共享网络资源 - MACVLAN模式(docker network create -d macvlan)
为容器创建副本网卡, 通过副本网卡的MAC地址来使用宿主机上的物理设备,性能很好 - Overlay模式(docker network create -d overlay)
就是VXLAN,很少使用。
2 容器网络生态#
这里主要讲了 docker定义的CNM(container network model) 和 k8s定义的CNI(container network interface)的历史, 两个容器网络模型最终是CNI胜出,CNI支持多种网络插件可以介入不同的网络。
CNI有以下三种经典跨主机网络模式,各有一些代表CNI插件
- overlay模式
虚拟化的上层逻辑网络
Flannel 、 Calico、weave等插件 - 路由模式
跨主机通信由路由来转发 - Underlay模式
让容器和宿主机处于同一个网络,二者拥有相同地位,容器网络能直接与底层网络进行通信。 包含MACVTAP插件。
性能上MACVLAN和SR-IOV这样的underlay网络插件性能最高,但是通用性和灵活性会有折扣