这个问题,现在慢慢搞定。

把这两者的关系搞清楚了。

还有kubeadm join和手工安装Node的故事,

也没那么玄乎~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

https://www.cnblogs.com/xzkzzz/p/9936467.html
https://segmentfault.com/a/1190000017182169
https://segmentfault.com/a/1190000017182169

Flannel本身是一个框架,真正提供网络功能是他的后端实现。目前支持三种后端实现:

VXLAN
host-gw
UDP

kubernetes是通过一个叫CNI接口维护一个单独网桥来代替docker0,这个网桥CNI网桥,默认叫做cni0.
过程也是和VXLAN是一样的。需要注意的是,CNI网桥只是接管所有CNI插件负责的,既只是kubernetes创建的容器。

kubernetes之所以要设置这样一个与docker0网桥功能一样的CNI网桥,主要原因有两点:

kubernetes项目并没有使用Docker的网络模型,所以它不希望,也不具备配置docker0的能力。
还与kubernetes如何配置Pod,也就是infra容器Network Namespace相关。
我们在部署kubernetes的时候,有一个步骤是安装kubernetes-cni包,他的目的就是宿主机上安装CNI插件所需要的基础可执行文件。

ls /opt/cni/bin/
bridge dhcp flannel host-local ipvlan loopback macvlan portmap ptp sample tuning vlan
CNI的基础可执行文件,按照功能分三类:

Main插件 他是用来创建具体网络设备的二进制文件。例如:birdge(网桥设备)、ipvlan、lookback(lo 设备)、ptp(Veth Pair设备)、macvlan、vlan
IPAM插件 他是负责分配IP地址的二进制文件。例如:dhcp,这个文件会向dhcp服务器发起请求;host-local,则会使用预先配置的IP地址来进行分配。
CNI社区维护的内置CNI插件。例如 flannel,就是专门为Flannel项目提供的CNI插件。
从二进制文件来看,如果实现一个kubernetes用的容器网络方案,其实需要两部分工作,以Flannel下项目为例。

首先实现这个网络本身,其实就是flanneld进程里主要逻辑,例如:创建和配置flannel.1设备,配置宿主机路由、配置ARP和FDB表。
实现该网络方案对应的CNI插件,就是配置infra容器里的网络栈,并把他连接在CNI网桥上。
接下来进行第一步,在宿主机上安装flannel。而这个过程中,flanneld启动后会在每台宿主机上生成他对应的CNI配置文件(就是configmap),从而告诉kubernetes,这个集群要使用Flannel作为容器网络方案。

当kubelet组件需要创建pod时,他一个创建的一定是infra容器,所以这一步,dockershim 就会先调用Docker API创建并启动infra容器,紧着执行一个叫做SetUpPod的方法,这个方法的作用是:为CNI插件准备构建参数,然后调用CNI插件为infra容器配置网络。这里要调用CNI插件是/opt/cni/bin/flannel;而调用它所需的参数,分两部分:

第一部分,是由dockershim设置的一组CNI环境变量。其中,最重要的环境变量参数叫做:CNI_COMMAND。他的取值只有两种ADD和DEL。这个ADD和DEL操作,就是CNI插件唯一实现的两种方法。

ADD 把容器添加CNI网络里
DEL 把容器从CNI网络里移除
在网桥类型的CNI里,这两个操作说明把容器以“Veth Pair”方式插在CNI网桥上,或者从网桥上拔掉。

第二部分,是dockershim从CNI配置文件里加载到的默认插件的配置信息。这个配置信息在CNI中被叫作Network Configuration,dockershim会把Network Configuration 通过JSON数据的方式,通过标准输入的方式传递给Flannel CNI插件。

创建容器网络的流程就是:kubelet ——> flannel ——> flanneld。

工作原理
很容易混淆几个东西。我们通常说的Flannel(coreos/flannel),其实说的是flanneld。大家都知道Kubernetes是通过CNI标准对接网络插件的,但是当你去看Flannel(coreos/flannel)的代码时,并没有发现它实现了CNI的接口。如果你玩过其他CNI插件,你会知道还有一个二进制文件用来供kubele调用,并且会调用后端的网络插件。对于Flannel(coreos/flannel)来说,这个二进制文件是什么呢?git repo在哪里呢?

这个二进制文件就对应宿主机的/etc/cni/net.d/flannel,它的代码地址是https://github.com/containernetworking/plugins,最可恨的它的名字就叫做flannel,为啥不类似contiv netplugin对应的contivk8s一样,取名flannelk8s之类的。

上面的Flannel Pod中还有一个容器叫做install-cni,它对应的脚本在https://github.com/coreos/flannel-cni。

/opt/bin/flanneld --> https://github.com/coreos/flannel
/etc/cni/net.d/flannel --> https://github.com/containernetworking/plugins
/install-cni.sh --> https://github.com/coreos/flannel-cni

flannel for kubernetes
flannel在对kubernets进行支持时,flanneld启动参数中会增加--kube-subnet-mgr参数,flanneld会初始化一个kubernetes client,获取本地node的pod-cidr,这个pod-cidr将会作为flannel为node本地容器规划的ip网段。记录到/run/flannel/subnet.env。(flannel_cni组件会读取这个文件并写入到net-conf.json中,供cni使用)。

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

flanneld,flannel和cni逐步深入的更多相关文章

  1. Kubernetes CNI网络插件

    CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...

  2. kubernetes网络之Flannel

    简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址. 在默认的Dock ...

  3. k8s安装之flannel.yaml

    收藏一下,以后直接从这里cp过来用的. flannel新版 --- apiVersion: extensions/v1beta1 kind: PodSecurityPolicy metadata: n ...

  4. k8s中flannel:镜像下载不了

    重新部署一套K8S集群时,由于K8S需要扁平化的网络,所以当执行下面的 root@master ~]# kubectl apply -f kube-flannel.yml 会开始下载镜像,然后去启动, ...

  5. K8S Flannel网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  6. Docker 网络 Flannel

    flannel 安装 sudo yum install kernel-headers golang gccyum install flannel flannel 配置 在etcd中设置变量 etcdc ...

  7. Flannel配置详解

    1.简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信, Flannel是CoreOS开发,专门用于docker多机 ...

  8. 从CNI到OVN

    kubernetes各版本离线安装包 诸如calico flannel等CNI实现,通过牺牲一些功能让网络复杂度得以大幅度降低是我极其推崇的,在云原生时代应用不再关心基础设施的场景下是一个明智之举,给 ...

  9. Flannel 原理简析及安装

    flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具.它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip:让所有的容器认为大家在同一个直 ...

随机推荐

  1. 修改Linux主机名与IP之间的映射关系

    linux主机版本: Distributor ID: UbuntuDescription: Ubuntu 14.10Release: 14.10 一.修改linux主机名 1.使用hostname命令 ...

  2. 题解-APIO2010 特别行动队

    题目 洛谷 & bzoj 简要题意:给定一个长为\(n\)的序列\(\{s_i\}\)与常数\(a,b,c\),序列的一个连续子段\(s_i\)到\(s_j\)的贡献为\(at^2+bt+c\ ...

  3. SharePoint 2013 SqlException (0x80131904):找不到Windows NT 用户或组xxxx\administrator

    过程描述: 在SharePoint 2013里配置创建搜索服务应用程序时报错: 配置 Search Service 应用程序期间遇到错误. System.Data.SqlClient.SqlExcep ...

  4. 如何确定windows启动类型是bios还是uefi

    原文地址:http://www.kqidong.com/bios/3728.html 如何确定windows启动类型是bios还是uefi?随着装机越来越简单,大家对安装系统充满信心,但是了解到启动类 ...

  5. Mudo C++网络库第七章学习笔记

    muduo编程示例 muduo库是设计来开发内网的网络程序, 它没有做任何安全方面的加强措施, 如果在公网上可能会受到攻击; muduo库把主动关闭连接这件事分成两步来做: 如果主动关闭连接, 会先关 ...

  6. xtrabackup

    mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了.而使 ...

  7. 使用Fiddler进行手机端抓包

    1.手机和电脑在同一局域网 2.在电脑上查看ip地址 3.如果是需要抓取https,则需要在浏览器中输入http://xxx.xxx.x.xxx:8888(第二部查到的ip地址 + Fiddler 的 ...

  8. Callcenter 模块解析

    CallCenter模块详细介绍 一. Callcenter模块说明: 提供了呼叫中心的ACD功能,把客户端通过不同的”方案”和”等级”分配给来电,一个以”评分”为基础的系统是用来分配这些呼入.来电者 ...

  9. PHP中empty,isset,is_null的区别

    isset 判断变量是否已存在 empty 判断变量是否为空或为0 is_null 判断变量是否为NULL 仅作为记录使用. 参考链接:http://www.jb51.net/article/6903 ...

  10. Redis重大版本

    Redis借鉴了Linux操作系统对于版本号的命名规则: 版本号第二位如果是奇数,则为非稳定版本(例如2.7.2.9.3.1),如果是偶数,则为稳定版本(例如2.6.2.8.3.0.3.2), 当前奇 ...