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的路由。

这条路由的意思是,去网段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

这个虚拟设备就是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上匹配到

而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
|
根据路由信息,配到

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