k8s-----kube网络模型与CNI网络插

k8s-----kube网络模型与CNI网络插件

—大佬,请收下我虔诚的仰望;

容器跨主机网络Flannel的两种后端实现,UDP和VXLAN中,他们一个共性就是用户的容器都连接在docker0网络上,而网络插件在宿主机上创建了一个特殊设备udp模式创建的是tun设备。vxlan创建的是vtep设备,
docker0与这个设备之间通过ip转发也就是路由表进行协作,然后网络插件真正要做的是通过某种方法把不同的宿主机上的特殊设备连通,从而实现跨宿主机通信;

这个流程就是kube对容器网络的主要吹方法,但是kube是通过kube一个叫做cni的接口维护了一个单独的网桥来代替docker0这个网桥,叫做cni网桥,在宿主机上默认设备名称是cni0
Flannel vxlan模式中,kube中Flannel的工作方式和docker中一样,只是docker0网桥换成了cni0网桥,
kube为Flannel分配的子网范围这个参数可以在部署的时候指定;
比如:kubeadm init --pod-network-cidr=10.244.0.0/16
也可以在在kube部署完成后,通过修改kube-controller-manager的配置文件来指定;
现在假设infra1要访问infra2,此时infra1容器里的eth0设备同样是以vethPair的方式连接哎node1的cni0的网桥上,所以容器发出的ip包会直接出现到宿主机的网桥cni0上;
这个时候就会匹配路由表的路由规则通过某个网络设备转发到吓一跳的地址上;这条规则自定了本机的flannel.1的设备进行处理,并且flannel.1在处理完后要将ip包转发到的网关正式隧道的另一端的vtep设备。也就是node2的flannel.1设备;
cni0网桥主要是接管所有cni插件负责的容器pod。如果用docker run出来的容器。docker项目还是会把容器连接到docker0网桥上。这个容器的ip也一定是属于docker0网桥的网段 ;
kube要设置cni0。2个主要原因,1.kube项目并没有使用docker的网络模型,CNM,所以他不希望配置docker0网桥的能力;
2.这与kube如何配置pod。也就是创建并启动一个infra容器用来hold这个pod的network namespace。
所以cni的设计思想就是kube在启动infra容器之后,可以直接调用cni网络插件。为这个infra的networknamespace配置否和预期的网络栈;
之前提到,一个network namespace的网络栈包含网卡,回环设备,路由表,iptables规则;
那么这个网络栈的配置工作如何完成?
先看下cni插件的部署和实现方式谈起,
部署kube时有一个步骤是安装kube。cni包,目的是在宿主机上安装cni插件所需要的基础可执行文件,安装完成后可以在宿主机的opt/cni/bin目录下看到他们;
在这里插入图片描述
这些网络插件的基础可执行文件按照功能可以分为3类
main插件,用来常见具体网络设备的二进制文件,比如bridge,网桥设备,ipvlan,loopback。lo设备,maclan。ptp就是vethPair设备,以及vlan,Flannel,Weave等项目都属于网桥类型的cni插件,所以往往会调用bridge这个二进制文件;
ipam插件,他是负责ip地址的二进制文件,比如dhcp这个文件会向dhcp服务器发起请求,host-local则会使用预先定义的ip地址段来分配;
由cni社区维护的cni插件,比如flannel就是专门为Flannel项目提供的cni插件,tuning是通过sysctl调整网络设备参数的二进制文件,portmap是同构iptables配置端口映射的二进制文件,bandwidth是使用TBFtoken bucket filter来进行限流的二进制文件;
从这些二进制文件中可以看出,如果要实现一个面向kube的容器网络方案,七四需要走两部分工作,以Flannel项目为例。首先,实现这个网络方案本身,这一部分需要编写的其实就是flanneld进程里的主要逻辑,比如,创建按和配置flannel.1设备,配置宿主机路由。配置ARP,FDB表里的信息等;
然后实现该网络方案对应的CNI插件。这一部分的主要作用是配置infra容器里的网络栈。并把它连接到CNI网桥上;由于Flannel项目对应的CNI插件已经内置,因此无需再单独安装,而对于weave,Calico卡项目来说,那就必须在安装插件时,把对应的cni插件的可执行文件放在/opt/chi/bin目录下;
接下来就是在宿主机上安装flanneld网络方案本身。在此过程中flanneld启动后会在每台宿主机上生成他对应的cni配置文件,他其实是一个configMap。
在这里插入图片描述
kube中处理容器网络相关的逻辑不会在kubelet的主干代码中执行,而会在具体的CRI实现里完成,

----这里看的有点蒙。。下去之后再说。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值