docker 网络-overlay

1、Overlay 能干什么(为了解决什么问题),还有其他解决方案吗?

为了解决跨主机容器直接通信,其他解决方案 contiv,weave,calico,kuryr, flannel。

2、Overlay 实现的基本原理是什么 ?

1、使用VXLAN 协议,VXLAN 可以 封装 L2 L3 ,协议数据,是一种隧道协议。如图

overlay xvlan.png

2、docker 使用vxlan 封装的网络拓扑是怎么样的?

如下图,使用 docker_gwbridge 进行容器内部通信,以及外部通信,
使用ovnet 进行overlay 专有网段通信


docker_gwbridge ovnet.png

3、ovnet overlay network 结构是怎么样的?

如下图


ovnet namespace.png

如果有多个overlay ,每个overlay 使用不同的 vxlan id 来标识,每个单独的overlay 链接到 ovnet 命名空间中不同的 bridge 设备。通过bridge 设备转发数据到vxlan 设备,vxlan 设备对数据进行封装(加vxlan header 等)后,转发(arp proxy)数据到主机中,主机网络将数据发出。

4、怎么查看ovnet 命名空间?

默认使用 ip netns show 是看不到 ovnet 的命名空间,docker 的命名空间保存在 /var/run/docker/netns 这个目中,而 ip netns 的命名空间需要在/var/run/netns 这个目录中,把 /var/run/docker/netns 软连接到
/var/run/netns 中,“sudo ip netns ls” 可以看到 docker 的网络命名空间了

5、vxlan 设备测试

.#vm1 192.168.99.106
sudo ip link add vxlan1 type vxlan id 1 remote 192.168.99.107 dstport 4799 dev eth1
#测试,路由未改变,udp 4799 端口未启动
ss -an |grep 4799
ip r
sudo ip link set vxlan1 up
#测试,路由未改变,udp 4799 端口已启动
ss -an |grep 4799
ip r
sudo ip addr add 10.0.3.3/24 dev vxlan1
#测试,路由已改变,udp 4799 端口已启动
ss -an |grep 4799
ip r
ping 10.0.3.123
#vm2 192.168.99.107
sudo ip link add vxlan1 type vxlan id 1 remote 192.168.99.106 dstport 4799 dev eth1
sudo ip link set vxlan1 up
sudo ip addr add 10.0.3.123/24 dev vxlan1
ping 10.0.3.3

6、Overlay 怎么用?

.#1、创建docker swarm 集群(前提条件)
docker-machine create --driver virtualbox m
docker-machine create --driver virtualbox s
ssh docker@192.168.99.106 -i ~/.docker/machine/machines/m/id_rsa
ssh docker@192.168.99.107 -i ~/.docker/machine/machines/s/id_rsa
# on m
# master service on 2377 port , tcp 2377 port for cluster
#management communications m is manager
docker swarm init --advertise-addr 192.168.99.106
# 2、
# docker_gwbridge 172.18.0.0/16
# ingress: 10.255.0.0/16
# bridge - docker0 172.17.0.0/16
docker network ls
# on s
# join swarm as a work node
docker swarm join --token xx 192.168.99.106:2377
# on m
docker network create -d overlay --attachable my-overlay-attach
# on s 不能看见my-overlay-attach
docker network ls
# on s 使用my-overlay-attach 创建容器后 , 使用docker network ls
#可以看见my-overlay-attach
docker run -itd --name s-c1 --net my-overlay-attach hub.c.163.com/library/busybox sh
#on m
docker run -itd --name m-c1 --net my-overlay-attach
hub.c.163.com/library/busybox sh
# on m
docker exec -it m-c1 ping s-c1
# on s
docker exec -it s-c1 ping m-c1

集群容器其他使用
1、使用 docker service 命名使用 overlay 网络 (略) 。
2、docker stack + docker-compse.yml 可以实现服务集群部署 。
3、 docker-compose + docker-compse.yml 只能实现主机部署。

7、总结

1、使用了 额外的重新组包拆包,所以性能有一定的影响。
2、可以方便的解决跨主机容器直接通信(需要注意容器网段的划分)。

8、参考
vxlan-protocol-introduction
linux-vxlan
demystifying-docker-overlay-networking

相关内容

docker 网络-准备
docker 网络-host
docker 网络-bridge
docker 网络-overlay
docker 网络-macvlan