什么是Flannel Flannel是一种跨主机容器间的网络通信方案,本身只是一个框架,真正提供网络功能的是其具体的后端实现 Flannel的后端实现有哪几种? UDP VXLAN host-gw Flannel TUN设备的作用是什么? Flannel会在宿主机上创建一个flannel0设备,它是一个TUN设备,TUN设备工作在三层,用来在操作系统内核和应用程序之间传递IP包。 Flannel中的子网是? 设备在收到数据包以后,会交给创建该设备的Flannel进程 Flannel进程在收到数据包后,发现目的IP是100.96.2.5,根据Etcd维护的子网信息,可以找到容器对应的宿主机IP是10.168.0.3 因此只需要将数据包发往目的主机的8285端口即可 此时只要源主机和目的主机网络是相通的,数据包即可被正常发送到目的主机 Flannel UDP模式下的通信图如下: Flannel UDP模式的缺点 Flannel
原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在。 这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。 第三个问题,为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡? 我们来看一眼安装了Flannel的节点上的路由表。 回到顶部 3Flannel的安装和配置 Flannel是Golang编写的程序,因此的安装十分简单。 到此,整个Flannel集群也就正常运行了。 最后,前面反复提到过Flannel有一个保存在Etcd的路由表,可以在Etcd数据中找到这些路由记录,如下图。
Flannel 则使用虚拟网络(overlay network)来实现网络功能。 Flannel 支持多种 overlay 网络方案,例如 VXLAN、GRE 和 Host-gw。 Flannel 的配置和部署相对来说比较简单,因为它不需要为每个节点设置路由规则,而是使用 overlay 网络。 安全性Calico 和 Flannel 都提供了一定程度的安全性。Calico 可以通过网络策略来控制容器之间的通信,Flannel 则使用网络策略来限制容器之间的通信。 Flannel 的扩展性也非常好,因为它使用的是 overlay 网络,可以轻松地跨越多个节点和数据中心。
当包含VTEP设备的宿主机并加入Flannel网络以后,会在其他的Flannel节点下添加路由规则,如下: $ route -n Kernel IP routing table DestinationGatewayGenmaskFlagsMetricRefUseIface 为了让VTEP设备之间进行二层网络的通信,我们需要知道目的设备MAC地址,而MAC地址的学习正式ARP表的功能,在这里ARP记录,是新的Flannel节点加入时,自动在其他的Flannel节点上进行添加的 的转发数据库,flannel.1网桥对应的FDB信息也是由flanned进程进行维护,内容可以通过以下命令进行查看: $ bridge fdb show flannel.1| grep 5e:f8:4f VXLAN通信过程 首先来自容器的包还是会先到达docker0网桥 到达网桥后,经由路由表判断,需要通过flannel.1设备发往10.1.16.0 在数据包到达flannel.1设备后,这里会查到目的端的 进一步封装二层数据帧,首先会增加一个VXLAN头,该头里面有一个重要的标志称之为VNI,在Flannel中VNI的默认值是1, Flannel默认的VETP设备都是flannel.1,它是VTEP设备识别该数据帧需不需要自己处理的重要标志
问题描述 etcd 3.3.1 flannel 0.11.0 flannel启动时报错,启动参数如下 1 . /flannel -etcd-keyfile=/etc/kubernetes/ssl/etcd-client-key.pem -etcd-cafile=/etc/kubernetes/ssl/ca.pem 2331 main.go:382] Couldn't fetch network config: 100: Key not found (/coreos.com) [22] 其中coreos.com是启动flannel coreos.com/network/config '{"Network":"192.168.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}' OK 重新启动flannel 网上搜了下说是etcd api版本的问题,不是很明白,然后去看代码,发现flannel在使用etcd时只支持etcd v2版本的api,因为上线添加key-value时使用的是v3版本的api,所以导致虽然添加成功了
Flannel的网络模式切换非常简单,这也符合这款CNI最初的设计理念——足够轻量级。 Flannel有两种网络模式:VxLAN和Host-GW,默认的模式是VxLAN。 首先找到Flannel的部署yaml文件,参考github上的文件 在部署文件中找到net-conf.json位置,如下: net-conf.json: | { "Network "Type": "vxlan" } } 修改里面的Type即可更改网络模式,可选项: host-gw vxlan 然后使用kubectl apply -f kube-flannel.yml
操作环境 网络拓扑图 操作步骤 配置k8s-master 1.在k8s-master节点上创建flannel网络 [root@k8s-master yaml]# etcdctl mk /atomic.io This is the configuration key that flannel queries # For address range assignment FLANNEL_ETCD_PREFIX start flanneld.service 在启动flannel,通过ifconfig可以查看到flannel0 [root@k8s-master ~]# ifconfig ens192 This is the configuration key that flannel queries # For address range assignment FLANNEL_ETCD_PREFIX start flanneld.service 3.启动flannel后,可以通过ifconfig查看到flannel0 [root@k8s-node1 ~]# ifconfig docker0
前言 今天来聊聊 Flannel,Flannel 是 Kubernetes 默认网络组件,再聊 Flannel 时,我们得先明白一个叫 CNI 东东,CNI 是什么?能有什么用?下文会做出解释。 Flannel 原理 Flannel 实质上是一种 覆盖网络(overlay network),也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持 UDP、VxLAN、Host Gw Flannel 架构简介 本文主要介绍下 vxlan 和 host-gw 数据转发方式 Vxlan 模式 ? flannel默认使用 8285 端口作为 UDP 封装报文的端口,VxLan 使用 8472 端口。 两个节点中容器是如何相互通信的呢? 一个是数据包的流出,当从节点出来的数据包,应该转发到哪个node上,这些都是由flannel去维护的。
简介 flannel是 coreos 开源的 Kubernetes CNI 实现。它使用 etcd 或者 Kubernetes API 存储整个集群的网络配置。 flannel通过不同的 backend 来实现跨主机的容器网络通信,目前支持 udp , vxlan , host-gw 等一系列 backend实现。 源码地址:https://github.com/flannel-io/flannel SubnetManager 子网管理器,以下简称sm 在main方法中会初始化sm: sm, err := newSubnetManager 网络设备 与flannel相关的几个虚拟网络上设备: flannel.1:这是一个vxlan设备。也就是耳熟能详的vteh设备,负责网络数据包的封包和解封。 在Flannel中,VNI的默认值是1,这也是为什么宿主机的VTEP设备都叫flannel.1的原因 一个flannel.1设备只知道另一端flannel.1设备的MAC地址,却不知道对应的宿主机地址是什么
flannel 没有VLAN划分 1、设置hosts (所有主机) vi /etc/hosts 192.168.118.77 k8smaster 192.168.118.72 k8snode01 172.17.1.0", "SubnetMax": "172.17.254.0"}' etcdctl -C http://192.168.118.77:4001 cluster-health 4、安装flannel (所有主机) yum install -y flannel cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak vi /etc/sysconfig start flanneld.service systemctl restart docker 5、设置DOCKER默认网络,(所有主机,每台的子网不一样,分别设置) cat /run/flannel /subnet.env FLANNEL_NETWORK=172.17.0.0/16 FLANNEL_SUBNET=172.17.82.1/24 FLANNEL_MTU=1472 FLANNEL_IPMASQ
Kubernetes中解决网络跨主机通信的一个经典插件就是Flannel。 Flannel实质上只是一个框架,真正为我们提供网络功能的是后端的Flannel实现,目前Flannel后端实现的方式有三种: UDP VXLAN HOST-GW 一、UDP UDP是最早的实现方式,但是由于其性能原因 的设备中; flannel0设备会把这个IP包交给创建这个设备的应用程序,也就是Flannel进程(从内核状态向用户状态切换); Flannel进程收到IP包后,将这个包封装在UDP中,就根据其目的地址将其转发给 注: 1、flannel0是一个TUN设备,它的作用是在操作系统和应用程序之间传递IP包; 2、Flannel是根据子网(Subnet)来查看IP地址对应的容器是运行在那个Node上; 3、这些子网和Node 现在我们nginx01要访问nginx02,其流程如下: nginx01发送请求包会被转发到docker0; 然后会通过路由转发到本机的flannel,1; flannel.1收到包后通过ARP记录找到目的
安装 Flannel 的安装逻辑如下,通过安装的 yaml 文件里有两个 initContainer,专门就是用来做 CNI 和 Flannel 配置的安装,所以命名也是叫 install-cni-plugin 以及 install-cni 那么这两个容器主要是怎么安装的呢,其实很简单,可以看看 args 字段,实际上就是把 flannel 的二进制,以及 cni-conf.json 和 10-flannel.conflist :v1.1.0 command: - cp args: - -f - /flannel - /opt/cni/bin/flannel volumeMounts: - name Pod: ✔ kube-flannel-ds-82mww / # ls /etc/kube-flannel/ cni-conf.json net-conf.json 默认配置 vxlan 是 Flannel 自动改为1500 # cat /run/flannel/subnet.env FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU
安装的过程非常简单,主要分为两步: 第一步安装flannel yum install flannel 或者通过kubernetes的daemonset方式启动,配置flannel用的etcd地址 第二步配置集群网络 flannel如何修改docker0网段呢? 最后通过WriteSubnetFile写本地子网文件, # cat /run/flannel/subnet.env FLANNEL_NETWORK=10.254.0.0/16 FLANNEL_SUBNET =10.254.44.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true 通过这个文件设定docker的网络。 当然flannel启动后还需要持续的watch etcd里面的数据,这是当有新的flannel节点加入,或者变更的时候,其他flannel节点能够动态更新的那三张表。
异常现象 生产环境 三台服务器安装服务如下: 主机 服务 node01 docker、etcd、flannel node02 docker、etcd、flannel node03 docker、etcd 、flannel 三台服务器是一个etcd集群,然后基于flannel网络搭建的docker; 部署的服务node01上分别由config配置中心、discovery注册中心、gateway网关,剩下的服务都是基于前三个状态正常的情况下下才可以 systemctl stop firewalld && setenforce 0 flannel通过systemctl方式是可以正常启动,但是通过查看状态可以看到报错 systemctl status flanneld 报错内容大概:连接不到X.X.X.X:2379那就是flannel连接不到etcd 连接出现异常 etcd是开机自启动的,然后需要启动flannel,接着启动docker但是没有效果!
flannel项目地址:https://github.com/coreos/flannel flannel架构介绍 flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口 -o flannel.tar.gz # mkdir -p /opt/flannel # tar xzf flannel.tar.gz -C /opt/flannel 解压后主要有flanneld、mk-docker-opts.sh 配置flannel 由于flannel需要依赖etcd来保证集群IP分配不冲突的问题,所以首先要在etcd中设置 flannel节点所使用的IP段。 启动flannel服务 $ systemctl start flanneld flannel启动过程解析 flannel服务需要先于Docker启动。 查看flannel分配的网络参数 $ cat /run/flannel/subnet.env FLANNEL_NETWORK=10.0.0.0/16 FLANNEL_SUBNET=10.0.2.1/24
异常现象 生产环境 三台服务器安装服务如下: 主机 服务 node01 docker、etcd、flannel node02 docker、etcd、flannel node03 docker、etcd 、flannel 三台服务器是一个etcd集群,然后基于flannel网络搭建的docker; 部署的服务node01上分别由config配置中心、discovery注册中心、gateway网关,剩下的服务都是基于前三个状态正常的情况下下才可以 systemctl stop firewalld && setenforce 0 flannel通过systemctl方式是可以正常启动,但是通过查看状态可以看到报错 systemctl status flanneld 报错内容大概:连接不到X.X.X.X:2379那就是flannel连接不到etcd 连接出现异常 etcd是开机自启动的,然后需要启动flannel,接着启动docker但是没有效果!
flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。 这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。 3)为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡? flannel的key(这个只在安装了etcd的机器上操作) Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置('/atomic.io/ 这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复。
Flannel是一个专为kubernetes定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。 首先,flannel利用Kubernetes API或者etcd用于存储整个集群的网络配置,其中最主要的内容为设置集群的网络地址空间。 二、Flannel Network 实现原理 Flannel为每个主机提供独立的子网,整个集群的网络信息存储在etcd上。对于跨主机的转发,目标容器的IP地址,需要从etcd获取。 进程监听8285端口,负责解封包 解封装的数据包将转发到虚拟 NIC Flannel0 Flannel0查询路由表,解封包,并将数据包发送到Docker0 Docker0确定目标容器并发送包到目标容器 在常用的vxlan模式中,涉及到上面步骤提到的封包和拆包,这也是Flannel网络传输效率相对低的原因。
一 Flannel组件 1.1 flannel介绍 Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平网络空间中。 如Flannel、Open vSwitch、直接路由和Calico。 Flannel之所以可以搭建Kubernetes依赖的底层网络,是因为它能实现以下两点。 flannel架构图: ? 如上图所示,Flannel首先创建了一个名为flannel0的网桥,而且这个网桥的一端连接docker0网桥,另一端连接一个叫作flanneld的服务进程。 而且在Flannel分配好地址段后,其余操作由Docker完成的,Flannel通过修改Docker的启动参数将分配给它的地址段传递进去: --bip=172.17.18.1/24 通过如上方式,Flannel 提示:更多flannel实现和部署参考:《008.Docker Flannel+Etcd分布式网络部署》。
异常现象 生产环境 三台服务器安装服务如下: 主机 服务 node01 docker、etcd、flannel node02 docker、etcd、flannel node03 docker、etcd 、flannel 三台服务器是一个etcd集群,然后基于flannel网络搭建的docker; 部署的服务node01上分别由config配置中心、discovery注册中心、gateway网关,剩下的服务都是基于前三个状态正常的情况下下才可以 systemctl stop firewalld && setenforce 0 flannel通过systemctl方式是可以正常启动,但是通过查看状态可以看到报错 systemctl status flanneld 报错内容大概:连接不到X.X.X.X:2379那就是flannel连接不到etcd 连接出现异常 etcd是开机自启动的,然后需要启动flannel,接着启动docker但是没有效果!