k8s-CNI-Flannel、Calico
解决集群通信问题
七层模型


协议数据单元(PDU)

设备与层的对应关系
Flannel
虚拟网桥:创建一个虚拟网卡对(veth pair),一头在容器内,一头在宿主机的root namespace内。这样一来,容器内发出的网络数据包,可以通过网桥进入宿主机网络栈,而发往容器的网络数据包也可以经过网桥进入容器。
多路复用:使用一个中间网络设备,暴露多个虚拟网卡接口,容器网卡都可以接入这个中间设备,并通过mac地址/IP地址来区分packet应该转发给哪一个容器设备。
硬件交换:还有个比较直接的方法就是为每个pod分配一个虚拟网卡,这样一来,pod与pod之间的连接关系就会变得非常清晰,因为近乎物理机之间的通信基础。如果大多数网卡都支持SR-IOV功能,该功能将单一的物理网卡虚拟成多个VF接口,每个VF接口都有单独虚拟PCIe通道,这些虚拟PCIe通道公用物理网卡的PCIe通道。
先安装kubernetes,再安装flannel网络插件
同pod不同容器之间通信

Container:一个容器直接使用另外一个已经存在的容器的网络配置:IP信息和网络端口等所有网络相关的信息都是共享的。需要注意的是:这两个容器的计算和存储资源还是隔离的。
Kubernetes的pod就是用这个实现的,同一个pod中的容器共享一个network namespace。container网络模式用于容器和容器直接频繁交流的情况。
同节点不同pod通信
交换机、同一网段

Pod - Pod[Same Node]:通常情况下,在Flannel上解决同节点Pod之间的通信依赖的是Linux Bridge,和我们在Docker中不同的是,在Kubernetes Flannel的环境中使用Linux Bridge为cni0,而不是原来的docker0。
可通过:brctl show查看对应的Linux Bridge的bridge name和interfaces。

cni0:flannel创建的网桥,如下图

brctl addbr flannel #添加网桥flannel

brctl show #查看网桥,interfaces代表交换机上的一个接口



交换机:学习、记录mac地址
route -n




跨节点通信
需要路由、不同网段

worker node局域网,多次net进行源地址转换,公网地址,路由(公网地址)
局域网下沉
ping如果能通,说明数据包出得去,回得来
vxlan、host-gw、udp、IPIP mode(IP in IP)
封装数据报文
flanneld运行在用户空间
UDP Mode

性能差:是因为从内核又绕到了用户空间 --> 运行在内核空间的模块直接进行报文封装,不再绕到用户空间--VxLAN Mode
VxLAN Mode
第一步将报文同步到用户空间,封装完成后直接扔出去了,少一次交互过程,性能会大大提升
所以,VxLAN优于UDP
- 可以封装报文
- 实现节点跨网段数据报文转发(节点可能在一个网段,也可能在不同的网段)

mac in udp
VxLAN 二层技术、虚拟扩展局域网、wireshark(抓包工具,下图)

IPIP Mode


私有局域网(路由表中无记录),数据报文在公网上没法路由
HOST-GW Mode

不再需要对报文进行多次封装
VxLAN+DirectRouting Mode

同网段使用host-gw(二层-交换机),不同网段使用VxLAN报文封装(三层-路由器)
不同网段:运行实时性要求没有那么高的应用
yaml

在安装CNI之前做一个快照。


IP Address

更多推荐
所有评论(0)