当前位置:首页 > Web开发 > 正文

会进行重新封包

2024-03-31 Web开发

标签:

4.3 Kubernetes网络组件之 Flannel
Flannel是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的配置文件去设定大的子网,还有属性模式

net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } ---

这个配置完之后会放到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集群都是启动的
二进制部署指定

cat /opt/kubernetes/cfg/kube-controller-manager.conf --allocate-node-cidrs=true \ 允许node自动分配cidr这个网络 --cluster-cidr=10.244.0.0/16 \ 指定pod网络的网段,这个网段要和flannel的网段对应上

此外也都要在每个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

[[email protected] ~]# kubectl get pod -n kube-system -o wide kube-flannel-ds-amd64-4jjmm 1/1 Running 0 14d 10.4.7.11 k8s-master1 <none> <none> kube-flannel-ds-amd64-9f9vq 1/1 Running 0 14d 10.4.7.21 k8s-node2 <none> <none> kube-flannel-ds-amd64-gcf9s 1/1 Running 0 14d 10.4.7.12 k8s-node1 <none> <none>

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32902.html