弹性网卡(Elastic Network Interface)是一种虚拟网卡,可以挂载到已有的虚拟机上。使用弹性网卡可以实现虚拟机迁移IP地址不变(IP地址与弹性网卡绑定,弹性网卡可以在虚拟机之间迁移)、传统数据中心的多网络平面隔离功能。
弹性网卡与云上的VPC网络结合,还提供更多的管控功能,每个弹性网卡可以配置独立的防火墙(安全组)。
容器网络的痛点问题
容器是一种轻量的虚拟化技术,利用Linux的LXC技术,使用cgroup隔离cpu与内存资源,使用chroot机制隔离rootfs,使用namespace隔离用户、网络、pid等资源。
这其中最复杂的是网络的隔离与互通。
容器网络在虚拟网络上再做了一层虚拟化,必然会引入损耗;同时容器轻量化带来的实例数量比虚拟机多出几个数量级(站在网络虚拟化角度,一个容器实例相当于一台虚拟机),容器实例的特点又是持续频繁的删除与创建,这种场景下对网络虚拟化带来的巨大的冲击:ARP缓存撑爆、路由表过大导致性能下降、多层虚拟化导致链路变长性能损耗、定位问题困难等等各种问题。
总结当前容器网络的问题为:
- 管理规模难以线性扩容(Scale)
- 转发性能损耗(Performance)
- 管理复杂度高(Complexity)
当前典型的容器网络方案
Overlay
一般通过VXLAN协议实现,使用TAP/TUN设备实现封包/解包。
Overlay网络对底层网络约束较少,通用性较好,但是封包/解包会存在较大性能损耗(约30%吞吐量损耗)。 Overlay网络性能损耗较高,管理复杂度较高,管理规模线性扩容能力较好。
Underlay
一般使用MACVLAN或IPVLAN方式实现。
MACVLAN会给每个容器实例分配一个MAC地址,会导致MAC地址极速增长,导致ARP缓存满。同时容器实例频繁创建与销毁会导致ARP缓存刷新频繁刷新。 MACVLAN模式性能较高,管理规模线性扩容能力一般,管理复杂度一般。
IPVLAN使用路由方式与外部通信,每台HOST机器作为一个路由器,外部应用访问容器内应用,需要配置好路由,容器节点增删也需要更新网络中的路由表。 IPVLAN模式性能较高,管理规模线性扩容能力较高,管理复杂度一般。
ENI实现容器网络与VPC网络直通
目前一些云厂家推出了弹性网卡与容器结合的方案,将弹性网卡分配给容器POD使用,弹性网卡可以在VPC内获得一个VPC IP,使得容器网络与虚拟机网络融为一体,免去了容器网络这一层虚拟化。 这种模式下性能较高,管理复杂度也比较简单,麻烦点是弹性网卡本身的性能,容器POD频繁创建与删除,弹性网卡管理能否跟的上?同时弹性网卡的数量一般会受限,要真正规模生产使用还有一定距离。
各公有云厂商对Docker+ENI的支持
- 阿里云:为容器(Pod)分配弹性网卡(ENI)
- 腾讯云:虚拟机支持ENI,容器暂不支持
- 华为云:暂不支持
- AWS: 容器网络支持ENI
- 谷歌云:暂不支持
- AZure: 暂不支持
Reference
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP