K8s-Kubernetes 网络
Flannel 通过Overlay技术(数据包再封装)发送数据包到达目标容器。Calico 使用直接路由的模式传递数据包。
Kubernetes 网络
本章节讲述Docker原生网络问题,通过Kubernetes怎样解决这些网络问题, 并且在Kubernetes中能够加载哪些网络组件,每个类型的网络组件的优劣势,最后总结应用服务的访问流程。
Docker 原生网络模型
原生网络模型中所有主机节点上的容器都会连接到主机内部的Docker0 (Linux Bridge),主机的IP它默认会分配172.17.0.0/16网段中的某一个IP,因为有了Docker0,所以在一个单一主机上的所有容器可以实现内部互联互通。
但是因为IP分配的范围是基于单一主机的,所以你会发现在其他主机上,也会出现完全相同的IP地址。很明显,这两个IP地址肯定没办法直接通信。所以为了解决这个问题,可以使用iptables 的DNAT功能,设置端口映射。但是也存在弊端, 同一主机上不能启动两个相同的
应用端口。
总结原生网络问题:
- 默认情况下,只能实现单一主机内部容器的通信。
- 在不同的节点主机容器通信时, 需要进行DNAT端口映射,在应用较多的情况下,非常繁琐, 也非常容器出错。
- 不同主机节点默认分配给Docker0 的网段有可能存在重复的情况。所以只能用DNAT 的方式。
Kubernetes 网络组件
正是因为原生网络存在多个节点之间容器互通的问题,那么Kubernetes 通过引入第三方的网络组件的方法,来解决这一问题。
常见的网络组件有:Flannel、Calico、Open Vswitch, 本内容会重点讲解前面两种网络组件,并且解释数据包的封装过程。
Flannel 网络
Flannel实现的功能有两点。
- 协助Kubernetes给每一个Node上的Docker0分配互相不冲突的IP地址段。
- 能在每个Node节点容器IP地址段之间建立一个覆盖网络(Overlay Network:
将TCP数据包装在另一种网络包里面进行路由转发和通信),通过这个覆盖网络,将数据包原封不动地传递到不同Node节点的目标容器内。
Flannel 数据包封装过程
- 源容器172.17.18.9向目标容器172.17.19.9发送数据,数据通过Veth
Pair到达Docker0网桥172.17.18.1。(可以在容器内通过查看路由表查看到网关为Docker0) - Docker0网桥接收到数据包后,根据系统路由表信息,将数据包转发给flannel.1虚拟网卡。
- Flannel.1 接收到数据包以后,对数据进行二层以太网数据包封装,
1) Ethernet Header的信息(Flannel节点MAC):
2) From: { fa:16:3e:f0:2c:11 }
3) To: { fa:16:3e:f0:2c:43 } - 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 数据包解封装过程
- 目标容器宿主机的em1接收到数据后,对数据包进行拆封,并转发给Flannel.1虚拟网卡;
- Flannel.1 虚拟网卡接受到数据,将数据发送给Docker0网桥;
- 最后,数据包通过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容器(172.17.18.9)发送数据包到节点2(172.17.19.9), 数据包会通过veth pair
到达宿主机的cali网卡上。 - 系统在接收到数据包以后, 根据容器要访问的IP所在的子网CIDR和通过查找主机上的路由规则,找到下一跳要到达的宿主机IP 地址。
- 数据包到达下一跳的宿主机后,查找当前宿主机的路由表信息,直接转发数据veth pair 的网卡,最后数据包转发到容器中。
总结
Flannel 通过Overlay技术(数据包再封装)发送数据包到达目标容器。
Calico 使用直接路由的模式传递数据包。
更多推荐
所有评论(0)