05.网络

Kubernetes网络

容器网络发展到现在,形成了两大阵营,就是DockerCNMGoogle、CoreOS、Kuberenetes主导的CNI。首先明确一点,CNMCNI并不是网络实现,他们是网络规范和网络体系,从研发的角度他们就是一堆接口,你底层是用Flannel也好、用Calico也好,他们并不关心,CNMCNI关心的是网络管理的问题。

  • CNM(Container Network Model): Docker Libnetwork的优势就是原生,而且和Docker容器生命周期结合紧密;缺点也可以理解为是原生,被Docker绑架。支持CNM的网络模型包括了Docker Swarm overlay, Macvlan & IP networkdrivers, Calico, Contiv, Weave.

  • CNI的优势是兼容其他容器技术(e.g. rkt)及上层编排系统(Kubernetes & Mesos),而且社区活跃势头迅猛,Kubernetes加上CoreOS主推;缺点是非Docker原生。支持CNI的网络模型包括了Kubernetes, Weave, Macvlan, Calico, Flannel, Contiv, Mesos CNI.

网络解决方案

Kubernetes的集群网络插件实现方案有很多种,社区比较常见的有两种FlannelCalico的工作原理。

隧道方案(Overlay Networking)

隧道方案在IaaS层的网络中应用也比较多,大家共识是随着节点规模的增长复杂度会提升,而且出了网络问题跟踪起来比较麻烦,大规模集群情况下这是需要考虑的一个点。

  • Weave:UDP广播,本机建立新的BR,通过PCAP互通
  • Open vSwitch(OVS:基于VxLanGRE协议,但是性能方面损失比较严重
  • Flannel:Flannel主要提供了Overlay的网络方案,UDP模式由于其封包拆包的过程涉及了多次上下文的切换,导致性能很差,逐渐被社区抛弃;VXLAN模式的封包拆包过程均在内核态,性能要比UDP好很多,也是最经常使用的模式;host-gw模式不涉及封包拆包,所以性能相对较高,但要求节点间二层互通。
  • Racher:IPsec

路由方案

路由方案一般是从3层或者2层实现隔离和跨主机容器互通的,出了问题也很容易排查。

  • Calico:Calico主要采用了BGP协议交换路由,没有采用cni0网桥,当二层网络不通的时候,可以采用IPIP模式,但由于涉及到封包拆包的过程,性能相对较弱,与FlannelVXLAN模式相当。Calico支持很细致的ACL控制,对混合云亲和度比较高。
  • Macvlan:从逻辑和Kernel层来看隔离性和性能最优的方案,基于二层隔离,所以需要二层路由器支持,大多数云服务商不支持,所以混合云上比较难以实现。