用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
来解决。无需修改代码。
最新文章
- Android开发学习——动画
- SE_homework1(第一部分)
- python 内置&;&;递归
- IIS7+windows 64位配置注意事项
- css 设置背景图片模糊,内容不模糊
- 遍历collection
- Javascript--练习(包括主界面图片轮播效果)
- JS replace()方法-字符串首字母大写
- Heritrix源码分析(二) 配置文件order.xml介绍(转)
- Collectl基础
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
- android stack error message is Fail to start the plugin
- python类class基础
- PHP使用file_get_contents或curl请求https的域名内容为空或Http 505错误的问题排查方法
- mknod语法
- Spring Boot + JPA 因为 javassist 包出现 NullPointerException 问题的解决
- WEB常用前端开发调试工具介绍
- Javascript 对象继承 原型链继承 对象冒充 call 混合方式
- windows linux hosts文件的配置,开发项目中域名跳转等。
- JAVA对URL的解码【转】