coreos网络管理工具flannel
来源:互联网 发布:永久中立国的意义 知乎 编辑:程序博客网 时间:2024/05/20 16:32
github地址 : https://github.com/coreos/flannel
欢迎加入coreos技术交流社区: http://www.serfdom.cn/
名词解释
覆盖网络: overlay networks,运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和identifiers做映射来资源定位。
原理
每个主机配置一个ip段和子网个数。例如,可以配置一个覆盖网络使用 10.100.0.0/16段,每个主机/24个子网。因此主机a可以接受10.100.5.0/24,主机B可以接受10.100.18.0/24的包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel 使用udp来封装ip数据报,转发到远程主机。选择UDP作为转发协议是因为他能穿透防火墙。例如,AWS Classic无法转发IPoIP or GRE 网络包,是因为它的安全组仅仅支持TCP/UDP/ICMP。
下图解释了数据报通过覆盖网络转发的路线:
技术细节
flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它,例如,假设etcd已经有如下配置信息:
Overlay network range: 10.100.0.0/16Size of subnet for each host: /24
当前已经注册的子网信息放在/coreos.com/network/subnets
:
10.100.5.0-2410.100.13.0-2410.100.17.0-2410.100.18.0-24
那么下一次分配,可能随机选择 10.100.15.0/24 ,并且将其格式化为“10.100.15.0-24”,在etcd创建这个key。如果成功创建,那么就获得一个子网的租约,有效期为24小时。如果创建失败,重试。在租约过期前一个小时,flannel 会尝试去续租。
etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets
下面所有元素的变化信息,并且根据他来维护一个路由表。为了提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。
测试
安装
sudo apt-get install linux-libc-devgit clone https://github.com/coreos/flannel.gitcd flannel; ./build
配置
./etcdctl mk /coreos.com/network/config '{"Network":"172.17.42.0/24"}'
启动docker
core@ubuntu: sudo source /run/flannel/subnet.envcore@ubuntu: sudo ip link del docker0 #如果没有docker0就不需要这个步骤core@ubuntu: sudo docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}core@ubuntu:~$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth110.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth010.0.3.0 0.0.0.0 255.255.255.0 U 0 0 0 lxcbr010.0.27.0 0.0.0.0 255.255.255.0 U 0 0 0 flannel010.0.27.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
看到了路由表里面已有flannel0。
测试
首先启动2个container,
docker run -t -i --name=peer 192.168.1.130:5000/ubuntu:latesteth0 Link encap:Ethernet HWaddr 02:42:0a:00:1b:05 inet addr:10.0.27.5 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::42:aff:fe00:1b05/64 Scope:Link UP BROADCAST RUNNING MTU:1472 Metric:1 RX packets:21 errors:0 dropped:0 overruns:0 frame:0 TX packets:16 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1618 (1.6 KB) TX bytes:1096 (1.0 KB)
docker run -t -i --name=current 192.168.1.130:5000/ubuntu:latestroot@1b8d4381a351:/# ifconfig eth0eth0 Link encap:Ethernet HWaddr 02:42:0a:00:1b:06 inet addr:10.0.27.6 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::42:aff:fe00:1b06/64 Scope:Link UP BROADCAST RUNNING MTU:1472 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:13 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1096 (1.0 KB) TX bytes:970 (970.0 B)root@1b8d4381a351:/# ping 10.0.27.5PING 10.0.27.5 (10.0.27.5) 56(84) bytes of data.64 bytes from 10.0.27.5: icmp_seq=1 ttl=64 time=0.100 ms64 bytes from 10.0.27.5: icmp_seq=2 ttl=64 time=0.092 ms64 bytes from 10.0.27.5: icmp_seq=3 ttl=64 time=0.143 ms
看到2个container之间已经可以互相连接。
构建自己的naming service (资源定位)
kubernetets里面使用label和label selector实现了不同维度的资源定位。在vip(虚拟IP)来对外暴露统一的服务入口。这种思路非常值得借鉴。 因此,建议大家用这种思路来解决固定ip等问题。
性能
为了测试flannel 带来了多少的性能损失,我们分别在 AWS m3.medium VM上,对时延和带宽做了性能测试。使用的是qperf工具进行的测量,数据如下:
结论是: flannel 带来了不少的时延,但是对带宽几乎没有影响。
未来的方向
flannel 处于开发初期,正在考虑进入生产环境。除了当前功能的稳定性之外,未来计划包括支持更多协议例如IPSEC的支持。进一步,即使每个主机都可以支持分配一个可以路由的子网,我们还是会扩展flannel 跨集群的子网分配。
参考:
1,Introducing flannel: An etcd backed overlay network for containers
2, flannel介绍ppt
- coreos网络管理工具flannel
- Docker学习笔记 — Coreos/Flannel
- [docker]网络-flannel
- kubernetes1.6 +flannel 网络安装
- flannel
- coreos集群搭建,以及flannel服务安装和mpi应用测试
- 理解Kubernetes网络之Flannel网络
- flannel配置kubernetes网络互通实验
- Docker 配置Flannel网络过程及原理
- calico网络原理及与flannel对比
- Docker之Flannel管理网络-yellowcong
- 网络管理工具
- Docker 网络(十二)——Flannel for Docker
- CoreOS容器管理工具协助用户快速部署复杂的OpenStack云平台
- 网络管理工具Scotty简介。
- 26款开源网络管理工具
- linux 网络管理工具
- Android网络管理工具类
- JZ2440开发板学习------中级(二十六:上)
- c++的工程文件的编译顺序
- 解决wp的插件all-in-one-seo-pack被百度收录失败的问题
- Java Web中的编码问题(一)
- 各种排序算法、java实现
- coreos网络管理工具flannel
- Android AIDL使用详解
- godot 中创建一个新项目
- 嵌入式实时操作系统μC/OS-II在STM32处理器移植
- 指针函数和函数指针
- 为了我们的明天,加油!IT男
- 【将金令】一篇被击破了12万次的非农教科书!
- I0Itec-zkClient --- Kafka中使用的Zookeeper客户端
- android.os.NetworkOnMainThreadException异常