用docker cluster store实现kuryr的共享subnet
kuryr共享网络
在上一篇分享中,提到共享网络需要在10.8.65.80
和10.8.65.81
上分别通过docker network create
来创建网络。而实际上,通过对docker源码的解读,发现其实并不需要在两台宿主机上分别创建,而可以让他们共享network
的信息。这一方式需要通过docker cluster store功能实现。
docker cluster store配置
docker本身有许多的数据需要,在先前的版本中,docker一般将这些数据存储在本地的文件中。在新版本中,docker提供了cluster store的功能。
该功能主要是将docker的部分数据存储在一个一致的kv存储中。
因此docker cluster store需要一个一致的kv存储,可供选择的存储后端包括zk,consul,etcd等。这里使用etcd作为存储后端。
- 在
10.8.65.79
上搭建etcd,client连接端口为2379。 - 分别在
10.8.65.80
和10.8.65.81
上配置docker的启动脚本为/usr/bin/docker daemon -H fd:// -H 0.0.0.0:5555 --cluster-store etcd://10.8.65.79:2379
。 - kuryr也需要对应的修改。修改
/etc/kuryr/kuryr.conf
中增加capability_scope = global
。 - 重新启动kuryr
- 重新启动docker。
实验
本实验目标是实现多个容器共享neutron的subnet。
创建网络
在10.8.65.80
上创建网络
docker network create --driver=kuryr --ipam-driver=kuryr --subnet 10.0.0.0/16 --gateway 10.0.0.1 --ip-range 10.0.0.0/24 -o neutron.net.uuid=a11ce6f4-59aa-4868-8a6e-d86ad06b34b2 kuryr
在10.8.65.80
上查看网络
[root@node1 kuryr]# docker network inspect kuryr
[
{
"Name": "kuryr",
"Id": "1a28609ce7075ff6dd3061ac2e6f97724552c78a8d59c438ac7c97dcd5420ea6",
"Scope": "global",
"Driver": "kuryr",
"EnableIPv6": false,
"IPAM": {
"Driver": "kuryr",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/16",
"IPRange": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Containers": {},
"Options": {
"neutron.net.uuid": "a11ce6f4-59aa-4868-8a6e-d86ad06b34b2"
},
"Labels": {}
}
]
这时候并不需要在10.8.65.81
上创建网络。直接在10.8.65.81
上查看
[root@node2 kuryr]# docker network ls
NETWORK ID NAME DRIVER
42be121377cf bridge bridge
38400993c880 host host
1a28609ce707 kuryr kuryr
df595008f88a none null
就可以看到在10.8.65.80
上创建的网络,在10.8.65.81
上同样可见。在10.8.65.81
上使用docker network inspect kuryr
查看可以得到与10.8.65.80
上相同的结果。
原理分析
在10.8.65.79
上通过查看etcd中存储的数据
[root@master ~]# etcdctl ls /docker/network/v1.0
/docker/network/v1.0/endpoint
/docker/network/v1.0/network
/docker/network/v1.0/endpoint_count
[root@master ~]# etcdctl get /docker/network/v1.0/network/1a28609ce7075ff6dd3061ac2e6f97724552c78a8d59c438ac7c97dcd5420ea6
{"addrSpace":"global_scope","enableIPv6":false,"generic":{"com.docker.network.enable_ipv6":false,"com.docker.network.generic":{"neutron.net.uuid":"a11ce6f4-59aa-4868-8a6e-d86ad06b34b2"}},"id":"1a28609ce7075ff6dd3061ac2e6f97724552c78a8d59c438ac7c97dcd5420ea6","inDelete":false,"internal":false,"ipamOptions":{},"ipamType":"kuryr","ipamV4Config":"[{\"PreferredPool\":\"10.0.0.0/16\",\"SubPool\":\"10.0.0.0/24\",\"Gateway\":\"10.0.0.1\",\"AuxAddresses\":null}]","ipamV4Info":"[{\"IPAMData\":\"{\\\"AddressSpace\\\":\\\"\\\",\\\"Gateway\\\":\\\"10.0.0.1/24\\\",\\\"Pool\\\":\\\"10.0.0.0/24\\\"}\",\"PoolID\":\"9d5d5610-1628-4cb8-bede-1f721e4c32a5\"}]","labels":{},"name":"kuryr","networkType":"kuryr","persist":true,"postIPv6":false,"scope":"global"}
可以看到docker将相关的网络信息存储在了etcd中,不同宿主机上的docker daemon通过访问相同的etcd,达到存储一致的目的。
当然,docker并不是将所有的网络信息都存在了etcd中。docker network inspect kuryr
中可以看到其中"Scope": "global"
,即其范围为global的network
相关数据才会存储在etcd中。
创建容器
使用docker run -it -d --net kuryr --privileged=true index.alauda.cn/xuxinkun/net_test
在10.8.65.80
和10.8.65.81
上分别创建容器。在容器中互ping
可以访问。
这时候在10.8.65.80
上再次查看网络
[root@node1 kuryr]# docker network inspect kuryr
[
{
"Name": "kuryr",
"Id": "1a28609ce7075ff6dd3061ac2e6f97724552c78a8d59c438ac7c97dcd5420ea6",
"Scope": "global",
"Driver": "kuryr",
"EnableIPv6": false,
"IPAM": {
"Driver": "kuryr",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/16",
"IPRange": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Containers": {
"ee273452ce9f5104cb322dfabb85580191a2c12b7f8bff6c8bdcb48a2e6b012b": {
"Name": "cranky_heyrovsky",
"EndpointID": "4bf61eae0f2123876151eefba77ecc73f615bb04658dfd44263482315f523b11",
"MacAddress": "fa:16:3e:3b:88:ff",
"IPv4Address": "10.0.0.11/24",
"IPv6Address": ""
},
"ep-050d727097abd6c66bc75c08dc228e10fe0fa50fdb5ade549fbbbe9f82c68e2e": {
"Name": "boring_cray",
"EndpointID": "050d727097abd6c66bc75c08dc228e10fe0fa50fdb5ade549fbbbe9f82c68e2e",
"MacAddress": "fa:16:3e:e7:5f:16",
"IPv4Address": "10.0.0.12/24",
"IPv6Address": ""
}
},
"Options": {
"neutron.net.uuid": "a11ce6f4-59aa-4868-8a6e-d86ad06b34b2"
},
"Labels": {}
}
]
不仅可以看到本地容器分配的ip(10.0.0.11),还可以看到其他宿主机上分配的ip(10.0.0.12)。
小结
上次分享中所说的reuse networks
的坑,正确的解决方法应该是使用本文的cluster-store
来解决。无需修改代码。
用docker cluster store实现kuryr的共享subnet的更多相关文章
- node中的cluster模块开启进程,进程共享数据
说明:共享数据 var collection = [41, 41, 41, 41] master.js console.log('###---start---###') var cluster = r ...
- Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录
一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要 ...
- Docker镜像搭建Linux下samba共享目录
Samba 是 SMB/CIFS 网络协议的重新实现, 它作为 NFS 的补充使得在 Linux.OS/2.DOS 和 Windows 系统中进行文件共享.打印机共享更容易实现.SMB协议是客户机/服 ...
- Docker学习笔记之保存和共享镜像
0x00 概述 让 Docker 引以为傲的是它能够实现相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用.通过将容器打包成镜像,再利用体积远小于 ...
- [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容 ...
- 如何共享数据?- 每天5分钟玩转 Docker 容器技术(41)
数据共享是 volume 的关键特性,本节我们详细讨论通过 volume 如何在容器与 host 之间,容器与容器之间共享数据. 容器与 host 共享数据 我们有两种类型的 data volume, ...
- Docker 创建镜像、修改、上传镜像
Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Do ...
- calico在docker上的部署及验证
1. 背景 以下的部署以五台服务器环境为例: 服务器1: hostname为etcdnode1, IP为192.168.56.100 服务器2: hostname为etcdnode2, IP为192. ...
- Docker Resources
Menu Main Resources Books Websites Documents Archives Community Blogs Personal Blogs Videos Related ...
随机推荐
- SALT 加密
大家都知道,MD5加密是不可逆.但事实上,我们通常值的MD5算法.黑客的眼下破解率相对较高.也有非常多站点上干脆就提供批量解密MD5的服务,当然是收费的.http://www.xmd5.org.这里提 ...
- QT界面应用程序的语言国际化
对字符串使用tr包含起来,因为tr是QObject的一个静态函数,所以它可以直接调用. 在生成language.ts文件之前应该编辑.pro文件,如下: QT += core gui greaterT ...
- 使用OpenWrt的SDK
原文:http://wiki.openwrt.org/doc/howto/obtain.firmware.sdk 为什么要使用SDK: Reasons for using the SDK are: C ...
- 单极型ADC如何测量负电压?
最常用的方法是使用一个运放做成加法器将负电压抬到0V以上,如果这样的输出超过了最大输出电压那么再使用比例衰减就可以办到了. 参考下面的讨论: http://www.amobbs.com/thread- ...
- Moon.Orm 5.0 (MQL版)
Moon.Orm 5.0 (MQL版) 实战实例Moon.Orm 5.0 革命性的设计 打造最便捷的异步分页技术(提供下载) 摘要: 一.建一个项目(以WebForm为例)配置文件配置(注意您自己的路 ...
- c# in deep 之委托
通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做.使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收.尤其是假如某“短命”的对象调用 ...
- .NET平台技术体系
.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标 一 .NET平台技术体系梳理 .NET平台应用领域众多(桌面开发,web开发,移动开发),不断有新的编程爱好者开始学习或从其他平台转移到 ...
- Visual Studio 2013 发布正式版
SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好? Visual Studio 2013 发布正式版及使用感受 (注意:文末我添加了一个小节,用来更新最新的一些使用感受.) ...
- IOS学习之路二十四(custom 漂亮的UIColor)
下面简单列举一下漂亮的和颜色,大家也可以自己依次试一试选出自己喜欢的. 转载请注明 本文转自:http://blog.csdn.net/wildcatlele/article/details/1235 ...
- IOS学习之路二十二(UIAlertView获得文本框内容及添加北京图片)
今天写项目要用到警告框带输入框的,于是就自己做了个小demo. 效果图大体如下: 下面简单介绍一下UIAlertView alertViewStyle属性有以下三种选项: UIAlertViewSt ...