!!!继续上一篇实验部署!!!
目录
一.k8s的三种网络模式
1.Pod 内容器与容器之间的通信
2.同一个 Node 内 Pod 之间的通信
3.不同 Node 上 Pod 之间的通信
二.k8s的三种接口
三.Flannel 网络插件
1.UDP 模式(8285端口)
2.VXLAN 模式
四.VLAN 和 VXLAN 区别(拓展)
1.使用场景不同
2.数量不同
3.mac表中的记录不同
五.部署 flannel
1.在 master01 节点上操作
1.1.上传文件并解压
1.2.复制到2个node节点
1.3.部署 CNI 网络
2.在 node01 节点上操作
2.1.查看并导入镜像
2.2.创建目录并解压
2.3.检查端口
3.在 node02 节点上操作
3.1.查看并导入镜像
3.2.创建目录并解压
3.3.检查端口
注意
六.Calico 网络插件
1.k8s 组网方案对比
flannel方案
calico方案
2.Calico 的模式
3.Calico 主要由以下几个部分组成
4.Calico 工作原理:
IPIP 模式
BGP 模式
七.Flannel 和 Calico 对比
1.flannel
2.calico
3.总结
4.Calico的IPIP模式对比Flannel的VXLAN模式的优势(补充)
4.1.性能和效率
4.2.协议支持
4.3.总结
一.k8s的三种网络模式
k8s集群中pod网络通信分类
1.Pod 内容器与容器之间的通信
在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它
们在同一台机器上一样,可以用 localhost 地址访问彼此的端口
2.同一个 Node 内 Pod 之间的通信
每个 Pod 都有一个真实的全局 IP 地址,同一个 Node 内的不同 Pod 之间可以直接采用对方 Pod
的 IP 地址进行通信,Pod1 与 Pod2 都是通过 Veth 连接到同一个 cni0/docker0 网桥,网段相同,
所以它们之间可以直接通信
3.不同 Node 上 Pod 之间的通信
Pod 地址与 docker0 在同一网段,docker0 网段与宿主机网卡是两个不同的网段,且不同 Node 之
间的通信只能通过宿主机的物理网卡进行
要想实现不同 Node 上 Pod 之间的通信,就必须想办法通过主机的物理网卡 IP 地址进行寻址和通
信。因此要满足两个条件:Pod 的 IP 不能冲突;将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通
过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信
总结:因此引入了cni网络插件的核心原因实际上就是为了解决不同node节点上的不同pod之间的
通信,即pod跨主机通信
关于k8s的三种类型网络IP
- 节点网络:nodeIP---node节点的物理网卡ip,实现node节点之间的通信
- Pod网络:PodIP---Pod与Pod之间通过PodIP进行通信
- service网络:clusterIP---k8s集群内部,service资源的clusterIP实现对Pod集群的网络代理
Overlay Network
叠加网络,在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链
路隧道连接起来。
通过Overlay技术(可以理解成隧道技术),在原始报文外再包一层四层协议(UDP协议),通过
主机网络进行路由转发。这种方式性能有一定损耗,主要体现在对原始报文的修改。目前Overlay
主要采用VXLAN。
VXLAN 即 Virtual Extensible LAN(虚拟可扩展局域网)
是一种网络虚拟化技术,它使用一种隧道协议,将二层以太网帧封装在四层UDP报文中,通过三层
网络传输,组成一个虚拟大二层网络,到达目的地后由隧道端点解封装并将数据发送给目标地址。
从而实现分布在不同的宿主机上的虚拟机或者容器就像在同一个局域网(LAN)里那样自由通信。
二.k8s的三种接口
- CRI:容器进行时接口,连接容器引擎--docker、containerd、cri-o、podman
- CNI:容器网络接口,用于连接网络插件如:flannel、calico、cilium
- CSI:容器存储接口,如nfs、ceph、gfs、oss、s3、minio
三.Flannel 网络插件
Flannel 的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。
Flannel 是 Overlay 网络的一种,也是将 TCP 源数据包封装在另一种网络包里面进行路由转发和通
信,目前支持 UDP、VXLAN、Host-gw 3种数据转发方式
1.UDP 模式(8285端口)
- 原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0虚拟接口
- flanneld服务会监听flannel0接口收到的数据,并会将原始数据包封装到UDP报文里
- flanneld服务会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并在UDP报文外封装nodeIP头部、MAC头部等,再通过物理网卡发送到目标node节点
- UDP报文通过8285端口送达到目标node节点的flanneld服务进程解封装获取原始数据包,数据报文再根据本地路由规则通过flannel0接口发送到cni0网桥,再由cni0发送到目标Pod容器
etcd 之 Flanneld 提供说明
存储管理 Flannel 可分配的IP地址段资源
监控 etcd 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表
由于在 UDP 模式下 flanneld 进行网络的封包和解包工作,而 VXLAN 模式下封包解包的工作由内
核完成,因此性能上 UDP 模式会比在内核态做转发的 VXLAN 模式差
2.VXLAN 模式
VXLAN 模式是 Flannel 默认和推荐的模式,flannel 会为每个节点分配一个 24 位子网,并在每个
节点上创建两张虚机网卡:cni0 和 flannel.1 。 cni0 是一个网桥设备,类似于 docker0 ,节点上所
有的 Pod 都通过 veth pair 的形式与 cni0 相连。 flannel.1 则是一个 VXLAN 类型的设备,充当
VTEP 设备(VXLAN Tunnel Endpoint)的角色,实现对 VXLAN 报文的封包解包。
在 VXLAN 模式下,flanneld 启动时先确保 VXLAN 设备已存在,如果不存在则创建,存在则跳
过。并将 VTEP 设备的信息上报到 etcd 中,当 flannel 网络有新节点加入集群时并向 etcd 注册,
各节点上的 flanneld 会从 etcd 得到通知。
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容器
四.VLAN 和 VXLAN 区别(拓展)
1.使用场景不同
- VLAN主要用于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,从而避免产生环路和广播风暴
- VXLAN用作于叠加网络,可以将数据帧封装成UDP报文,再通过网络层传输到其它网络,从而实现虚拟大二层网络的通信
2.数量不同
- VXLAN支持更多的二层网络:VXLAN最多可支持 2^24 个;
- VLAN最多支持 2^12 个(4096-2)
3.mac表中的记录不同
- VXLAN可以防止物理交换机MAC表耗尽:
- VLAN需要在交换机的MAC表中记录MAC地址;
- VXLAN采用隧道机制,MAC地址不记录在交换机的MAC表中
五.部署 flannel
1.在 master01 节点上操作
1.1.上传文件并解压
unzip flannel-v0.21.5.zip
1.2.复制到2个node节点
scp flannel*.tar 192.168.80.102:/opt/k8s
scp flannel*.tar 192.168.80.103:/opt/k8s
scp cni-plugins-linux-amd64-v1.3.0.tgz 192.168.80.102:/opt/k8s/
scp cni-plugins-linux-amd64-v1.3.0.tgz 192.168.80.103:/opt/k8s/
1.3.部署 CNI 网络
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-flannel
kubectl get pods -A
kubectl get pods -A -owide
kubectl get nodes
ip -d a show flannel.1 #在node上查看flannel.1的端口
2.在 node01 节点上操作
2.1.查看并导入镜像
docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar
2.2.创建目录并解压
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
2.3.检查端口
3.在 node02 节点上操作
3.1.查看并导入镜像
docker load -i flannel.tar
docker load -i flannel-cni-plugin.tar
3.2.创建目录并解压
mkdir -p /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin
3.3.检查端口
注意
有几个文件中的网段设置需要一致
kube-flannel.yml中的网段设置
与controller manager以及kube-proxy脚本中设置的网段需要保持一致
kube-flannel.yml
controller manager脚本
kube-proxy脚本
六.Calico 网络插件
1.k8s 组网方案对比
flannel方案
需要在每个节点上把发向容器的数据包进行封装后,再用隧道将封装后的数据包发送到运行着目标
Pod的node节点上。目标node节点再负责去掉封装,将去除封装的数据包发送到目标Pod上。数据
通信性能则大受影响
calico方案
Calico不使用隧道或NAT来实现转发,而是把每个操作系统的协议栈认为是一个路由器,然后把所
有的容器认为是连在这个路由器上的网络终端,在路由器之间跑标准的路由协议——BGP的协议,
然后让它们自己去学习这个网络拓扑该如何转发
它不使用 cni0 网桥,而是通过路由规则把数据包直接发送到目标节点的网卡,所以性能高
2.Calico 的模式
- IPIP 模式:在原有 IP 报文中封装一个新的 IP 报文,新的 IP 报文中将源地址 IP 和目的地址 IP 都修改为对端宿主机 IP。Calico 默认使用 IPIP 的模式
- BGP 模式:将节点做为虚拟路由器通过 BGP 路由协议来实现集群内容器之间的网络访问。
- cross-subnet(ipip-bgp混合模式):IPIP 模式和 BGP 模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用 BGP 的场景可以使用 cross-subnet 模式,实现同子网机器使用 BGP 模式,跨子网机器使用 IPIP 模式
3.Calico 主要由以下几个部分组成
- Calico CNI插件:主要负责与kubernetes对接,供kubelet调用使用
- Felix:运行在每一台 Host 的 agent 进程,主要负责在宿主机上维护路由规则、网络接口管理等
- BIRD:BGP客户端,负责监听 Host 上由 Felix 注入的路由信息,然后通过 BGP 协议广播在集群里分发路由规则信息,从而实现网络互通
- etcd:分布式键值存储,主要负责网络元数据一致性,确保 Calico 网络状态的准确性
4.Calico 工作原理:
IPIP 模式
- 原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到tunl0接口
- tunl0接口收到数据包后,由内核将原始数据包封装到node节点网络的IP报文里,再根据Felix维护的路由规则通过物理网卡发送到目标node节点
- IP数据包到达目标节点的tunl0接口后,由内核解封装获取原始数据包,数据报文再根据本地路由规则经过 veth pair 设备发送到目标Pod容器
BGP 模式
本质就是通过路由规则来实现Pod之间的通信
- 每个Pod都有一个 veth pair 设置,一端接入Pod,另一端接入宿主机网络空间,并设置了一条路由规则
- 这些路由规则都是 Felix 维护的,由 BIRD(BGP Client) 基于 BGP 动态路由协议分发给其它节点
- 原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到宿主机网络空间,再根据Felix维护的路由规则通过物理网卡发送到目标node节点
- 目标node节点收到数据包后,会根据本地路由规则经过 veth pair 设备送达到目标 Pod 容器
七.Flannel 和 Calico 对比
1.flannel
- 模式: UDP VXLAN HOST-GW
- 默认网段:10.244.0.0/16
- 通常会采用VXLAN模式,由于用的是叠加网络、IP隧道方式传输数据,传输过程中需要额外的封包和解包,对性能有一点的影响
- flannel简单易用
- 不具备复杂的网络策略配置能力,性能方面表现一般
2.calico
- 模式:IPIP VXLAN BGP CrossSubnet(混合模式)
- 默认网段:192.168.0.0/16
- 使用IPIP或VXLAN模式可以实现跨网段通信,但是传输过程中需要额外的封包和解包,对性能有一点的影响
- 使用BGP模式会把每个节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过路由规则直接发送数据包到目标主机,传输中不需要额外的封包和解包,因此性能较好。但是不能跨网段通信。
- calico性能较高,具有丰富的网络
3.总结
- flannel适合规模较小,网络要求简单的K8S集群
- calico适合规模较大,需要设置网络策略,固定 PodIP 的K8S集群
4.Calico的IPIP模式对比Flannel的VXLAN模式的优势(补充)
4.1.性能和效率
- IPIP模式使用IP in lP 协议进行隧道封装,
- VXLAN 模式使用 VXLAN 协议
- IPIP模式的隧道封装相对较简单(IPIP 模式只是在原始IP数据包的头部再封装一层IP头部,而VXLAN则在原始二层数据帧的头部再封装一个 VXLAN头和UDP头),相对来说IPIP模式的网络开销更少
4.2.协议支持
- IPIP 模式使用标准的 IP inlP 协议,这意味着它可以在几乎所有的网络环境中使用,并且与各种网络设备和厂商兼容。
- 相比之下VXLAN模式需要底层网络设备(如交换机、路由器)支持 VXLAN 功能才能正常工作(当然,当前的大多数设备都是支持的)
4.3.总结
- Calico的IPIP模式对比常规模式仍存在因封包解包而造成的性能损耗,所以,如非必要,建议还是使用常规模式