kuryr共享网络

在上一篇分享中,提到共享网络需要在10.8.65.8010.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.8010.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_test10.8.65.8010.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. 工作流设计参考(包括PHP实现)

    工作流很少有让人满意的,即便是国内用的比较多的jbpm,用起来也会觉得很便扭.再加上PHP中没有什么好用的工作流,于是干脆自己设计一个,设计的原则如下: 1 根据80/20原则,只使用wfmc模型中最 ...

  2. PHP 8: PHP的运算符

    原文:PHP 8: PHP的运算符 本章将介绍PHP的运算符.运算符这个问题在每种语言里都有,因为我们已经熟悉了编程语言里的一种或是多种,所以只需要了解一下就行了.概括一下吧.PHP运算符有很多种,看 ...

  3. 快速构建Windows 8风格应用19-基础控件II

    原文:快速构建Windows 8风格应用19-基础控件II 本篇博文接着上篇博文<快速构建Windows 8风格应用18-基础控件I>介绍开发Windows 8风格应用中常用控件. Sli ...

  4. Linux Telnet安装配置

    本文以红帽6.2 64位版本为例,其它linux类似: linux默认是使用SSH服务的 而不安装telnet服务 ,所以需要手动安装telnet. 1.telnet的安装包有两个,分别是: teln ...

  5. JSP中获取jstl中的数据

    我们在编程JSP时,有时会须要訪问jstl中的数据,或者说是el表达式中的数据. 比方, <c:forEach    varStatus="data1" var=" ...

  6. 开始Unity3D参观考察

    前言:这个系列的文章纯属对自己学习的整理,非高手之作. 但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程.争取每周整理一次吧. 之所以会開始学Unity3D,最基本的原因是由于在快放暑假 ...

  7. 在希望的田野上--生物柴油(Biodiesel)光明的未来

    请看下图: 这是科学家Bernie Tao教授给美国Purdue大学的学生们出的题目"有关大豆.谷物产品的创新竞赛",实质上,就是鼓舞研究.开发及应用生物柴油(Biodiesel) ...

  8. css @media认识

    css2的@media css2里面尽管支持@media属性.可是能实现的功能比較少,一般仅仅用做打印的时候做特殊定义的CSS. 语法: @media sMedia { sRules } 说明: sM ...

  9. Linux环境下搭建php开发环境的操作步骤

    本文主要记载了通过编译方式进行软件/开发环境的安装过程,其他安装方式忽略! 文章背景: 因为php和Apache等采用编译安装方式进行安装,然而编译安装方式,需要c,c++编译环境, 通过apt方式安 ...

  10. UrlRouting的理解

    UrlRouting的理解 文章内容 根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHand ...