flannel

flannel可以为容器提供网络服务。
其模型为全部的容器使用一个network,然后在每个host上从network中划分一个子网subnet。
为host上的容器创建网络时,从subnet中划分一个ip给容器。

其采用目前比较流行的no server的方式,即不存在所谓的控制节点,而是每个host上的flanneld从一个etcd中获取相关数据,然后声明自己的子网网段,并记录在etcd中。

其他的host对数据转发时,从etcd中查询到该子网所在的host的ip,然后将数据发往对应host上的flanneld,交由其进行转发。

根据kubernetes的模型,即为每个pod提供一个ip。flannel的模型正好与之契合。因此flannel是最简单易用的kubernetes集群网络方案。

flannel与docker的结合

flannel的工作原理这里不重复赘述。网上有很多资料。本文主要讲一下flannel是怎么与docker结合起来的。

flannel服务启动

flannel服务需要先于docker启动。flannel服务启动时主要做了以下几步的工作:

  • 从etcd中获取network的配置信息
  • 划分subnet,并在etcd中进行注册
  • 将子网信息记录到/run/flannel/subnet.env
[root@localhost run]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=4.0.0.0/16
FLANNEL_SUBNET=4.0.34.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
  • 之后将会有一个脚本将subnet.env转写成一个docker的环境变量文件/run/flannel/docker
[root@localhost run]# cat /run/flannel/docker
DOCKER_OPT_BIP="--bip=4.0.34.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=4.0.34.1/24 --ip-masq=true --mtu=1472 "

docker服务启动

接下来,docker daemon启动,使用/run/flannel/docker中的变量,作为启动参数,启动后的进程如下

[root@localhost ~]# ps -fe|grep docker
root      4538  4536  0 Jul20 ?        00:08:04 /usr/bin/docker-current daemon --exec-opt native.cgroupdriver=systemd --selinux-enabled --log-driver=journald --bip=4.0.100.1/24 --ip-masq=true --mtu=1472

容器启动

容器之后的启动,就是由docker daemon负责了。因为配置了bip,因此创建出来的容器会使用该网段的ip,并赋给容器。即容器其实还是按照bridge的模式,进行创建的。

flannel与docker结合原理

现在问题来了,容器之间是怎么互通的呢?这里先要说道flanneld,他会在宿主机host上创建一个flannel0的设备。

[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 08:00:27:b7:7e:f3 brd ff:ff:ff:ff:ff:ffinet 10.8.65.66/24 brd 10.8.65.255 scope global dynamic enp0s3valid_lft 67134sec preferred_lft 67134secinet6 fe80::a00:27ff:feb7:7ef3/64 scope link valid_lft forever preferred_lft forever
5: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500link/none inet 4.0.100.0/16 scope global flannel0valid_lft forever preferred_lft forever
6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP link/ether 02:42:2e:5e:cd:90 brd ff:ff:ff:ff:ff:ffinet 4.0.100.1/24 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:2eff:fe5e:cd90/64 scope link valid_lft forever preferred_lft forever

接下来我们在看宿主机host上的路由信息。

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.8.65.1       0.0.0.0         UG    100    0        0 enp0s3
4.0.0.0         0.0.0.0         255.255.0.0     U     0      0        0 flannel0
4.0.100.0       0.0.0.0         255.255.255.0   U     0      0        0 docker0
10.8.64.10      10.8.65.1       255.255.255.255 UGH   100    0        0 enp0s3
10.8.65.0       0.0.0.0         255.255.255.0   U     100    0        0 enp0s3

现在有三个容器分别是A/B/C

容器 ip
A 4.0.100.3
B 4.0.100.5
C 4.0.32.3

当容器A发送到同一个subnet的容器B时,因为二者处于同一个子网,所以容器A/B位于同一个宿主机host上,而容器A/B也均桥接在docker0上。

[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02422e5ecd90   no      veth2d1c803veth916067e

借助于网桥docker0,容器A/B即可实现通信。

那么位于不同宿主机的容器A和C如何通信呢?这个时候就要用到了flannel0这个设备了。
容器A想要发送给容器C,查路由表,可以知道需要使用flannel0接口,因此将数据发送到flannel0。
flanneld进程接收到flannel0接收的数据,然后从etcd中查询出4.0.32.0/24的子网的宿主机host的ip10.8.65.53

[root@localhost calico]# etcdctl get /coreos.com/network/subnets/4.0.32.0-24
{"PublicIP":"10.8.65.53"}

然后将数据封包,发送到10.8.65.53的对应端口,由10.8.65.53的flanneld接收,解包,并转发到对应的容器中。

转载于:https://www.cnblogs.com/xuxinkun/p/5696031.html

浅析flannel与docker结合的机制和原理相关推荐

  1. 一次Flannel和Docker网络不通定位问题

    一次Flannel和Docker网络不通定位问题  查看路由表的配置 路由表情况 [root@k8s-master ~]# route -n Kernel IP routing table Desti ...

  2. 深入理解docker的link机制

    什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编 ...

  3. redis 哨兵_Redis哨兵机制的原理介绍

    php中文网最新课程 每日17点准时技术干货分享 本篇文章给大家带来的内容是介绍Redis的哨兵机制,让大家了解哨兵机制的原理和如何实现.有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. ...

  4. Java序列化的机制和原理

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...

  5. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码

    提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...

  6. Android 为什么要有handler机制?handler机制的原理

    为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...

  7. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  8. java序列化算法透析_Java序列化机制与原理的深入分析

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  9. php底层运行机制与原理

    php底层运行机制与原理 1 PHP的设计理念及特点 多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,时代发展,PHP也早已支持多线程模型. ...

最新文章

  1. Objective-C Autorelease Pool 的实现原理[转]
  2. spring 托管bean_在非托管对象中使用Spring托管Bean
  3. 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
  4. Matlab最短路学习
  5. 绕过安卓SSL验证证书的四种方式
  6. 过年(2015)读书笔记
  7. 15.5.2 【Task实现细节】骨架方法的结构
  8. Leet Code OJ 237. Delete Node in a Linked List [Difficulty: Easy]
  9. 阿里巴巴大数据实践—阿里巴巴的数据模型实践综述
  10. generator.xml mysql_Mybatis 使用generator.xml生成实体及mapper
  11. 亲密关系-【有效表达】-如何完善自己的表达思路?
  12. python机器学习库keras——CNN卷积神经网络识别手写体
  13. 告诉你一个真实的全球化
  14. java 汉字占几个字节_Java中一个汉字占用几个字节
  15. 职高计算机专业c语言_C语言程序设计(全国高职高专计算机系列精品教材)
  16. 【蓝桥杯2015Java】奇妙的数字、打印大叉
  17. html5测试苹果7plus,苹果7 Plus评测:P3广色域屏幕测试
  18. 【CTF练习平台】BugkuCTF部分misc writeup
  19. uniapp ios打包详细步骤
  20. 3个老鼠确定8个瓶子哪瓶有毒

热门文章

  1. centerOS各种问题(Xshell链接不上虚拟机)
  2. html color 在线,HTML颜色一览(color)
  3. xpath的使用(新手必看)
  4. 实现铃声声音渐强或减弱
  5. i7 10700k核显性能 i710700k核显相当于什么显卡
  6. 简单两步 vscode连接雷电模拟器
  7. 三星RC420-S09笔记本电脑拆机
  8. 唯品会API开发系列:item_search-按关键字搜索vip商品API 返回值说明
  9. 详解MPO预端接光纤跳线,看这篇文章就够了
  10. (4)Python实现npy转jpg