基于Kubeadm的Flannel分析

Flannel概述


Flannel是将多个不同子网(基于主机Node)通过被Flannel维护的Overlay网络拼接成为一张大网来实现互联的,通过官方的一张网络拓扑图我们可以对其基本原理一目了然:

值得探讨的是,flannel的这个overlay网络支持多种后端实现,除上图中的UDP,还有VXLAN和host-gw等。此外,flannel支持通过两种模式来维护隧道端点上FDB的信息,其中一种是通过连接Etcd来实现,另外一种是直接对接K8S,通过K8S添加删除Node来触发更新。

Flannel部署常见问题

1. Node状态显示为“NotReady”

我的K8S环境使用kubeadm来容器化运行K8S的各个组件(除kubelet直接运行在裸机上外),当我使用kubeadm join命令加入新的Minion Node到K8S集群中后,通过kubectl get node会发现所有的node都还是not ready状态,这是因为还没有配置好flannel网络。

2. 使用kube-flannel.yml无法创建DaemonSet

我使用的是K8S的1.6.4的版本,然后按照官方的说明,使用kube-flannel.yml来创建flannel deamon set,结果始终报错。正确的姿势是先使用kube-flannel-rbac.yml来创建flannel的ClusterRole并授权。该yml的主要作用是创建名叫flannel的ClusterRole,然后将该ClusterRole与ServiceAccount(flannel)绑定。接下来,当我们使用kube-flannel.yml来创建flannel daemon set的时候,该daemon set明确指定其Pod的ServiceAccount为flannel,于是通过它启动起来的Pod就具有了flannel ClusterRole中指定的权限。

3.flannel Pod状态为Running,网络不通

我之前在我的Mac Pro上跑了三个VM,为了能够访问公网拉取镜像,我为每个VM分配了一张网卡使用NAT模式,其分配到的IP地址可能重启后发生变化。另外,为了我本机方便管理,我为每台VM又分配了一张网卡使用Host-Only网络模式,每个网卡都有一个固定的IP地址方便SSH。然后,奇怪的事情就这样发生了….

原因在与在kube-flannel.yml中,kube-flannel容器的command被指定为:

command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr"]

可见,其并没有指定使用哪一张网卡作为flanneld对外通信的物理网卡,于是,可能由于机器上面路由配置的差异,导致三台机器并没有一致通过Host-Only网络模式的网卡来打通Overlay网络。遇到这种情况,如果几台机器的配置一致,可以手动修改kube-flannel.yml文件中kube-flannel的command的值,添加参数–iface=ethX,这里的ethX就为我们希望flanneld通信使用的网卡名称。

4.flannel启动异常,显示install-cni错误

这个现象比较坑,遇到这种情况的第一反应就是去查看install-cni容器到底做了什么。我们打开kube-flannel.yml可以看到,该容器的command字段只有简单的一行Shell:

command: [ "/bin/sh", "-c", "set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done" ]

也就是将镜像中做好的cni-conf.json拷贝到cni的netconf目录下。由于容器的/etc/cni/net.d是挂载主机的对应的目录,所以该操作主要目的是为CNI准备flannel环境,便于启动容器的时候正确从netconf目录中加载到flannel,从而使用flannel网络。

我发现进入主机的netconf目录中能够看到10-flannel.conf:

#ls /etc/cni/net.d/10-flannel.conf /etc/cni/net.d/10-flannel.conf
# cat /etc/cni/net.d/10-flannel.conf
cat: /etc/cni/net.d/10-flannel.conf: No such file or directory

无法打出其内容,而且文件显示为红色,说明其内容并没有正确从容器中拷贝过来。

之前我怀疑该异常是因为kubelet所带的文件系统参数为systemd,而docker的文件系统参数为cgroupfs所致,结果发现并非如此。当前能够绕开该异常的workaround为手动进入到主机的netconf目录,创建10-flannel.conf目录,并写入以下数据:

{ "name": "cbr0", "type": "flannel", "delegate": { "isDefaultGateway": true } }

5.flannel网络启动正常,能够创建pod,但是网络不通

出现该现象一般会想到debug,而debug的思路当然是基于官方的那张网络拓扑图。比如在我的机器上,通过参看网卡IP地址有如下信息:

6: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
link/ether 22:a0:ce:3c:bf:1f brd ff:ff:ff:ff:ff:ffinet 10.244.1.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
inet 10.244.2.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
7:cni0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1450 qdisc noqueue state DOWN qlen 1000link/ether 0a:58:0a:f4:01:01 brd ff:ff:ff:ff:ff:ff
inet 10.244.1.1/24 scope global cni0
valid_lft forever preferred_lft forever
inet6 fe80::4cb6:7fff:fedb:2106/64 scope link
valid_lft forever preferred_lft forever

很明显,cni0为10.244.1.1/24网段,说明该主机应该位于10.244.1.0/16子网内;但是我们看flannel.1网卡,确有两个IP地址,分别为于两个不同的”/16”子网。所以,可以肯定的是,我们一定是在该太主机上部署了多次kubeadm,而kubeadm reset并不会清理flannel创建的flannel.1和cni0接口,这就导致环境上遗留下了上一次部署分配到的IP地址。这些IP地址会导致IP地址冲突,子网混乱,网络通信异常。

解决的方法就是每次执行kubeadm reset的时候,手动执行以下命令来清楚对应的残余网卡信息:

ip link del cni0
ip link del flannel.1

K8S如何使用Flannel网络

Flannel打通Overlay网络

当使用kubeadm来部署k8s,网络组件(如flannel)是通过Add-ons的方式来部署的。我们使用这个yml文件来部署的flannel网络。
我截除了关键的一段内容(containers spec):

containers: - name: kube-flannel
image: quay.io/coreos/flannel:v0.7.1-amd64
command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr" ]
securityContext:
privileged: true
env: - name: POD_NAME
valueFrom:
fieldRef:fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:fieldPath: metadata.namespacevolumeMounts: - name: run
mountPath: /run
- name: flannel-cfg
mountPath: /etc/kube-flannel/ - name: install-cni
image: quay.io/coreos/flannel:v0.7.1-amd64command: [ "/bin/sh", "-c", "set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done" ]
volumeMounts: - name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfgmountPath: /etc/kube-flannel/

通过分析该yaml文件可以知道:该pod内有两个container,分别为install-cni和 kube-flannel。

  • install-cni

主要负责将config-map中适用于该flannel的CNI netconf配置拷贝到主机的CNI netconf 路径下,从而使得K8S在创建pod的时候可以遵照标准的CNI流程挂载网卡。

  • kube-flannel

主要启动flanneld,该command中为flanneld的启动指定了两个参数: –ip-masq, –kube-subnet-mgr。第一个参数–ip-masq代表需要为其配置SNAT;第二个参数–kube-subnet-mgr代表其使用kube类型的subnet-manager。该类型有别于使用etcd的local-subnet-mgr类型,使用kube类型后,flannel上各Node的IP子网分配均基于K8S Node的spec.podCIDR属性。可以参考下图的方式来查看(该示例中,k8s为node-1节点分配的podCIDR为:10.244.8.0/24):

#kubectl edit node node-1apiVersion: v1
kind: Node ...
name: dev-1
resourceVersion: "2452057"
selfLink: /api/v1/nodesdev-1
uid: 31f6e4c3-57b6-11e7-a0a5-00163e122a49
spec:externalID: dev-1
podCIDR: 10.244.8.0/24

另外,flannel的subnet-manager通过监测K8S的node变化来维护了一张路由表,这张表里面描述了要到达某个Pod子网需要先到达哪个EndPoint。

CNI挂载容器到隧道端点

如果说flannel为Pod打通了一张跨node的大网,那么CNI就是将各个终端Pod挂载到这张大网上的安装工人。

在刚部署好flannel网络并未在该Node上启动任何Pod时,通过ip link我们只能够看到flannel.1这张网卡,却无法看到cni0。难道是flannel网络运行异常吗?我们接下来就来分析flannel的CNI实现原理,就知道答案了。

通过传统方式来部署flannel都需要通过脚本来修改dockerd的参数,从而使得通过docker创建的容器能够挂载到指定的网桥上。但是flannel的CNI实现并没有采用这种方式。通过分析CNI代码,

我们可以了解flannel CNI的流程:

  • 读取netconf配置文件,并加载/run/flannel/subnet.env环境变量信息。
  • 基于加载的信息,生成适用于其delegate的ipam和CNI bridge的netconf文件;其中指定ipam使用host-local,CNI bridge type为bridge。
  • 调用deletgate(CNI bridge type)对应的二进制文件来挂载容器到网桥上。

这里的环境变量文件/run/flannel/subnet.env是由flanneld生成的,里面包含了该主机所能够使用的IP子网网段,具体内容如下:

# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.8.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

这些数据生成ipam的配置文件的依据,另外,flannel CNI插件的代码中,默认指定delegate为bridge:

if !hasKey(n.Delegate, "type") {n.Delegate["type"] = "bridge" }

所以,当flannel CNI插件调用delegate,本质上就是调用bridge CNI插件来将容器挂载到网桥上。分析bridge CNI 插件的过程我们可以看到其指定了默认网桥名称为cni0:

const defaultBrName = "cni0"func loadNetConf(bytes []byte) (*NetConf, error) {
n := &NetConf{ BrName: defaultBrName, } ... return n, nil }

因此,现在我们可以将整个流程连起来了:flannel CNI插件首先读取netconf配置和subnet.env信息,生成适用于bridge CNI插件的netconf文件和ipam(host-local)配置,并设置其delegate为bridge CNI插件。然后调用走bridge CNI插件挂载容器到bridge的流程。由于各个Pod的IP地址分配是基于host-local的Ipam,因此整个流程完全是分布式的,不会对API-Server造成太大的负担。

本文转自中文社区-基于Kubeadm的Flannel分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sensor的skipping and binning 模式

1、第一种理解 关于sensor的缩放存在两种模式 binning mode 和skip mode skipping mode 就是把想要的数据采集上来 把其余的数据扔掉 如下所示 column skip 2 row skip 2 留下的就是白色的像素 黑色的像素丢掉。 binning mode 就是把相邻的像素合成一个像素&#xff0c;然后再…

治安卡口摄像机与电警抓拍机之间有什么区别?

接下来小编和大家说说它们有哪些相同和不同的地方&#xff0c;供大家参考。 治安卡口&#xff1a; 卡口摄像机主要是用于城市道路或高速公路出入口、收费站等重点治安监控地段的全天候实时检测与记录收费站、交通或治安检查站等地点。 治安卡口监控系统的前端部分主要由三个单元…

高亮显示QSS文件

转【作者&#xff1a;一去丶二三里 博客地址&#xff1a;http://blog.csdn.net/liang19890820】 简述 语法高亮是文本编辑器用来显示文本的&#xff0c;特别是源代码&#xff0c;根据不同的类别来用不同的颜色和字体显示。这个功能有助于编写结构化的语言&#xff0c;例如&…

智能识别技术对电子警察设备的影响

电子警察是目前交通管理部门用的最多的一种监控管理系统。这类系统与传统安防的监控设备有很大区别&#xff0c;原先的系统只能抓拍车辆图片&#xff0c;准确率又低所以被交通管理部门慢慢的淘汰了&#xff0c;同业兴创这款最新的设备系统&#xff0c;有它一个很优质的特点就是…

交通治安卡口监控系统解决方案

随着社会经济发展、城镇建设速度的加快&#xff0c;流动人口不断增加&#xff0c;城市中人口密度逐渐加大&#xff0c;给城市治安监管带来很大的压力。因此采用高清网络摄像监控系统以科技手段提高执法监督效率&#xff0c;成为有力推进“和谐社会”构建的最有力办法。 同业兴创…

细说shiro之三:在独立应用中使用shiro

官网&#xff1a;https://shiro.apache.org/ 1. 下载在非Web环境的独立应用中使用Shiro时&#xff0c;只需要shiro-core组件。在Maven项目中的依赖配置如下&#xff1a; <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</a…

2、C#基础 - Visual Studio 的版本选择和下载

有句话说&#xff1a;工欲善其事&#xff0c;必先利其器&#xff0c;我不推荐在学习一个语言时使用记事本练习&#xff0c;甚至说相当的排斥。当然了&#xff0c;你也可以选择你自己喜欢的方式。本系列推荐使用的IDE为vs2017 community版&#xff0c;银子不够的同志不用怕&…

红外摄像机的原理及选择

一、红外基本原理介绍 光是一种电磁波&#xff0c;它的波长区间从几个纳米&#xff08;1nm10-9m&#xff0c;十亿分之一米&#xff09;到 1 毫米&#xff08;mm&#xff09;左右。人眼可见的只是其中一部分&#xff0c;我们称其为可见光&#xff0c;可见光的波长范围为 380nm …

P3375 【模板】KMP字符串匹配

题目描述 如题&#xff0c;给出两个字符串s1和s2&#xff0c;其中s2为s1的子串&#xff0c;求出s2在s1中所有出现的位置。 为了减少骗分的情况&#xff0c;接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问&#xff0c;去百度搜[kmp算法]学习一下就知道了。…

php 原生文件下载

1.整个网页的html界面源码下载: xiazai.php <html> <head> <meta charset "utf-8"> <title></title> </head> <body> <form method"post" action"xiazai.php"> <input type"submit&quo…

asp 之 让实体中字段类型为DateTime的字段仅仅显示日期不显示时间

在我们平时的工作开发中。我们一般会遇到这种一个问题&#xff1a;某个实体的某个字段是DateTime类型的&#xff0c;但是我们在界面上仅仅想让它显示日期不显示时间&#xff01;一个订单实体&#xff1a;//订单类public class order{//订单IDpublic int id{get;set;}//物品IDpu…

Linux下配置LVM

1 LVM介绍LVM(Logical Volume Manager)逻辑卷管理&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区&#xff0c;逻辑卷管理器的技术…

激光摄像机的原理及应用

近年来&#xff0c;在安防监控领域&#xff0c;以目前视频监控技术的发展情况&#xff0c;室内监控和白天正常环境下的监控已不是难题&#xff0c;但社会环境的发展日新月异&#xff0c;城市的发展、森林资源的不断流失、大型项目的建设、边防安全的守护等&#xff0c;这些环境…

Object.defineProperty 详解

最近想了解一下Vue是怎么实现数据双向绑定的&#xff0c;了解到是基于Object.definProperty,在此记录一下。 Object.defineProperty  顾名思义&#xff0c;就是给对象定义一个属性&#xff0c;总共有这么几种&#xff1a; value  属性的值writable  是否可改写&#xff0…

相机帧率和曝光时间的关系

文章转载自&#xff1a;http://blog.163.com/pluto_918/blog/static/203853902012111255634175/ 工业相机参数之帧率相关知识详解&#xff1a; 工业相机是机器视觉系统的重要组成部分之一&#xff0c;在机器视觉系统中有着非常重要的作用。工业相机已经被广泛应用于工业生产线…

SlickOne 敏捷开发框架介绍(二) -- 多用户/多租户/SAAS软件基础框架实现

前言&#xff1a;在应用于集团版客户或SAAS平台服务的业务系统中&#xff0c;流程管理系统需要支持多用户组织模型。其中包括角色数据、流程定义数据和流程实例数据的多用户标识绑定。本文旨在全面描述如何基于SlickOne敏捷开发框架实现上述基础服务功能&#xff0c;形成一个完…

工业相机行曝光与全局曝光

工业相机行曝光与全局曝光 逐行曝光&#xff1a; 图1 逐行曝光模式 逐行曝光sensor 实现如图1逐行曝光模式所示。与全局曝光不同&#xff0c;逐行曝光从第一行开始曝光&#xff0c;一个行周期之后第二行才开始曝光。依次类推&#xff0c;经过N-1 行后第N 行开始曝光。第一行曝光…

【Alpha阶段汇总】成果展示与体验总结

一、燃尽图 二、软件截图 三、代码与图片、音乐素材仓库 git仓库 四、问题与总结 1.git提交问题 之前创建的仓库地址是http://git.oschina.net/8265559926/groupnet14 但是无论怎么输入都说找不到仓库 经反复思考&#xff0c;感觉可能是因为地址不是纯字母的原因。就重新注册了…

JDBC批量操作性能提升

JDBC当使用INSERT INTO....VALUES()语句批量插入的时候&#xff0c;应该使用JDBC的PreparedStatement的批量操作方法&#xff0c;而不是採用一条一条运行的方法。比如&#xff08;来源&#xff1a;http://superjavason.iteye.com/blog/255423&#xff09;&#xff1a;如上图&am…

SVAC 2.0安全系统组成

SVAC2.0标准的一个很主要的特点就是视频安全和加密认证相比SVAC1.0更加规范&#xff0c;在视频安全方面更加重视。 通过信源层面的加密技术&#xff0c;实现端到端视频数据加密&#xff0c;构建更强大、更完整的视频安全体系。基于SVAC 2.0标准研究建立的安全系统&#xff08;…