k8S网络方案

前言

  • 为什么出现了如此多的网络方案?就我理解有以下几个方面原因:
    • 1.CNI标准的诞生。
      在K8S之前Docker容器化时代,采用了CNM(即Libnetwork)的网络标准
      K8s上由于一些网络的设计模式不同采用了CNI标准.由于CNI标准实现简单(一个JSON配置文件和一个可执行的文件),因此各网络方案基于此百花齐放。
    • 2.网络方案存在不足,不断迭代。
      从物理机到虚拟机,从传统机房到云计算
    • 3.网络设备及技术的飞速发展。

Flannel

  • 原理:
    flannel 旨在解决不同host上的容器网络互联问题,每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器间无需 NAT 和 port mapping 就可以跨主机通信。每个 subnet 都是从一个更大的 IP 池中划分的,flannel 会在每个主机上运行一个叫 flanneld 的 agent,其职责就是从池子中分配 subnet。为了在各个主机间共享信息,flannel 用 etcd(如果是k8s集群会直接调用k8s api)存放网络配置、已分配的 subnet、host 的 IP 等信息。节点间的通信有以下多种backen支持。

  • UDP模式
    容器进程 -> docker0 ->内核 用户态到内核态
    内核 -> flannel0 -> flanneld进程 内核态到用户态
    flanneld进程 -> 内核 -> eth0物理机网卡发出 用户态到内核态
    由于UDP模式在内核态和用户态切换次数过多,所以性能比较差。
    两个宿主机之间UDP通信 直接像目标主机发送UDP数据包即可(只要求宿主机之间可以相互访问即可)
    通过flannel维护了一个子网(容器网段)和宿主机IP的对应关系路由规则即可

  • VXLAN模式
    利用内核级别的VXLAN来封装host之间传送的包。

  • Host-gateway模式
    对于性能有要求的推荐配置,但是不支持云环境。通过在host的路由表中直接创建到其他主机 subnet 的路由条目,从而实现容器跨主机通信。要求所有host在二层互联。

Calico

  • Calico架构,如图:
    Calico架构
     Felix: Calico agent,跑在每台需要运行 workload 的节点上,主要负责配置路由及 ACLs 等信息来确保 endpoint 的连通状态;

    etcd: 分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性;

    BGPClient(BIRD): 主要负责把 Felix 写入 kernel 的路由信息分发到当前 Calico 网络,确保 workload 间的通信的有效性;

    BGP Route Reflector: 大规模部署时使用,摒弃所有节点互联的 mesh 模式,通过一个或者多个BGP Route Reflector来完成集中式的路由分发;

  • Calico工作模式:

    • BGP模式
      上文提到Flannel的Host-Gateway模式之所以不能跨二层网络,是因为它只能修改主机的路由,Calico把改路由表的做法换成了标准的BGP路由协议。实现了各节点在三层网络下的通信。关于BGP见附录。
      由于使用路由的方法实现网络通信,不使用Overlay网络,减少了封包解包操作,因此大大提高了传输效率。不对数据包进行额外封装,不需要NAT和端口映射,扩展性和性能都很好。
      Calico网络提供了DockerDNS服务, 容器之间可以通过hostname访问,Calico在每一个计算节点利用LinuxKernel实现了一个高效的vRouter(虚拟路由)来负责数据转发,它会为每个容器分配一个ip,每个节点都是路由,把不同host的容器连接起来,从而实现跨主机间容器通信。而每个vRouter通过BGP协议(边界网关协议)负责把自己节点的路由信息向整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGProute reflector来完成;Calico基于iptables还提供了丰富而灵活的网络策略,保证通过各个节点上的ACLs来提供多租户隔离、安全组以及其他可达性限制等功能。
    • IPIP
      BGP虽然大大提高了数据的传输效率,但在现实环境中,并不是所有网络都支持BGP,仅有BGP模式已不能满足现实需求,因此不得不使用Overlay解决方案。
      Calico提供了IPIP模式的Overlay解决方案:
      用IP包头封装IP报文,在启用IPIP模式时,Calico会在每个节点创建一个名为tunl0的虚拟网络接口 下面节选网络图片说明IPIP数据流向: *图片来源于网络

Weave

  • Weave overlay模式
    1)容器流量通过veth pair到达宿主机上weave router网桥上。

    2)weave router在混杂模式下使用pcap在网桥上截获网络数据包,并排除由内核直接通过网桥转发的数据流量,例如本子网内部、本地容器之间的数据以及宿主机和本地容
    器之间的流量。捕获的包通过UDP转发到所其他主机的weave router端。

    3)在接收端,weave router通过pcap将包注入到网桥上的接口,通过网桥的上的veth pair,将流量分发到容器的网卡上。

    • Weave fast Datapath模式

几种网络方案对比:

  • Flannel

    优点
    Flannel相对容易安装和配置,Flannel可以使用Kubernetes集群的现有etcd集群来使用API存储其状态信息,Flannel有几种不同类型的后端可用于封装和路由。默认和推荐的方法是使用VXLAN,因为VXLAN性能更良好并且需要的手动干预更少。Host-GW模式速度最快。
    缺点
    不支持网络策略,安全加密等

  • Calico

    优点

    支持网络策略,支持夸容器漂移,跨路由网络(BGP),Calico还可以与服务网格Istio集成,提供隔离机制。
    缺点:
    当用户网络节点足够大时,Calico会在节点设置大量iptables规则和路由规则,此外BGP自我学习和发现拓扑的收敛过程会非常耗费资源和时间。
    需要支持BGP协议。

  • Weave
    优点
    功能齐全:有网络通信,网络策略,安全策略,域名服务,加密通信和监控,无需集中式存储系统,采用Gossip进行数据同步。支持容器的动态计入和移除,支持跨主机多子网通信。提供商业化服务。
    缺点
    Weave overlay模式通过pcap捕获包的方式完成封包和解包的过程,需要将数据从内核态复制到用户态,按照自定义格式完成封装和解封装,性能不高。
    Weave fast Datapath模式中odp和vxlan与内核结合较为紧密,需要内核支持。
    网络隔离只是子网级网络隔离。

这里引用一张网络上的性能比较图片,虽然测试不严谨,但也能看出其性能上的区别:

附录

  • BGP
    边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP,BGP 机房的优点:服务器只需要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来确定的,不会占用服务器的任何系统。
  • 参考文章:

发表评论

邮箱地址不会被公开。

Captcha Code