k8s 网络基础

少于 1 分钟读完

简介

为了保证网络方案的标准化、扩展性和灵活性,k8s 采用了 Container Networking Interface(CNI)规范。CNI 是由 CoreOS 提出的容器网络规范,它使用了插件(Plugin)模型创建容器的网络栈。它要求任何实现机制都必须满足以下需求:

  • 所有pod间均可不经NAT机制直接通信
  • 所有节点均可不经NAT机制而直接与所有容器通信
  • 容器自己使用的IP也是其他容器或节点直接看到的地址,即所有pod对象都位于同一平面网络中,而且可以使用pod自身的地址直接通信

常见网络方案

因为k8s只约定了网络实现规范, 而跨节点的容器网络不通(分配的是内部地址,从全局上看IP地址会重复),所以出现了各种各样的网络解决方案。每一种方案都要解决IP分配、如何路由两个问题。

Flannel

Flannel几乎是最早的跨网络通信解决方案,其他的方案都可以被看做是Fannel的某种改进版。对于IP分配和路由,Flannel的方案如下:

  • IP分配全局唯一保证:设计了一种全局的网络地址分配机制,使用etcd来存储网段和节点之间的关系,然后Flannel配置各个节点上的Docker(或其他容器工具),只在分配到当前节点的网段里选择容器IP地址
  • 路由问题,支持两种方案:
    • Overlay网络:所有被发送到网络中的数据包会被添加上额外的包头封装
      • UDP:封包使用了Flannel自定义的一种包头协议,数据是在Linux的用户态进行封包和解包的(数据进入主机后,需要经历两次内核态到用户态的转换)
      • VxLAN:封包采用的是内置在Linux内核里的标准协议,因此虽然它的封包结构比UDP模式复杂,但由于所有数据装、解包过程均在内核中完成,实际的传输速度要比UDP模式快许多
    • Host-Gateway 模式:通过在各个节点上的Agent进程,将容器网络的路由信息刷到主机的路由表上。有引入像Overlay中的额外装包解包操作,完全是普通的网络路由机制,它的效率与虚拟机直接的通信相差无几。然而Flannel只能够修改各个主机的路由表,一旦主机直接隔了个其他路由设备,比如三层路由器,这个包就会在路由设备上被丢掉,因此Host-Gateway的模式就只能用于二层直接可达的网络,由于广播风暴的问题,这种网络通常是比较小规模的

其他方案

  • Weave:工作模式与Flannel是很相似的,它最早只提供了UDP(称为sleeve模式)的网络方式,后来又加上了fastpass方式(基于VxLAN),不过Weave消除了Flannel中用来存储网络地址的额外组件,自己集成了高可用的数据存储功能
  • Calico:Flannel的Host-Gateway模式之所以不能跨二层网络,是因为它只能修改主机的路由,Calico把改路由表的做法换成了标准的BGP路由协议。相当于在每个节点上模拟出一个额外的路由器,由于采用的是标准协议,Calico模拟路由器的路由表信息就可以被传播到网络的其他路由设备中,这样就实现了在三层网络上的高速跨节点网络。不过在现实中的网络并不总是支持BGP路由的,因此Calico也设计了一种IPIP模式,使用Overlay的方式来传输数据。IPIP的包头非常小,而且也是内置在内核中的,因此它的速度理论上比VxLAN快一点点,但安全性更差
  • Cannal:将Calico和Flannel做了一下组合,同时支持两者的特性
  • Romana:只支持与Flannel相同的Host-Gateway模式,但它在网络策略方面做了比较多的增强,通过额外引入的租户概念简化了网络策略所需的IPtables规则数量

名称解释

  • CNI: Container Network Interface,由CNCF(Cloud Native Computing Foundation)维护的项目,其由一系列的用于编写配置容器网络插件的规范和库接口组成,支持众多插件项目
  • CNM: Container Network Model(即Libnetwork)
  • NAT: Network Address Translation,地址转换协议,通常将私有 IP 地址是指内部网络或主机的IP 地址转换成公网IP地址
  • BGP: Border Gateway Protocol,边界网关协议, 主干网自治网络的路由协议,今天有了互联网,互联网由很多小的自治网络构成的,自治网络之间的三层路由是由BGP实现的
  • Overlay:在现有二层或三层网络之上再构建起来一个独立的网络,这个网络通常会有自己独立的IP地址空间、交换或者路由的实现

更新时间: