我们知道在单个节点上的的容器之间通信是通过内部的容器网络进行通信,比如docker通过docker0网桥连接各容器子网,k8s作为一种分布式容器编排框架,那容器之间是怎么完成通信的呢?

k8s 是一个分布式的容器编排框架,k8s 本身没有对容器之间的通信网络进行实现,而是通过 CNI 定义了容器网络的接口的形式,让其他组件实现CNI来实现容器间的网络通信,那么CNI主要解决什么问题呢?

  • 第一,如何保证每个Pod拥有一个集群内唯一的IP地址?
  • 第二,如何保证不同节点的IP地址划分不会重复?
  • 第三,如何保证跨节点的Pod可以互相通信?
  • 第四,如何保证不同节点的Pod可以与跨节点的主机互相通信?
f02595cc5691bea059aca538e7acf968.png

针对这四点介绍下市面上最流行的两款CNI插件 Flannel 和 Calico 的区别。

Flannel

Flannel实质上是一种overlay network(覆盖网络),也就是将TCP数据包装在另一种网络包里面进行路由转发和通信。Flannel将已有的网络作为基础,在其上建立叠加的逻辑网络,从而实现网络资源的虚拟化。由于有一定额外的封包和解包等网络开销,对网络通信的性能有一定损耗。

看看 Flannel 的架构形式:

948650448a6e4a27572f134a39be2b6c.png

flanneld 对 docker0 数据包进行分包和解包,并通过 routing table 层做封装转发。

Calico

Calico 是一种基于BPG 协议和 Linux kernel 实现路由转发机制,是一种典型的三层软件定义网络(SDN)。Calico 可以通过BGP client 让容器网络进行直接互联,架构图如下:

34e004c9fa9aa4755bb2392b50900883.png

由于基于iptables,Calico还提供了丰富而灵活的网络Policy,保证通过各个节点上的ACL来提供多租户隔离、安全组以及其他可达性限制等功能。Felix 负责配置路由、配置ACLs、报告状态,BGP client:负责将Felix配置的路由信息分发到其他节点。

一句话总结两者的区别:Flannel 就是在容器现有的网络之上通过封包解包做了一层虚拟化,Calico 自己创建了一个三层网络管理和控制容器的访问, 采用了BPG 协议和kernel实现路由转发机制。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐