一、K8S的三种接口
CRI:容器运行时接口(docker containerd podman cri-o)
CNI:容器网络接口(flannel calico cilium)
CSI 容器存储接口(nfs ceph gfs oss s3 minio)
二、K8S的三种网络
节点网络:nodeIP,物理网卡的IP实现节点间的通信
Pod网络:podIP,Pod与Pod之间可通过Pod的IP相互通信
Service网络:clusterIP,在K8S集群内可通过service资源的clusterIP实现对Pod集群的网络代理转发
三、CNI 网络组件flannel
1、flannel的三种模式
UDP:出现最早的模式,但是性能最差,基于flanneld应用程序实现数据包的封装/解封装
VXLAN:flannel的默认模式,也是推荐使用的模式,性能比UDP模式更好,基于内核实现数据帧的封装/解封装,而且配置简单使用方便
HOST-GW :性能最好的模式,但是配置负载,且不能跨网段
2、VLAN 和 VXLAN 的区别
作用不同:VLAN主要用作于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,避免产生环路和广播风暴。VXLAN可以将数据帧封装成UDP报文,再通过网络层传输给其它网络,从而实现虚拟大二层网络的通信
VXLAN支持更多的二层网络:VXLAN最多可支持 2^24 个;VLAN最多支持 2^12 个(4096-2)
VXLAN可以防止物理交换机MAC表耗尽:VLAN需要在交换机的MAC表中记录MAC物理地址;VXLAN采用隧道机制,MAC物理地址不需记录在交换机
3、flannel的UDP模式工作原理
①原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口
②flanneld服务进程会监听flannel0接口接收到的数据,flanneld进程会将原始数据包封装到UDP报文里
③flanneld进程会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部,再通过物理网卡发送到目标node节点
④UDP报文通过8285端口送达到目标node节点的flanneld进程进行解封装,再根据本地路由规则通过flannel0接口发送到cni0网桥,再由cni0发送到目标Pod容器
4、flannel的VXLAN模式工作原理
①原始数据帧从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1虚拟接口
②flannel.1接口接收到数据帧后添加VXLAN头部,并在内核将原始数据帧封装到UDP报文里
③根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部,再通过物理网卡发送到目标node节点
④UDP报文通过8472端口送达到目标node节点的flannel.1接口并在内核进行解封装,再根据本地路由规则发送到cni0网桥,再由cni0发送到目标Pod容器
四、CNI 网络组件calico
**flannel方案:**需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据通信性能则大受影响。
**calico方案:**Calico不使用隧道或NAT来实现转发,而是把Host当作Internet中的路由器,使用BGP同步路由,并使用iptables来做安全访问策略,完成跨Host转发来。
Calico 主要由三个部分组成:
Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用。
Felix:负责维护宿主机上的路由规则、FIB转发信息库等。
BIRD:负责分发路由规则,类似路由器。
Confd:配置管理组件。
1、calico的IPIP模式工作原理
①原始数据包从源主机的Pod容器发出,通过 veth pair 设备送达到tunl0接口,再被内核的IPIP驱动封装到node节点网络的IP报文
②根据Felix维护的路由规则通过物理网卡发送到目标node节点
③IP数据包到达目标node节点的tunl0接口后再通过内核的IPIP驱动解封装得到原始数据包,再根据本地路由规则通过 veth pair 设备送达到目标Pod容器
2、calico的BGP模式工作原理(本质就是通过路由规则来实现Pod之间的通信)
每个Pod容器都有一个 veth pair 设备,一端接入容器,另一个接入宿主机网络空间,并设置一条路由规则。这些路由规则都是 Felix 维护配置的,由 BIRD 组件基于 BGP 动态路由协议分发路由信息给其它节点。
①原始数据包从源主机的Pod容器发出,通过 veth pair 设备送达到宿主机网络空间
②根据Felix维护的路由规则通过物理网卡发送到目标node节点
③目标node节点接收到数据包后,会根据本地路由规则通过 veth pair 设备送达到目标Pod容器
五、网络组件flannel 与 calico 的区别
flannel
模式:UDP VXLAN HOST-GW
默认网段:10.244.0.0/16
通常会采用VXLAN模式,用的是叠加网络、IP隧道方式传输数据,对性能有一定的影响。
Flannel产品成熟,依赖性较少,易于安装,功能简单,配置方便,利于管理。但是不具备复杂的网络策略配置能力。
calico
模式:IPIP BGP 混合模式(CrossSubnet)
默认网段:192.168.0.0/16
使用IPIP模式可以实现跨子网传输,但是传输过程中需要额外的封包和解包过程,对性能有一定的影响。
使用BGP模式会把每个node节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过BGP路由协议实现路由转发,传输过程中不需要额外封包和解包过程,因此性能较好,但是只能在同一个网段里使用,无法跨子网传输。
calico不使用cni0网桥,而使通过路由规则把数据包直接发送到目标主机,所以性能较高;而且还具有更丰富的网络策略配置管理能力,功能更全面,但是维护起来较为复杂。
所以对于较小规模且网络要求简单的K8S集群,可以采用flannel作为cni网络插件。对于K8S集群规模较大且要求更多的网络策略配置时,可以考虑采用性能更好功能更全面的calico或cilium。
六、在所有node节点部署cni网络插件之flannel的vxlan模式
1、上传flannel安装包并解压
2、导入镜像
3、创建cni网络插件的工作目录
4、将2个镜像和cni工作目录传输给node02节点
5、将kube-flannel.yml文件传输给master01节点
6、在master01节点执行kube-flannel.yml文件
验证网络插件能够实现跨node节点的pod进行通信:
1.在master01节点创建pod资源
2、进入容器中 查看是否可以完成跨主机pod通信
七、在所有node节点上部署coreDNS
coreDNS概述:
CoreDNS 是Kubernetes的默认DNS实现,可以为K8s集群内的Pod提供DNS服务。使用CoreDNS 可以为集群中的service资源创建一个资源名称与ClusterIp 的对应关系解析,从而避免将service的usterp 地址硬编码到应用程序代码中。
- 根据 service 的资源名称 解析出对应的 clusterIP
- 根据 statefulset 控制器创建的Pod资源名称 解析出对应的 podIP
1、在所有node节点上上传coredns.tar软件包并导入镜像
2、在master01节点上部署coredns
3、验证可以通过service的名称进行通信
4、 在node节点中进入容器,验证可以通过service资源名称通信 以及可以实现nslookup