CNi:
什么是CNI?
CNI是Container Network Interface的缩写,是一个标准的通用的接口。为了让用户在容器创建或销毁时都能够更容易地配置容器网络,现在容器平台:docker,kubernetes,mesos。
CNI如何实现?
CNI用于连接容器管理系统和网络插件。提供一个容器所在的network namespace,将network interface插入该network namespace中(比如veth的一端),并且在宿主机做一些必要的配置(例如将veth的另一端加入bridge中),最后对namespace中的interface进行IP和路由的配置。CNI插件是可执行文件,会被kubelet调用。启动kubelet --network-plugin=cni,--cni-conf-dir 指定networkconfig配置,默认路径是:/etc/cni/net.d,并且,--cni-bin-dir 指定plugin可执行文件路径,默认路径是:/opt/cni/bin
网络解决方案:
容器网络解决方案:flannel、calico、weave、Canal、Terway、以及 Contiv。
Flannel:
在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。
Flannel的功能简单的来讲就是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。 Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。Flannel实质上是一种覆盖网络(overlay network),也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,常用的的三种转发模式。
- hostgw 这种方式就是直接路由 (性能最高 要求集群节点在同一个网段)
- vxlan 是flannel推荐的方式。需要通信的网络设备能够支持vxlan协议 (性能较好)
-
udp 该方式与vxlan很类似,它对ip层网络进行包装。通常用于调试环境或者不支持vxlan协议网络环境中。(性能最差)
优点: 1.Flannel相对容易安装和配置。 2.支持多个Kubernetes发行版。 3.使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。 4.Flannel可以使用Kubernetes集群的现有etcd集群来使用API存储其状态信息,因此不需要专用的数据存储。 5.默认路由使用的方法是使用VXLAN,因为VXLAN性能更良好并且需要的手动干预更少。 缺点: 1.不支持pod之间的网络隔离。Flannel设计思想是将所有的pod都放在一个大的二层网络中,所以pod之间没有隔离策略。 2.由于使用二层技术,vlan 隔离和 tunnel 隧道则消耗更多的资源并对物理环境有要求,随着网络规模的增大,整体会变得越加复杂在较大的k8s集群规模下不适用。
Calico:
calico是基于BGP路由实现的容器集群网络方案,Calico是一个纯三层的协议,使用虚拟路由代替虚拟交换。与 Flannel 不同的是 Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把所有二三层流量转换成三层流量,并通过 host 上路由配置完成跨 Host 转发。基础的calico使用体验可能和flannel host-gw是基本一样的。Calico在每个计算节点都利用Linux Kernel实现了一个高效的虚拟路由器vRouter来负责数据转发。每个vRouter都通过BGP1协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网时可以直接利用网络结构,不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。支持两种网络IPIP、BGP优点:
1.二层网络通讯需要依赖广播消息机制,广播消息的开销与 host 的数量呈指数级增长,Calico 使用的三层路由方法,完全抑制了二层广播,减少了资源开销。 2.不同之处在于flannel方案下路由都是通过代码逻辑进行配置。calico会在每个节点建立bgp peer,bgp peer彼此之间会进行路由的共享和学习,所以自动生成并维护了路由。在k8s集群大规模的情况下集群间的网络保持通畅。 3.Calico 较少的依赖性使它能适配所有 VM、Container、混合环境场景。 4.支持network-policy,自定义ingress(进栈)egress(出栈)规则。
缺点:
1.通过路由规则可以看出,路由规模和 pod 分布有关,如果 pod离散分布在 host 集群中,会产生较多的路由项。 2.1台 Host 上可能虚拟化十几或几十个容器实例,过多的 iptables 规则造成复杂性和不可调试性,同时也存在性能损耗。 3.网关路由问题,当对端网络不为二层可达时,需要通过三层路由机时,需要网关支持自定义路由配置,即 pod 的目的地址为本网段的网关地址,再由网关进行跨三层转发。 4.简单使用和flannel无异,深层的使用需要有较高的学习成本。
Weave:
和flannel一样它能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上。与Calico一样,Weave也为Kubernetes集群提供网络策略功能。优点: 1.Weave通过创建虚拟网络使Docker容器能够跨主机通信并能够自动相互发现。 2.通过weave网络,由多个容器构成的基于微服务架构的应用可以运行在任何地方主机,多主机,云上或者数据中心。应用程序使用网络就好像容器是插在同一个网络交换机上一样,不需要配置端口映射,连接等。 3.Weave网络自动在两个节点之间选择最快的路径,提供接近本地网络的吞吐量和延迟。同时支持主机间通信加密。 4.Weave网络能够在节点间转发流量,它甚至能够在网状网络部分连接的情况下工作。这意味着你可以在混合了传统系统和容器化的应用的环境中使用Weave网络来保持通信。 缺点: 1.只能通过weave launch或者weave connect加入weave网络。
Canal:
Canal 是一个项目的名称,它试图将Flannel提供的网络层与Calico的网络策略功能集成在一起。Canal名称的由来是Flannel和Calico的结合,最终只实现了将两种技术部署在一起的预期能力。出于这个原因,即使这个项目不复存在,业界还是会习惯性地将Flannel和Calico的组成称为“Canal”。由于Canal是Flannel和Calico的组合,因此它的优点也在于这两种技术的交叉。网络层用的是Flannel提供的简单overlay,可以在许多不同的部署环境中运行且无需额外的配置。在网络策略方面,Calico强大的网络规则评估,为基础网络提供了更多补充,从而提供了更多的安全性和控制。优点:集成Flannel和Calico和功能。 缺点:部署相对比较复杂,维护和配置有较高的学习成本。
Terway:
Terway是阿里云容器服务Kubernetes版自研的网络插件,使用原生的弹性网卡分配给Pod实现Pod网络。将阿里云的弹性网卡和辅助IP分配给容器,支持Network Policy来定义容器间的访问策略,支持对单个容器做带宽的限流,兼容Calico的Network Policy。在Terway网络插件中,每个Pod拥有自己网络栈和IP地址。同一台ECS内的Pod之间通信,直接通过机器内部的转发,跨ECS的Pod通信,报文通过VPC的弹性网卡直接转发。由于不需要使用VxLAN等的隧道技术封装报文,因此具有较高的通信性能。优点:相比Flannel支持了Network Policy访问策略,支持对单个容器做带宽对限流。
缺点:依赖与阿里云服务器平台。
Contiv:
Contiv是一个用于跨虚拟机、裸机、公有云或私有云的异构容器部署的开源容器网络架构。Contiv具有2层、3层、overlay和ACI模式,能够与思科基础设施进行本地集成,并使用丰富的网络和安全策略将应用意图与基础设施功能进行映射。能够和非容器环境协作,不依赖物理网络。支持物理网卡sriov和offload。支持Policy/ACI/Qos租户。优点: 1.集成Flannel和Calico所有的功能。 2.能够与思科基础设施完美的集成。 3.支持物理网卡sriov和offload。支持Policy/ACI/Qos租户 缺点: 1.集成配置比较复杂,学习资料少。 2.学习成本较高,需要定制化开发。