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作为存储后端。

  1. 在10.8.65.79上搭建etcd,client连接端口为2379。
  2. 分别在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。
  3. kuryr也需要对应的修改。修改/etc/kuryr/kuryr.conf中增加capability_scope = global。
  4. 重新启动kuryr
  5. 重新启动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的更多相关文章

  1. node中的cluster模块开启进程,进程共享数据

    说明:共享数据 var collection = [41, 41, 41, 41] master.js console.log('###---start---###') var cluster = r ...

  2. Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录

    一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要 ...

  3. Docker镜像搭建Linux下samba共享目录

    Samba 是 SMB/CIFS 网络协议的重新实现, 它作为 NFS 的补充使得在 Linux.OS/2.DOS 和 Windows 系统中进行文件共享.打印机共享更容易实现.SMB协议是客户机/服 ...

  4. Docker学习笔记之保存和共享镜像

    0x00 概述 让 Docker 引以为傲的是它能够实现相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用.通过将容器打包成镜像,再利用体积远小于 ...

  5. [Docker] Windows 宿主环境下,共享或上传文件到容器的方法

    需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容 ...

  6. 如何共享数据?- 每天5分钟玩转 Docker 容器技术(41)

    数据共享是 volume 的关键特性,本节我们详细讨论通过 volume 如何在容器与 host 之间,容器与容器之间共享数据. 容器与 host 共享数据 我们有两种类型的 data volume, ...

  7. Docker 创建镜像、修改、上传镜像

    Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Do ...

  8. calico在docker上的部署及验证

    1. 背景 以下的部署以五台服务器环境为例: 服务器1: hostname为etcdnode1, IP为192.168.56.100 服务器2: hostname为etcdnode2, IP为192. ...

  9. Docker Resources

    Menu Main Resources Books Websites Documents Archives Community Blogs Personal Blogs Videos Related ...

随机推荐

  1. C#框架

    从零开始编写自己的C#框架(1)——前言   记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种 ...

  2. 大约xib连接错误bug正确

    今天code什么时候,发现xib除了加载问题,研究发现的一个问题 在连接的时候, object一定要选择,您连接view,代替 File's Owner 版权声明:本文博客原创文章,博客,未经同意,不 ...

  3. 使用OpenCV玩家营造出一个视频控制(没有声音)

    说明:OpenCV计算机视觉库,所以使用的图像或视频处理,因此,没有任何声音在播放视频的临时 软件:使用OpenCV制播放器(无声音) 功能说明:新建播放窗体.加入进度条能够拖动视频播放. 流程图: ...

  4. JavaEE——Intellij Idea 创建JavaWeb项目

    原文:JavaEE--Intellij Idea 创建JavaWeb项目 折腾Tomcat折腾了两个晚上,第一个晚上怎么都进不了Tomcat的首页,第二个晚上进去了,但是新建的Web项目,在浏览器中运 ...

  5. PhotoShop CC安装抠图插件KnockOut 2

    1.KnockOut 2只有32位版本,因此需要给32位的PhotoShop CC安装. 2.下载地址:http://www.cr173.com/soft/28207.html 3.安装KnockOu ...

  6. Cocos2d-x在Android在竖屏切换

    在Cocos2d-x在,屏幕类型的默认设置是横屏,当我们需要切换到肖像,能够在项目目录打开proj.android目录.找到AndroidManifest.xml文件,直接打开,然后就可以看到里面:s ...

  7. Http Pipeline详细分析(下)

    Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...

  8. Coded UI Test对Webpage进行自动化测试

    如何使用Coded UI Test对Webpage进行自动化测试   在Visual Studio中,Coded UI Test已经不是什么新特性了,较早版本的Visual Studio中就已经有这个 ...

  9. 看精通SQL SERVER2008有感1

    SQLserver数据库中的其他数据库作用: Master:存储SQLserver所有的全局配置,也就是存储SQLserver所知道的关于自己的全部信息,包括自身的配置,和当前的状态,这些数据存储在系 ...

  10. IOS开发小功能1:引导页的开发

    效果图如上,实现的是一个页面引导页,最后跳到主页面,主页面是一个navigationController,但是导航栏给我隐藏了. 文件目录:自己定制的viewcontroller以及navigatio ...