会进行重新封包
标签:
4.3 Kubernetes网络组件之 FlannelFlannel是CoreOS维护的一个网络组件,Flannel为每个Pod供给全局独一的IP,,Flannel使用ETCD来存储Pod子网与Node IP之间的关系。flanneld守护进程在每台主机上运行,并卖力维护ETCD信息和路由数据包。
其实k8s网络组件flannel和calico主要解决的问题是k8s节点之间容器网络的通信,flannel要保证每个pod的IP是独一的,怎么保证是独一的,大部分组件的做法是在每个Node上分配一个独一的子网,node1是一个单独的子网,node2是一个单独的子网,可以理解是差别网段,差别vlan,所以每个节点都是一个子网,所以flannel会预先设置一个大的子网,然后在这个每个node上分配子网,这些信息城市由flannel存储到etcd中,并且每个子网绑定到node上都有关系记录的,然后便利下次进行二次的数据包传输,并且flannel在node上会启动一个守护进程并运行,守护进程主要维护的是本地的路由法则,和维护etcd中的信息。
1、Flannel 部署
https://github.com/coreos/flannel kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml部署好之后会以daemonset的形式在每个node上启动一个pod,来启动一个flannel的守护进程,主要卖力本机路由表的设定和etcd中的数据,本地的子网上报到etcd中,所以守护进程长短常重要的
可以在flannel的配置文件去设定大的子网,还有属性模式
这个配置完之后会放到cni这个目录下,由于flannel是使用网桥的模式,实现的同节点数据包达到宿主机这个的通信,所以子网信息并没写到这个配置文件里,而是放到了这个 cat /var/run/flannel/subnet.env 下,这个通过ip a也能看到设备分配的ip,每个节点城市分配一个子网,网络接口设备为cni0,也就是一个node上可以分配255个小的子网
[[email protected] ~]# cat /var/run/flannel/subnet.env FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true还有一个cni的二进制文件, /opt/cni/bin,这个就是kubelet挪用这个二进制接口为创建的每个pod创建网络信息,并且是从我们的配置的子网中去拿IP
配置的话改削的是就是预先设定它的子网,以及事情模式,此外就是这个网络不能与k8s自己的内网斗嘴,否则导致网络欠亨的状况
2、 Flannel事情模式及道理
Flannel撑持多种数据转发方法:
UDP:最早撑持的一种方法,由于性能最差,目前已经弃用。
VXLAN:Overlay Network方案,源数据包封装在另一种网络包里面进行路由转发和通信
这也是网络的虚拟化技术,也就是本来是有一个包数据包,有源IP和目的IP,但由于某些情况这个数据包达到不了目的地点上,这可能就会借助物理上的以太网网络进行封装一个数据包带上,然后通过这种物理网络传输到目的地点上,这是一种叠加式的网络,里面是有两种数据包的,这种也叫做地道方案
Host-GW:Flannel通过在各个节点上的Agent进程,将容器网络的路由信息刷到主机的路由表上,这样一来所有的主机都有整个容器网络的路由数据了,这样它就知道这个数据包达到这个节点转发到这个机器上,也就是路由表之间转发的,这种也叫路由方案
VXLAN
使用kubeadm部署的话默认是撑持的
kubeadm部署指定Pod网段 kubeadm init --pod-network-cidr=10.244.0.0/16但是使用二进制部署就得去启动cni的撑持,默认我ansible部署的k8s集群都是启动的
二进制部署指定
此外也都要在每个node节点的kubelet的配置文件长进行对cni的撑持
[[email protected] ~]# cat /opt/kubernetes/cfg/kubelet.conf --network-plugin=cni \这样的话就能以cni的标准来为k8s配置网络
kube-flannel.yml net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } }在节点1上有个容器,与节点2上的容器进行通信,这两个是进行跨主机进行的通信,如果本机通信之间使用网桥使用二层的传输了,像原生的docker网就能解决了,最重要的是这两个节点的数据包传输
flannel保证每个node都是独一的ip,它是在每个node上都分配一个子网
可以看到flannel是基于宿主机创建的,它会为每个node创建独立的子网,并为当前pod分配ip
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32902.html