在这里插入图片描述

Kubernetes 网络

本章节讲述Docker原生网络问题,通过Kubernetes怎样解决这些网络问题, 并且在Kubernetes中能够加载哪些网络组件,每个类型的网络组件的优劣势,最后总结应用服务的访问流程。

Docker 原生网络模型

原生网络模型中所有主机节点上的容器都会连接到主机内部的Docker0 (Linux Bridge),主机的IP它默认会分配172.17.0.0/16网段中的某一个IP,因为有了Docker0,所以在一个单一主机上的所有容器可以实现内部互联互通。
但是因为IP分配的范围是基于单一主机的,所以你会发现在其他主机上,也会出现完全相同的IP地址。很明显,这两个IP地址肯定没办法直接通信。所以为了解决这个问题,可以使用iptables 的DNAT功能,设置端口映射。但是也存在弊端, 同一主机上不能启动两个相同的
应用端口。

总结原生网络问题:

  1. 默认情况下,只能实现单一主机内部容器的通信。
  2. 在不同的节点主机容器通信时, 需要进行DNAT端口映射,在应用较多的情况下,非常繁琐, 也非常容器出错。
  3. 不同主机节点默认分配给Docker0 的网段有可能存在重复的情况。所以只能用DNAT 的方式。

Kubernetes 网络组件

正是因为原生网络存在多个节点之间容器互通的问题,那么Kubernetes 通过引入第三方的网络组件的方法,来解决这一问题。

常见的网络组件有:Flannel、Calico、Open Vswitch, 本内容会重点讲解前面两种网络组件,并且解释数据包的封装过程。

Flannel 网络

Flannel实现的功能有两点。

  1. 协助Kubernetes给每一个Node上的Docker0分配互相不冲突的IP地址段。
  2. 能在每个Node节点容器IP地址段之间建立一个覆盖网络(Overlay Network:
    将TCP数据包装在另一种网络包里面进行路由转发和通信),通过这个覆盖网络,将数据包原封不动地传递到不同Node节点的目标容器内。

Flannel 数据包封装过程

  1. 源容器172.17.18.9向目标容器172.17.19.9发送数据,数据通过Veth
    Pair到达Docker0网桥172.17.18.1。(可以在容器内通过查看路由表查看到网关为Docker0)
  2. Docker0网桥接收到数据包后,根据系统路由表信息,将数据包转发给flannel.1虚拟网卡。
  3. Flannel.1 接收到数据包以后,对数据进行二层以太网数据包封装,
    1) Ethernet Header的信息(Flannel节点MAC):
    2) From: { fa:16:3e:f0:2c:11 }
    3) To: { fa:16:3e:f0:2c:43 }
  4. Flannel.1 封装第一层MAC数据包以后,系统内核还会进行第二层的(MAC、IP)数据包封装,
    最后转发数据包到目标容器Node2的em1。
    再次封装包的格式如下:
    1) Ethernet Header的信息(Node):
    2) From: { fa:16:3e:f0:2c:c6}
    3) To: { f1:16:3e:10:11:19}
    IP Header的信息:
    1) From: {192.168.91.134}
    2) To: {192.168.91.135}
Flannel 数据包解封装过程
  1. 目标容器宿主机的em1接收到数据后,对数据包进行拆封,并转发给Flannel.1虚拟网卡;
  2. Flannel.1 虚拟网卡接受到数据,将数据发送给Docker0网桥;
  3. 最后,数据包通过veth pair到达目标容器,完成容器之间的数据通信。

Calico

Calico 与其他虚拟网络最大的不同是,它没有采用Overlay 网络做报文的转发,提供了纯 3 层的网络模型。三层通信模型表示每个容器都通过 IP 直接通信,中间通过路由转发找到对方。在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。要想路由工作能够正常,每个虚拟路由器(容器所在的主机节点)通过BGP(Border Gateway Protocol) 路由协议知道整个集群的路由信息。
数据包三层转发基础?
Calico在每个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发。每个vRouter通过BGP协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络通信效率。
Calico一端作为容器网卡加入到容器的网络命名空间,并设置IP和掩码; 另一端直接暴露在宿主机上。

Calico数据包分装过程

  1. 从节点1容器(172.17.18.9)发送数据包到节点2(172.17.19.9), 数据包会通过veth pair
    到达宿主机的cali网卡上。
  2. 系统在接收到数据包以后, 根据容器要访问的IP所在的子网CIDR和通过查找主机上的路由规则,找到下一跳要到达的宿主机IP 地址。
  3. 数据包到达下一跳的宿主机后,查找当前宿主机的路由表信息,直接转发数据veth pair 的网卡,最后数据包转发到容器中。

总结

Flannel 通过Overlay技术(数据包再封装)发送数据包到达目标容器。
Calico 使用直接路由的模式传递数据包。

Logo

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

更多推荐