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

  • 40
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值