k8s 网络模型( 二 )


k8s中每个集群中的每个Node都会被分配了一个CIDR块(无类别域间路由选择,把网络前缀都相同的连续地址组成的地址组称为CIDR地址块)用来给该Node上的Pod分配IP地址 。(保证pod的ip不会冲突)
另外还需要把pod的ip与所在的关联起来()
image
每个Node都知道如何把数据包转发到其内部运行的Pod,当一个数据包到达Node后,其内部数据流就和Node内Pod之间的流转类似了 。
对于如何来配置网络,k8s在网络这块自身并没有实现网络规划的具体逻辑,而是制定了一套CNI()接口规范,开放给社区来实现 。
例如AWS,亚马逊为k8s维护了一个容器网络插件,使用CNI插件来让亚马逊VPC(虚拟私有云)环境中的Node与Node直接进行交互.
的是k8s中实现CNI规范较为出名的一种实现 。
3.2.1 VXLAN
image.png
从这个报文中可以看到三个部分:
1.最外层的 UDP 协议报文用来在底层网络上传输,也就是 vtep 之间互相通信的基础
2.中间是 VXLAN 头部,vtep 接受到报文之后,去除前面的 UDP 协议部分,根据这部分来处理 vxlan 的逻辑,主要是根据 VNI 发送到最终的虚拟机
3.最里面是原始的报文,也就是虚拟机看到的报文内容
image.png
3.2.1
是团队针对设计的一个网络规划实现,简单来说,它的功能有以下几点:
image.png
如上图,总的来说就是建立VXLAN 隧道,通过UDP把IP封装一层直接送到对应的节点,实现了一个大的 VLAN 。
4.Pod与之间的网络
上面展示了Pod之间如何通过他们自己的ip地址进行通信,但是pod的ip地址是不持久的,当集群中pod的规模缩减或者pod故障或者node故障重启后,新的pod的ip就可能与之前的不一样的 。所以k8s中衍生出来来解决这个问题 。
k8s中 管理了一系列的Pods,每个有一个虚拟的ip,要访问管理的Pod上的服务只需要访问你这个虚拟ip就可以了,这个虚拟ip是固定的,当下的pod规模改变、故障重启、node重启时候,对使用的用户来说是无感知的,因为他们使用的的ip没有变 。
当数据包到达虚拟ip后,数据包会被通过k8s给该自动创建的负载均衡器路由到背后的pod容器 。下面我们看看具体是如何做到的
4.1
为了实现负载均衡,k8s依赖linux内建的网络框架- 。是Linux提供的内核态框架,允许使用者自定义处理接口实现各种与网络相关的操作 。为包过滤,网络地址转换和端口转换提供各种功能和操作,以及提供禁止数据包到达计算机网络内敏感位置的功能 。在linux内核协议栈中,有5个跟有关的钩子函数,数据包经过每个钩子时,都会检查上面是否注册有函数,如果有的话,就会调用相应的函数处理该数据包
01
|
02
|
03

04
+-------------------+
05
||
06
+-------------------+
07
|
08
|
09

10
+------------------+
11
| | +----------------+
12
||-------->||
13
| | +----------------+
14
+------------------+ |
15
| |
16
| ↓
17
| +-----------------+
18
| | local|
19
| +-----------------+
20
| |
21
| |
22
↓ ↓
23
+---------------+ +-----------------+
24
|| ||
25
+---------------+ +-----------------+
26
| |
27
| |
28
↓ |
29
+------------------+ |
30
| | |
31
||
32
| |
33
+------------------+
34
|
35
|
36

37
+--------------------+