hello云胜

技术与生活

0%

K8S网络学习

基础知识

K8S的网络中主要存在4种类型的通信:

①同一Pod内的容器间通信:它们之间通过localhost(lo)进行通信。

②各个Pod彼此间的通信:通过Pod IP地址进行通信。

③Pod和Service间的通信:两者并不属于同一网络,实现方式是通过IPVS或iptables规则转发。

④集群外部流量和Service之间的通信:实现方式:Ingress、NodePort、Loadbalance

K8S为Pod和Service资源对象分别使用了各自的专有网络,Pod网络由K8S的网络插件配置实现,而Service网络则由K8S集群进行指定

K8S使用的网络插件需要为每个Pod配置至少一个特定的地址,即Pod IP。Pod IP地址实际存在于某个网卡(可以是虚拟机设备)上。

而Service的地址却是一个虚拟IP地址,没有任何网络接口配置在此地址上,它由Kube-proxy借助iptables规则或ipvs规则重定向到本地端口,再将其调度到后端的Pod对象。Service的IP地址是集群提供服务的接口,也称为Cluster IP。

Pod网络和IP由K8S的网络插件负责配置和管理,具体使用的网络地址可以在管理配置网络插件时进行指定,如1x.xx.0.0/16网络(自己指定)。而Cluster网络和IP是由K8S集群负责配置和管理,如1x.xx.0.0/12网络(默认)。

K8S网络的实现不是集群内部自己实现,而是依赖于第三方网络插件—-CNI(Container Network Interface)

flannel、calico、canel等是目前比较流行的第三方网络插件。

这三种的网络插件需要实现Pod网络方案的方式通常有以下几种:

虚拟网桥、多路复用(MacVLAN)、硬件交换(SR-IOV)

CNI插件进行编排网络,以实现Pod和集群网络管理功能的自动化。每次Pod被初始化或删除,kubelet都会调用默认的CNI插件去创建一个虚拟设备接口附加到相关的底层网络,为Pod去配置IP地址、路由信息并映射到Pod对象的网络名称空间。

CNI的主要核心是:在创建容器时,先创建好网络名称空间(netns),然后调用CNI插件为这个netns配置网络,最后在启动容器内的进程。

service如何找到pod

label selector

calico网络插件

基于BGP的三层网络插件,也支持网络策略进而实现网络的访问控制;它在每台主机上都运行一个虚拟路由,利用Linux内核转发网络数据包,并借助iptables实现防火墙功能。实际上Calico最后的实现就是将每台主机都变成了一台路由器,将各个网络进行连接起来,实现跨主机通信的功能。

用到的命令

1
2
3
yum install traceroute.x86_64 -y
yum install net-tools -y
yum install tcpdump -y

部署几个busybox用于测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: busybox
name: busybox
namespace: default
spec:
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox:1.28.4
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent

1master4node的环境,cni为calico网络。

IPIP的工作模式

主机ip信息

master 1x.xxx.5.1
node1 1x.xxx.5.2
node2 1x.xxx.5.3
node3 1x.xxx.5.4
node4 1x.xxx.5.5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@wlk8s01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 1x.xxx.5.254 0.0.0.0 UG 0 0 0 eth0
1x.xxx.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
100.116.168.192 1x.xxx.5.3 255.255.255.192 UG 0 0 0 tunl0
100.121.66.192 1x.xxx.5.2 255.255.255.192 UG 0 0 0 tunl0
100.121.236.192 1x.xxx.5.4 255.255.255.192 UG 0 0 0 tunl0
100.125.97.128 0.0.0.0 255.255.255.192 U 0 0 0 *
100.125.97.132 0.0.0.0 255.255.255.255 UH 0 0 0 cali8bb97db0aa4
100.125.97.135 0.0.0.0 255.255.255.255 UH 0 0 0 calide035c655d8
100.125.97.136 0.0.0.0 255.255.255.255 UH 0 0 0 caliac4b211f131
100.125.97.137 0.0.0.0 255.255.255.255 UH 0 0 0 cali51caa2d8c29
100.125.97.138 0.0.0.0 255.255.255.255 UH 0 0 0 cali5e5ab1418d1
100.125.97.139 0.0.0.0 255.255.255.255 UH 0 0 0 cali98e6dbf06d5
100.125.176.128 1x.xxx.5.5 255.255.255.192 UG 0 0 0 tunl0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0

创建daemonSet的busybox

1
2
3
4
5
6
[root@wlk8s01 ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-99qmn 1/1 Running 0 95s 100.121.236.245 wlk8s04.cloud.test.cthd <none> <none>
busybox-n4lkm 1/1 Running 0 95s 100.116.168.225 wlk8s03.cloud.test.cthd <none> <none>
busybox-smq7r 1/1 Running 0 95s 100.121.66.229 wlk8s02.cloud.test.cthd <none> <none>
busybox-v76gs 1/1 Running 0 96s 100.125.176.183 wlk8s05.cloud.test.cthd <none> <none>

进入pod,互相ping

可以ping通

ping包的路程

pod100.121.236.245上的路由信息

1
2
3
4
5
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0
169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0

路由表中Flags标志的含义:

U up表示当前为启动状态

H host表示该路由为一个主机,多为达到数据包的路由

G Gateway 表示该路由是一个网关,如果没有说明目的地是直连的

D Dynamicaly 表示该路由是重定向报文修改

M 表示该路由已被重定向报文修改

第一条路由的意思是去往任何网段的数据包都发往网关169.254.1.1,然后从eth0网卡发送出去。

如果ping 100.116.168.225

那么,会匹配到第一条

回头看master上的路由信息,去100.116.168.225的数据包会匹配到这个tunl0的路由。

image-20220818151212161

这条路由的意思是,去网段100.116.168.192/26的数据包都发到网关1x.xxx.5.3。也就是pod2所在的主机node2

也就是说calico会给每个node分配一个网段,在路由表中记录。之后就可以根据目的ip将数据包发到指定的node节点。

每加一个node,就会对应创建一个隧道tunl0

再去看node2的路由信息。发现node节点会给自己的每一个pod创建一条路由信息。这样达到node的数据就可以准确的发给pod。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@wlk8s03 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 1x.xxx.5.254 0.0.0.0 UG 0 0 0 eth0
10.103.97.2 1x.xxx.5.3 255.255.255.255 UGH 50 0 0 eth0
1x.xxx.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
100.116.168.192 0.0.0.0 255.255.255.192 U 0 0 0 *
100.116.168.193 0.0.0.0 255.255.255.255 UH 0 0 0 cali5e5de735a63
100.116.168.194 0.0.0.0 255.255.255.255 UH 0 0 0 cali4f9ccee34d6
100.116.168.196 0.0.0.0 255.255.255.255 UH 0 0 0 calif7c7bbacc1d
100.116.168.199 0.0.0.0 255.255.255.255 UH 0 0 0 cali822a69c5fd1
100.116.168.201 0.0.0.0 255.255.255.255 UH 0 0 0 cali34f0fd4339f
100.116.168.202 0.0.0.0 255.255.255.255 UH 0 0 0 cali9cb916c7b8e
100.116.168.205 0.0.0.0 255.255.255.255 UH 0 0 0 calid555706b3ed
100.116.168.206 0.0.0.0 255.255.255.255 UH 0 0 0 calibaa8ac4626e
100.116.168.207 0.0.0.0 255.255.255.255 UH 0 0 0 cali1912584f857
100.116.168.208 0.0.0.0 255.255.255.255 UH 0 0 0 cali21d055e76c9
100.116.168.209 0.0.0.0 255.255.255.255 UH 0 0 0 cali0e7af07e6c4
100.116.168.210 0.0.0.0 255.255.255.255 UH 0 0 0 calie9df38822f3
100.116.168.211 0.0.0.0 255.255.255.255 UH 0 0 0 califdbc8377bc0
100.116.168.212 0.0.0.0 255.255.255.255 UH 0 0 0 cali36f34f157ff
100.116.168.213 0.0.0.0 255.255.255.255 UH 0 0 0 cali537fa7ec461
100.116.168.214 0.0.0.0 255.255.255.255 UH 0 0 0 cali45a1dc5faa7
100.116.168.215 0.0.0.0 255.255.255.255 UH 0 0 0 cali7f1fc57aff6
100.116.168.217 0.0.0.0 255.255.255.255 UH 0 0 0 cali31446935ad8
100.116.168.220 0.0.0.0 255.255.255.255 UH 0 0 0 cali629b8c67f54
100.116.168.223 0.0.0.0 255.255.255.255 UH 0 0 0 cali7c917963b12
100.116.168.225 0.0.0.0 255.255.255.255 UH 0 0 0 cali93f1e5221ad
100.121.66.192 1x.xxx.5.2 255.255.255.192 UG 0 0 0 tunl0
100.121.236.192 1x.xxx.5.4 255.255.255.192 UG 0 0 0 tunl0
100.125.97.128 1x.xxx.5.1 255.255.255.192 UG 0 0 0 tunl0
100.125.176.128 1x.xxx.5.5 255.255.255.192 UG 0 0 0 tunl0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0

当node节点网卡收到数据包之后,发现发往的目的ip为100.116.168.225,那么就匹配到这个calico的虚拟设备,并且该设备是本机的直连设备UH

image-20220818152334465

这个虚拟设备就是veth pair的一端。

也就是说在创建这个pod2的时候,calico会给pod2创建一个veth pair设备。

这一对设备,一端是pod2的网卡eth0,另一端就是cali93f1e5221ad。

去pod2中查看

1
2
3
4
5
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0
169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0

这个pod2中的网卡eth0和node上的cali93f1e5221ad,就是一堆veth

凡是发给cali93f1e5221ad的数据,实际上就是发给了pod2的eth0,这样数据最终就到了pod2

顾名思义,IPIP网络就是将IP网络封装在IP网络里。IPIP网络的特点是所有pod的数据流量都从隧道tunl0发送,并且在tunl0这增加了一层传输层的封包。

抓包

在master上抓,pod1 ping pod2的数据包

1
tcpdump -i eth0 -vvv -w ipip.pcap

BGP

BGP网络相比较IPIP网络,最大的不同之处就是没有了隧道设备 tunl0。 前面介绍过IPIP网络pod之间的流量发送tunl0,然后tunl0发送对端设备。BGP网络中,pod之间的流量直接从网卡发送目的地,减少了tunl0这个环节。

master节点上路由信息。从路由信息来看,没有tunl0设备。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@wlk8s01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 1x.xxx.5.254 0.0.0.0 UG 0 0 0 eth0
1x.xxx.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
1x.xxx.36.128 1x.xxx.5.9 255.255.255.192 UG 0 0 0 eth0
1x.xxx.37.192 0.0.0.0 255.255.255.192 U 0 0 0 *
1x.xxx.37.195 0.0.0.0 255.255.255.255 UH 0 0 0 cali426c1bfdfc6
1x.xxx.37.198 0.0.0.0 255.255.255.255 UH 0 0 0 calide035c655d8
1x.xxx.37.200 0.0.0.0 255.255.255.255 UH 0 0 0 cali74f1cb95b24
1x.xxx.37.201 0.0.0.0 255.255.255.255 UH 0 0 0 cali2d690b6853f
1x.xxx.37.202 0.0.0.0 255.255.255.255 UH 0 0 0 caliac4b211f131
1x.xxx.37.203 0.0.0.0 255.255.255.255 UH 0 0 0 cali6765f213860
1x.xxx.37.204 0.0.0.0 255.255.255.255 UH 0 0 0 calid7e1d68c7d4
1x.xxx.39.0 1x.xxx.5.8 255.255.255.192 UG 0 0 0 eth0
1x.xxx.39.64 1x.xxx.5.10 255.255.255.192 UG 0 0 0 eth0
1x.xxx.39.128 1x.xxx.5.7 255.255.255.192 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0

pod的ip

1
2
3
4
5
6
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-h2t6q 1/1 Running 0 28m 1x.xxx.39.46 wlk8s03.dubble.test.cthd <none> <none>
busybox-mknk8 1/1 Running 0 28m 1x.xxx.39.108 wlk8s05.dubble.test.cthd <none> <none>
busybox-q6t6x 1/1 Running 0 28m 1x.xxx.39.176 wlk8s02.dubble.test.cthd <none> <none>
busybox-xd57j 1/1 Running 0 28m 1x.xxx.36.168 wlk8s04.dubble.test.cthd <none> <none>

ping包之旅

1x.xxx.39.46的pod称为pod1

1
2
3
4
5
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0
169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0

根据pod1中的路由信息,ping包通过eth0网卡发送到master节点上

ping 1x.xxx.39.108 在master上匹配到

image-20220818171221978

而5.10就是pod2所在的node5

去看node5上的路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@wlk8s05 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 1x.xxx.5.254 0.0.0.0 UG 0 0 0 eth0
10.103.97.2 1x.xxx.5.10 255.255.255.255 UGH 50 0 0 eth0
1x.xxx.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
1x.xxx.36.128 1x.xxx.5.9 255.255.255.192 UG 0 0 0 eth0
1x.xxx.37.192 1x.xxx.5.6 255.255.255.192 UG 0 0 0 eth0
1x.xxx.39.0 1x.xxx.5.8 255.255.255.192 UG 0 0 0 eth0
1x.xxx.39.64 0.0.0.0 255.255.255.255 UH 0 0 0 cali7d7ffe7c7d6
1x.xxx.39.64 0.0.0.0 255.255.255.192 U 0 0 0 *
1x.xxx.39.65 0.0.0.0 255.255.255.255 UH 0 0 0 cali9371da1f513
1x.xxx.39.67 0.0.0.0 255.255.255.255 UH 0 0 0 calic8ba59a1725
1x.xxx.39.69 0.0.0.0 255.255.255.255 UH 0 0 0 calie04054d5f38
1x.xxx.39.73 0.0.0.0 255.255.255.255 UH 0 0 0 cali1a54c8bb3d5
1x.xxx.39.74 0.0.0.0 255.255.255.255 UH 0 0 0 cali34f0fd4339f
1x.xxx.39.75 0.0.0.0 255.255.255.255 UH 0 0 0 caliaf36e566c9a
1x.xxx.39.77 0.0.0.0 255.255.255.255 UH 0 0 0 cali9617694e503
1x.xxx.39.78 0.0.0.0 255.255.255.255 UH 0 0 0 cali5a8fbdfbd03
1x.xxx.39.79 0.0.0.0 255.255.255.255 UH 0 0 0 cali994c1aefd56
1x.xxx.39.80 0.0.0.0 255.255.255.255 UH 0 0 0 cali496888aef9b
1x.xxx.39.81 0.0.0.0 255.255.255.255 UH 0 0 0 cali737d7f1222f
1x.xxx.39.82 0.0.0.0 255.255.255.255 UH 0 0 0 cali5089469215d
1x.xxx.39.83 0.0.0.0 255.255.255.255 UH 0 0 0 cali3e2d27cb4e3
1x.xxx.39.84 0.0.0.0 255.255.255.255 UH 0 0 0 calieea52a0a5fc
1x.xxx.39.85 0.0.0.0 255.255.255.255 UH 0 0 0 calie06bd32f5fd
1x.xxx.39.86 0.0.0.0 255.255.255.255 UH 0 0 0 cali2997c644807
1x.xxx.39.87 0.0.0.0 255.255.255.255 UH 0 0 0 calid29def8bdcd
1x.xxx.39.89 0.0.0.0 255.255.255.255 UH 0 0 0 cali601bd94c93b
1x.xxx.39.90 0.0.0.0 255.255.255.255 UH 0 0 0 cali19213c693a4
1x.xxx.39.92 0.0.0.0 255.255.255.255 UH 0 0 0 cali629b8c67f54
1x.xxx.39.102 0.0.0.0 255.255.255.255 UH 0 0 0 califca502b91ed
1x.xxx.39.108 0.0.0.0 255.255.255.255 UH 0 0 0 cali9c223080f7f
1x.xxx.39.128 1x.xxx.5.7 255.255.255.192 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0

根据路由信息,配到

image-20220818171524462

和ipip一样,也是veth pair 的一端