k8s 部署 CNI 网络组件

一、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

相关推荐
慌糖6 小时前
微服务介绍
微服务·云原生·架构
高山莫衣12 小时前
Docker Desktop导致存储空间不足时的解决方案
docker·容器·eureka
鹏大师运维12 小时前
在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
linux·运维·docker·容器·麒麟·统信uos·中科方德
Ahlson12 小时前
【fnNAS】docker的nginx配置html
nginx·docker·容器·fnnas
LuckyLay12 小时前
Compose 常用命令详解——AI教你学Docker
docker·容器·eureka
阿里云云原生12 小时前
阿里云可观测 2025 年 6 月产品动态
云原生
阿里云云原生12 小时前
30 秒锁定黑客攻击:SLS SQL 如何从海量乱序日志中“揪”出攻击源
云原生
moppol12 小时前
容器化 vs 虚拟机:什么时候该用 Docker?什么时候必须用 VM?
运维·docker·容器
没有名字的小羊12 小时前
7.可视化的docker界面——portainer
docker·容器·eureka
斯普信专业组14 小时前
K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南
nginx·kubernetes·ssl