用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 ...
随机推荐
- Gimp教程:简约手机图标风格
效果: 在一个国外博客上翻到的图标制作教程,效果类似于Cowon J3的默认图标风格. 制作过程很简单,只需两三步,不多说了,上步骤 Step1.新建50×50的黑色背景 Step2.新建 ...
- 来自 Repository 的一丝线索,Domain Model 再重新设计
来自 Repository 的一丝线索,Domain Model 再重新设计 写在前面 阅读目录: 疑惑解读 设计窘境 一幅图的灵感 为嘛还是你-Repository 后记 上一篇<No zuo ...
- Redis简介与简单安装
Redis简介与简单安装 一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...
- NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用
NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.N ...
- 博客加上“Fork me on Github”彩带
给你的博客加上“Fork me on Github”彩带 起 如今,随着Git的大热以及Github的优越性,许多知名开源项目都将源代码托管到Github上了.在Github上不仅可以托管自己的开源项 ...
- C#单元测试工具包:MvcContrib
C#单元测试工具包:MvcContrib http://t.cn/hE67d https://mvccontrib.codeplex.com/documentation MVC Contrib Doc ...
- 今天用C#做的一个小的注册练习
下边是实现的代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Dat ...
- visual studio快捷键总结
熟练操作vs的快捷键,可以有效地提高开发效率,下面将vs 2008与vs 2010的快捷键进行了总结,结果如下表: 注:vs 2010与vs 2008的快捷键基本相同. 编辑: CTRL + M, ...
- 1 MySQL概述
目录: 1. 简述 2. 历史 3. 同类产品 4. 优点和不足 5. MySQL存储引擎 6. MySQL架构 1. 简述 MySQL是一个关系型数据库管理系统.其体积小,速度快,开发源代码,使用成 ...
- 模仿c的字符转整数函数 atoi
#include<stdio.h> , KInvalid}; int g_nStatus = KValid; long StrToIntCore(char *str,bool minus) ...