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

相关推荐
暴富的Tdy2 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
Karoku0663 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
凌虚4 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
saynaihe4 小时前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
G_whang5 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
ccubee7 小时前
docker 安装 ftp
运维·docker·容器
探索云原生8 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳8 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
TsengOnce9 小时前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器