1.kubernetes网络模型
Kubernetes网络的设计主要致力于解决以下问题。
(1)容器到容器之间的直接通信。
(2)抽象的Pod到Pod之间的通信。
(3)Pod到Service之间的通信。
(4)集群外部与内部组件之间的通信。
Kubernetes的Pod网络模型
同一个Node内两个Pod之间的关系
跨Node的Pod通信
2. CNI概述
CNI提供了一种应用容器的插件化网络解决方案,定义对容器网络进行操作和配置的规范,通过插件的形式对CNI接口进行实现。
在CNI模型中只涉及两个概念:容器和网络。
- 容器(Container):是拥有独立Linux网络命名空间的环境,例如使用Docker或rkt创建的容器。关键之处是容器需要拥有自己的Linux网络命名空间,这是加入网络的必要条件。
- 网络(Network):表示可以互连的一组实体,这些实体拥有各自独立、唯一的IP地址,可以是容器、物理机或者其他网络设备(比如路由器)等。
支持CNI网络插件的主流开源项目:Calico、Canal、Flannel、Weave Net等
3. Flannel介绍
链接:https://github.com/coreos/flannel
由CoreOS开发的项目Flannel,特点:
- 它能协助Kubernetes,给每一个Node上的Docker容器都分配互相不冲突的IP地址。
- 它能在这些IP地址之间建立一个覆盖网络(OverlayNetwork),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。
- Flannel之间的底层通信协议的可选技术包括UDP、VxLan、AWS VPC等多种方式。通过源flanneld封包、目标flanneld解包,最终docker0收到的就是原始的数据,对容器应用来说是透明的,感觉不到中间Flannel的存在。
总结:
- 它提供了一个简单的网络模型,用户只需要一些基础知识,就可以设置适合大多数用例的环境。
- Flannel完美地实现了对Kubernetes网络的支持,但是它引入了多个网络组件,在网络通信时需要转到flannel0网络接口,再转到用户态的flanneld程序,到对端后还需要走这个过程的反过程,所以也会引入一些网络的时延损耗。
4. Calico简介
链接:https://github.com/projectcalico/cni-plugin
Calico是一个基于BGP的纯三层的网络方案,特点:
- Calico在每个计算节点都利用Linux Kernel实现了一个高效的vRouter来负责数据转发。每个vRouter都通过BGP1协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。
- Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。
- Calico节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。
总结:
- Calico以其性能、灵活性而闻名。功能更为全面,不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。
- Calico还可以与服务网格Istio集成,以便在服务网格层和网络基础架构层中解释和实施集群内工作负载的策略。