第十课:kubernetes网络
概述
Docker原生网络问题
通过kubernetes怎样解决这些网络问题
在kubernetes中能够加载哪些网络组件
每个类型的网络组件的优劣势
应用服务的访问流程
1. Docker原生网络模型
原生网络模型中所有主机节点上的容器都会连接到主机内部的Docker0网桥(linux bridge),主机的IP默认会分配172.17.0.0/16网段中的一个IP,因为有了Docker0所以在一个单一主机上的容器可以实现互联互通。
但是因为IP分配的范围是基于单一主机的,所以可能在不同的主机上,会出现即使是相同网段的地址,但是这两个IP之间是无法直接通信的,为了解决这个问题,可以使用iptables的DNAT功能,设置端口映射。但是也存在弊端,同一主机上不能启动两个相同的应用端口。
总结原生网络问题:
- 默认情况下,只能实现单一主机内部容器的通信。
- 在不同的节点主机容器通信时,需要进行DNAT端口映射,在应用较多的情况下,非常繁琐,也容易出错。
- 不同主机节点默认分配给Docker0的网段可能出现重复的情况,所以只能用DNAT的方式。
2. kubernetes网络组件
正是因为原生网络存在多个节点之间容器互通的问题,那么kubernetes通过引入第三方的网络组件的方法,来解决这一问题。
常见的网络组件有:flannel,calico,openvswitch。
2.1 flannel网络
flannel实现的功能有两点:
- 协助kubernetes给每一个node上的docker0分配互相不冲突的IP地址段。
- 能在每个node节点容器IP地址段之间建立一个overlay network,将TCP数据包封装另一种网络包里面进行数据转发和通信,通过这个overlay网络,将数据包原封不动的传递到不通node节点的目标容器内。
2.1.1 flannel跨主机通信流程
当报文从Pod1:10.1.15.2/24要去往Pod4:10.1.20.2/24这个容器的时候,要分别经过以下步骤。
- 因为Pod1的veth0和docker0的一段网卡相连,所以数据包会先发往docker0网桥,此时docker0会查询自己所维护的路由表,没有发现有10.1.20.2/24这个地址,所以会把数据包发送给默认路由,这里的默认路由即flannel网桥。
- flannel网桥是一个VxLAN设备,它收到数据包后,检查到包中的目的地址并不是自己的地址,所以他本应该这把这个数据包重新发送出去,因为他的下一层已经是数据链路层,所以即将进行二层封包,即通过ARP协议来对以太网进行广播谁是10.1.20.2/24,并接受并记录目的的MAC地址。但是由于它是一个VxLAN设备,其特殊性就是并没有真正在二层发出这个 arp 包,而是由 linux kernel 引发一个”L3 MISS”事件并将 arp 请求发到用户空间的 Flannel 程序中。
- flannel程序接收到”L3 MISS”事件以及 arp 请求 (who is10.1.20.2/24 ) 后,并不会像以太网发送ARP请求,而是在etcd中匹配10.1.20.2/24的信息,从而找到Node2的MAC地址。Flannel 将查询到的信息放入 Node1 host 的 arp cache 表中,flannel0 完成这项工作后,Linux kernel 就可以在 arp table 中找到 10.1.20.2/24对应的 MAC 地址并封装二层以太包了。
- Node 上 2 的 eth0 接收到上述 VXLAN 包,内核也识别出这是一个 VXLAN 包,于是通过相反的步骤解包出来,最后传达到POD4上去。
2.1.2 flannel数据包封装过程
flannel转发数据包流程原理
- 源容器172.17.18.9想目标容器172.17.19.9发送数据,数据通过Veth-Pair到达Docker0网桥172.17.18.1(可以在容器内查看路由表网关是Docker0地址)
- Docker0网桥接收到数据包后,根据系统路由表信息,将数据包转发给flannel.1虚拟网卡。
- flannel.1接受到数据包以后,对数据进行二层以太网数据包封装。
Ethernet Header的信息(Flannel节点MAC)
From:{fa:16:3e:f0:2c:11}
To: - flannel.1封装第一层MAC数据包以后,系统内核还会进行第二层(MAC,IP)数据包封装,再次转发数据包到目标容器NODE2的em1。
再次封装的格式如下:
Ethernet Header的信息
From:{fa:16:3e:f0:2c:c6}
To: {f1:16:3e:10:11:19}
IP Header的信息
From: {192.168.91.134}
To:
2.1.3 flannel数据包解封装过程
- 目标容器宿主机的em1接收到数据后,对数据包进行拆封,拆掉外层封装后发现目的mac地址为flannel.1的mac地址(fa:16:3e:f0:2c:43),转发给flannel.1虚拟网卡。
- flannel.1虚拟网卡接收到数据,将数据转发给Docker0网桥。
- 数据包通过veth-pair到达目标容器,完成容器之间的数据通信。
2.2 calico
calico与其他虚拟网络最大的不同是,它没有采用overlay网络做报文的转发,提供了纯3层的网络模型,三层通信模型表示每个容器都通过IP直接通信,中间通过路由转发找到对方。在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。要像路由工作能够正常,每个虚拟路由器(容器所在的主机节点)通过BGP路由协议知道整个集群的路由信息。