上回说到,虽然虚拟化技术大大提升了计算机硬件资源的利用率,也让业务部署变得更加灵活,但由于虚拟化技术的部分限制,在虚拟机上运行RDMA等ICT关键业务加速特性几乎成了不可能的,或者要付出极大的代价。
我们前面提到,这是虚拟化底层机制造成的,虚拟机除CPU和RAM外,几乎其他所有硬件设备都是虚拟化平台(VMM)提供的虚拟设备。虚拟设备的软件实现,与现代高性能计算与大规模分布式存储所需要的硬件能力加速的矛盾,已经束缚了虚拟化环境下生产力的发展。
马克思指出,当生产关系束缚生产力的发展时,意味着革命即将爆发。
新一代计算资源调度的革命性创新就是我们这个专题的主角——容器技术。
容器技术是利用Linux的namespace机制实现的。它以镜像的形式存在,而运行时的容器,除打包的配合应用程序所必须的组件外,其他均直接调用操作系统的运行时组件、驱动程序等实现。
这样一来,由于各个硬件厂商可以为容器编排平台提供自己的驱动或插件,容器可以自行访问所需要的硬件,如存储设备、GPU、RDMA网卡等。
容器本身的运行机制,市面上的书籍早已汗牛充栋,在此暂且略过。
我们知道,容器技术的一个重要特点就是,几乎所有的容器存在的意义,最终都要落实到为向外部网络上的主机或其他终端提供服务。(请自行仔细品味这句话的含义)
因此,如果容器无法通过网络与外部通信,它将一钱不值。
可以说,容器网络技术,是容器技术的精华所在,是最难理解的部分,学懂容器网络,就是摘取了ICT前沿技术皇冠上的明珠!
毛主席在《实践论》中指出:“你要知道原子的组成和性质,你就得实行物理学和化学的实验,变革原子的情况。”
同样地,如果想理解容器网络的组成和性质,我们就需要从实例开始学习。
因此,让我们从实例分析开始,来洞察容器技术中的精华。
我们在一台宿主机上(为方便,实际使用ubuntu虚拟机),利用docker运行一个ubuntu实例:
在容器内部可以通过ping测试网络:
那么,这个docker实例是如何与外部通信的呢?
我们在docker中的ubuntu实例上用ifconfig命令看一看:
它拥有一个网卡 eth0,IP地址为172.17.0.2/24。
通往外界的缺省路由下一跳为172.17.0.1:
这个172.17.0.1是谁呢?
我们回到运行ubuntu docker的宿主机:
可以看出,宿主机上的网卡docker0实际上是通往容器网络的网卡,172.17.0.1是它的IP。
我们再如法炮制,在宿主机上再运行一个nginx容器镜像,并获取到IP地址172.17.0.3。它和ubuntu容器镜像可以互相ping通,同样地,也可以和外部172.17.0.1互相通信。
我们发现,在宿主机上,docker0实际上承担了虚拟交换机的功能:
当然,我们知道,只有交换机,是无法实现与外部网络通信的。
这个动作的背后,发生了什么呢?
马克思在《黑格尔法哲学批判导言》中曾经指出,批判的武器不能代替武器的批判。
在Linux/GNU下,网络界最强大的武器当然是tcpdump。
在下一节中,我们用tcpdump对docker原生容器网络实施武器的批判,分析它的实现,来解剖这只麻雀。
敬请期待。