相关概念
Kubernetes
Kubernetes是Google开源的容器编排引擎,支持自动化部署、大规模可伸缩、应用容器化管理。Kubernetes将网络场景划分为四种类型的通信:同一Pod内的容器间通信、各Pod彼此之间的通信、Pod与Service间的通信以及集群外部流量与Service间的通信。
Pod和Service资源对象分别使用了各自的专有网络,Pod网络由Kubernetes的网络插件配置实现(即CNI模型实现),Service网络由Kubernetes集群予以指定。整体的网络模型借助于外部插件实现,因此在部署Kubernetes集群时需要事先规划所采取的网络模型及网络部署规划。
容器网络模型(CNM)
容器网络模型(CNM)是由Docker官方提出的规范建议,被Libnetwork项目所采纳为网络模型规范,一些常见的开源网络组件(例如Kuryr,Open Virtual Network,Calico和Weave等)均存在以Libnetwork方式集成采用容器网络模型规范提供容器网络互连。
如图1所示,容器网络模型的规范实现Libnetwork提供了Docker守护进程和网络驱动程序之间的接口。网络控制器负责将驱动程序与网络进行配对,每个驱动程序负责管理其拥有的网络,包括提供给该网络的各种服务,例如IP地址管理(IPAM)。容器网络模型的驱动程序可以为原生驱动(内置的Libnetwork或者Docker支持的网络类型),也可以是第三方插件驱动。原生驱动包含了None、Bridge、Overlay和MACvlan,第三方驱动可以带来更多功能。此外,容器网络模型驱动程序的作用域也被定义为可以本地作用域(单机模式)也可以全局作用域(多主机模式)。
如图2所示,容器在互联时通过一系列的网络端点进行连接。网络接口典型形式以veth pair端口对的方式存在,端口对一端放置在容器的网络沙箱中,另一端放置在指定的网络中。一个网络端点只加入一个网络平面,多个网络端点可以在一个容器的网络沙箱中存在。
容器网络接口(CNI)
容器网络接口(CNI)是由CoreOS提出的规范建议,被Apache Mesos,Cloud Foundry,Kubernetes,Kurma和rkt采纳为网络模型规范,一些常见的开源网络组件(例如Contiv Networking,Calico和Weave等)均存在采用容器网络接口规范提供容器网络互连。
如图3所示,容器网络接口以一种最简化标准实现,使得网络开发工程师能以简单的方式达成容器运行时和网络插件之间的协议通信。
多个网络插件可以同时运行在一个容器内,使得容器连接不同插件驱动的不同平面网络,网络以JSON格式在配置文件中描述,并在调用CNI插件的时候实例化为新的命名空间。
Open vSwitch
Open vSwitch(下文简称OVS)是一个Apache2.0开源协议的多层软件交换机软件,目标是实现一个生产环境质量的交换平台,支持标准管理接口和前向函数接口支持可编程插件和管理控制。Open Virtual Network(下文简称OVN)是由OVS提供的原生虚拟化网络方案,基于OVS的现有功能实现集群管理上大规模高质量实施的体系结构。