Docker的原生overlay网络的实现原理


manager node: CentOS Linux release 7.4.1708 (Core)workr node: CentOS Linux release 7.5.1804 (Core)manager node: Docker version 18.09.4, build d14af54266worker node: Docker version 19.03.1, build 74b1e89manager node: 192.168.246.194worker node: 192.168.246.195manager node执行: docker swarm initworker node执行: docker swarm join --token SWMTKN-1-0p3g6ijmphmw5xrikh9e3asg5n3yzan0eomnsx1xuvkovvgfsp-enrmg2lj1dejg5igmnpoaywr1 192.168.246.194:2377说明⚠️:如果遗忘了docker swarm join的命令,可以使用下面命令查找:(1)对于 worker 节点:docker swarm join-token worker(2)对于 manager 节点:docker swarm join-token manager说明⚠️:在docker swarm集群创建的开始,docker 会给每台host创建除了docker0以外的两个网络,分是bridge类型(docker_gwbridge网桥)和overlay类型(ingress)的网络,以及一个过渡的命名空间ingress_sbox,我们可以使用如下命令在 manager节点自建overlay网络,结果如下:docker network create -d overlay uber-svc再次查看 manager 和 worker 两台主机 docker swarm 集群网络:说明⚠️:我们会发现在 worker node上并没有 uber-svc 网络。这是因为只有当运行中的容器连接到覆盖网络的时候,该网络才变为可用状态。这种延迟生效策略通过减少网络梳理,提升了网络的扩展性。说明⚠️:(1)由于容器和overlay的网络的网络命名空间文件不再操作系统默认的/var/run/netns下,只能手动通过软连接的方式查看。ln -s /var/run/docker/netns /var/run/netns。(2)有时候网络的网络命名空间名称前面会带上1-、2-等序号,有时候不带。但不影响网络的通信和操作。(1)ingress网络的IPAM( IP Address Management)分配如下:(2)uber-svc自建的overlay会使用docker自动分配的IPAM:(1)Ingress Load Balancing(2)Internal Load Balancing说明⚠️:我们本节重点聊聊 LB 的第二种情况,即Internal Load Balancing~在开始下面的实践之前,我们先编辑以下两个脚本。对于脚本的使用,我会给出具体实例~说明⚠️:(1)该脚本通过指定容器id、name或者namespace快速进入容器的network namespace并执行相应的shell命令。(2)如果不指定任何参数,则列举所有Docker容器相关的network namespaces。执行脚本结果如下:该脚本根据ifindex查找虚拟网络设备所在的namespace,脚本不同情况下执行结果如下:docker service create --name uber-svc --network uber-svc -p 80:80 --replicas 2 nigelpoulton/tu-demo:v1部署的这两个容器分别处于 manager 和 worker 节点上:说明⚠️:-p当然你也可以使用--publish代替-p,在这里的用意是将容器内部的服务暴露到host上,这样我们就可以访问这个services。一般情况下我们在swarm中部署service后容器中的网络只有一张网卡使用的是docker0网络,当我们将服务发布出去后,swarm会做如下操作:(1)给容器添加三块网卡eth0和eth2,eth3,eth0连接overlay类型网络名为ingress用于在不同主机间通信,eth2连接bridge类网络名为docker_gwbridge,用于让容器能访问外网。eth3连接到我们自己创建的mynet网络上,同样的作用也是用于容器之间的访问(区别于eth3网络存在dns解析即服务发现功能)。(2)swarm各节点会利用ingress overlay网络负载均衡将服务发布到集群之外。(1)先查看 uber-svc.1 容器(2)查看 uber-svc.1 容器中网卡情况当然,你也可以直接使用下面命令查看:docker exec uber-svc.1.kh8zs9a2umwf9cix381zr9x38 ip 开发云主机域名addr(3)查看 uber-svc 网络命名空间的网卡当然,你也可以使用下面的命令:ip netns exec 1-kzxwwwtunp ip addr说明⚠️: docker exec uber-svc.1.kh8zs9a2umwf9cix381zr9x38 ip addr这条命令可以看到 manager 节点上容器的网络有四张网卡,分别是:lo、eth0、eth2 和 eth3。
其中,eth2 对应的 veth pair为 uber-svc 网络中的veth2,eth3 对应的 veth pair为 host 上的vethef74971。 ip netns exec 1-kzxwwwtunp brctl show查看 uber-svc 网络空间下网桥挂载情况可以看出veth2挂到了br0网桥上.(4)查看 uber-svc 网络的vxlan-id主要步骤如下:(1)获取 ingress 的network信息(2)获取取 ingress 的命名空间信息(3)获取 ingress 的命名空间中ip信息(4)获取 ingress 的命名空间中vxlan0的ID信息(5)获取 ingress 的命名空间中对应 veth pair 信息主要步骤如下:(1)获取 ingress_sbox 的ip信息(2)获取 ingress_sbox 的veth pair 接口信息(3)获取 manager 主机上veth pair 接口信息说明:swarm worker 节点上的情况与 manager 基本思路一样~说明⚠️:(1)可以看到这里ingress_sbox和创建容器的ns共用一个ingress网络空间。(2)通过使用docker exec [container ID/name] ip r会更加直观的看到网络流动情况,如下:由此可知容器默认网关为172.19.0.1,也就是说容器是通过eth3出去的~关于 Docker Swarm 底层网络问题还有很多的知识点需要去探究,本节对最近学习到的docker network 做了一个基础总结,如有错误或不足,请各位大佬指正,感谢!另:参考文档如有侵权,请及时与我联系,立删~。最后,感谢开源,拥抱开源!(1)Docker swarm中的LB和服务发现详解(2)万字长文:聊聊几种主流Docker网络的实现原理(3)Docker跨主机网络——overlay(4)Docker 跨主机网络 overlay(十六)(5)Docker overlay覆盖网络及VXLAN详解

相关推荐: 如何使用 AWS Auto Scaling 按需动态增加和减少实例

当您不知道自己该选择何种类型的 EC2 实例的时候,也不清楚业务什么时候高峰,那我们使用 Auto Scaling 可以非常便捷的解决我们的问题,他根据我们设定的负载压力,自动进行扩展和缩容,以实现最小费用的情况下保证业务的正常运行。首先把我们正在运行的 EC…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/13 19:32
下一篇 05/13 19:32

相关推荐