18、《每天5分钟玩转Docker容器技术》学习--Overlay Network
------------------------------------重要说明------------------------------------本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
https://blog.运维网.com/cloudman
------------------------------------重要说明------------------------------------
为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络。VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 VLAN 相同的以太网二层服务,但是拥有更强的扩展性和灵活性。
Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。
Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。
https://s1.运维网.com/images/20180412/1523522750403891.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523522756751981.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
a) 实验环境描述
在 docker 主机 docker02(192.168.56.130)和 docker03(192.168.56.128)上实践各种跨主机网络方案,在 192.168.56.129 上部署支持的组件,比如 Consul。
l 【consul】【Docker machine】(Ubuntu01) 192.168.56.129
https://s1.运维网.com/images/20180412/1523522766150914.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
l Docker host(Ubuntu02) 192.168.56.130
https://s1.运维网.com/images/20180412/1523522774211150.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
l Docker host(Ubuntu03) 192.168.56.128
https://s1.运维网.com/images/20180412/1523522785342108.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
b) Overlay环境搭建
Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。
https://s1.运维网.com/images/20180412/1523522800807848.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523522809715366.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
最简单的方式是以容器方式运行 Consul:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
https://s1.运维网.com/images/20180412/1523522821306518.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
容器启动后,可以通过 http://192.168.56.129:8500 访问 Consul。
https://s1.运维网.com/images/20180412/1523522831322833.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
修改 docker02 和 docker03 的 docker daemon 的配置文件,将docker02和docker03注册到consul数据库中
vim /etc/systemd/system/docker.service.d/10-machine.conf
https://s1.运维网.com/images/20180412/1523522840648513.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
--cluster-store=consul://192.168.56.129:8500指定 consul 的地址
--cluster-advertise=ens33:2376 告知 consul 需要连接的地址
重启 docker daemon
systemctl daemon-reload
systemctl restart docker
https://s1.运维网.com/images/20180412/1523522892798964.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
docker02 和 docker03 将自动注册到 Consul 数据库中
刷新网页
https://s1.运维网.com/images/20180412/1523522902627055.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523522920719957.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523522935390454.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
c) 创建Overlay网络
在 docker02 中创建 overlay 网络 ov_net1:
docker network ls
https://s1.运维网.com/images/20180412/1523522946621363.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
docker network create -d overlay ov_net1
https://s1.运维网.com/images/20180412/1523522957273850.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
注意到 ov_net1 的 SCOPE 为 global,而其他网络为 local。在 docker03 上查看存在的网络:
https://s1.运维网.com/images/20180412/1523523907519082.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
docker03 上也能看到 ov_net1。这是因为创建 ov_net1 时 docker02 将 overlay 网络信息存入了 consul,docker03 从 consul 读取到了新网络的数据。之后 ov_net 的任何变化都会同步到 docker02 和 docker03。
docker network inspect 查看 ov_net1 的详细信息:
https://s1.运维网.com/images/20180412/1523523918695192.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
IPAM 是指 IP Address Management,docker 自动为 ov_net1 分配的 IP 空间为 10.0.0.0/24。
运行一个 busybox 容器并连接到 ov_net1:
首先记录当前host的网络
https://s1.运维网.com/images/20180412/1523523944745730.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
docker run -itd --name bbox1 --network ov_net1 busybox
https://s1.运维网.com/images/20180412/1523523954667416.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
查看容器的网络配置:
https://s1.运维网.com/images/20180412/1523523969655510.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
bbox1 有两个网络接口 eth0 和 eth1。eth0 IP 为 10.0.0.2,连接的是 overlay 网络 ov_net1。eth1 IP 172.18.0.2,容器的默认路由是走 eth1,eth1 是哪儿来的呢?
查看docker中的网络情况
https://s1.运维网.com/images/20180412/1523523981358124.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
查看host的网络情况
https://s1.运维网.com/images/20180412/1523523991194019.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
实验之前并没有docker_gwbridge这个bridge,并且这个bridge有一个interfaces:veth2bd2e8e接口,查看此接口
https://s1.运维网.com/images/20180412/1523524001141762.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
其实,docker 会创建两个网络:bridge网络和VxLAN网络。
其中 bridge 网络为 “docker_gwbridge”,作用是为容器提供访问外网的能力;
container中的eth1口连接到veth2bd2e8e连接到“docker_gwbridge,为所有连接到 overlay 网络的容器提供访问外网的能力。
查看“docker_gwbridge”网络信息
docker network inspect docker_gwbridge
https://s1.运维网.com/images/20180412/1523524026853597.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
从 docker network inspect docker_gwbridge 输出可确认 docker_gwbridge 的 IP 地址范围是 172.18.0.0/16,当前连接的容器就是 bbox1(172.18.0.2)。
而且此网络的网关就是网桥 docker_gwbridge 的 IP 172.18.0.1。
https://s1.运维网.com/images/20180412/1523524041867754.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
这样容器 bbox1 就可以通过 docker_gwbridge 访问外网。
https://s1.运维网.com/images/20180412/1523524051407921.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
如果外网要访问容器,可通过主机端口映射,比如:
docker run -p 80:80 -d --net ov_net1 --name web1 httpd
d) overlay 如何实现跨主机通信?
在 docker03 中运行容器 bbox2:
https://s1.运维网.com/images/20180412/1523524064366887.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524072653595.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524078741991.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
bbox2 IP 为 10.0.0.3,可以直接 ping bbox1:
可见 overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务。
e) overlay 网络具体实现
查看 overlay 网络的 namespace 可以在 host1 和 host2 上执行 ip netns(请确保在此之前执行过 ln -s /var/run/docker/netns /var/run/netns)
https://s1.运维网.com/images/20180412/1523524090788188.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524109715506.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
可以看到两个 host 上有一个相同的 namespace “1-fc5db23ef3”
这就是 ov_net1 的 namespace,查看 namespace 中的 br0 上的设备。
ip netns exec 1-fc5db23ef3brctl show
https://s1.运维网.com/images/20180412/1523524119682833.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524125646046.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
查看 vxlan1 设备的具体配置信息可知此 overlay 使用的 VNI(VxLAN ID)为 256
ip netns exec 1-fc5db23ef3ip -d l show vxlan1
https://s1.运维网.com/images/20180412/1523524136693009.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524142133439.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524147925905.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
具体实现如下:
docker 会为每个 overlay 网络创建一个独立的 network namespace,其中会有一个 linux bridge br0,endpoint 还是由 veth pair 实现,一端连接到容器中(即 eth0),另一端连接到 namespace 的 br0 上。
br0 除了连接所有的 endpoint,还会连接一个 vxlan 设备,用于与其他 host 建立 vxlan tunnel。容器之间的数据就是通过这个 tunnel 通信的。逻辑网络拓扑结构如图所示:
https://s1.运维网.com/images/20180412/1523524160605532.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
f) overlay 如何实现隔离的?
不同的 overlay 网络是相互隔离的。我们创建第二个 overlay 网络 ov_net2 并运行容器 bbox3。
https://s1.运维网.com/images/20180412/1523524169633655.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524176542225.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524182519193.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524196703701.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
可以发现没有生成新的docker_gwbridge,共用一个docker_gwbridge,测试下是否可以与网关和外界通讯
https://s1.运维网.com/images/20180412/1523524205441821.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
测试下是否可以与bbox1和bbox2通信
https://s1.运维网.com/images/20180412/1523524225302280.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524236203185.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
如果要实现 bbox3 与 bbox1 通信,可以将 bbox3 也连接到 ov_net1。
https://s1.运维网.com/images/20180412/1523524246960458.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
可见生成了一个新的网卡eth2:10.0.0.4,测试与bbox1和bbox2通讯
https://s1.运维网.com/images/20180412/1523524255906677.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180412/1523524264279268.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
g) overlay IPAM
docker 默认为 overlay 网络分配 24 位掩码的子网(10.0.X.0/24),所有主机共享这个 subnet,容器启动时会顺序从此空间分配 IP。当然我们也可以通过 --subnet 指定 IP 空间。
docker network create -d overlay --subnet 10.22.1.0/24 ov_net3
------------------------------------重要说明------------------------------------
本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
https://blog.运维网.com/cloudman
------------------------------------重要说明------------------------------------
书籍:
1.《每天5分钟玩转Kubernetes》
https://item.jd.com/26225745440.html
2.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
3.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
https://i.imgsafe.org/68/68da21ce15.png
页:
[1]