深入浅析docker中的overlay式网络?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为余干企业提供专业的成都网站制作、做网站、外贸营销网站建设,余干网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。overlay(覆盖)式网络会在多个docker守护进程所在的主机之间创建一个分布式的网络。这个网络会覆盖宿主机特有的网络,并允许容器连接它(包括集群服务中的容器)来安全通信。显然,docker会处理docker守护进程源容器和目标容器之间的数据报的路由。
当你初始化一个集群(swarm)或把一个docker宿主机加入一个已经存在的集群时,宿主机上会新建两个网络:
一个叫ingress的overlay式网络,用来处理和集群服务相关的控制和数据传输。当你创建一个集群服务而且没有把它连到用户定义的overlay式网络时,它默认会连到ingress网络。
一个叫docker_gwbridge的bridge式网络。用来连接本docker守护进程和集群中的其他守护进程。
你可以用docker network create命令创建用户定义的overlay式网络,就和你创建用户定义的bridge式网络一样。服务和容器可以同时连到多个网络。服务和容器只能和它所在的网络中的其他对象通信。
虽然集群服务和单独的容器都能连到overlay式网络,但默认的表现和配置两者都是不同的。因此,本主题后面的内容会分成三部分:应用于所有overlay式网络的;应用于集群服务中的网络的;应用于单独的容器使用的overlay式网络的。
适用于所有overlay网络的操作
创建一个overlay网络
先决条件
使用overlay网络的docker守护进程需要的防火墙规则
要让一个overlay网络中的docker主机能够相互通信,你需要打开下面的端口:
1.TCP端口2377,用来集群管理相关的通信
2.TCP和UDP端口7946,用来进行节点之间的通信
3.UDP端口4789,用来进行进行overlay网络上的数据传输
在你能创建一个overlay网络之前,你要么要通过docker swarm init把你的docker守护进程初始化成一个集群管理者(swarm manager),要么要通过docker swarm join把它加入到一个已存在的集群中。
不管哪种方式,默认创建并使用的都是叫做ingress的overlay式网络。即使你不打算使用集群服务,也要这么做。
以后你可以创建用户定义的overlay式网络。
要创建一个用在集群服务中的overlay式网络,用下面所示的命令:
$ docker network create -d overlay my-overlay
要创建一个既能用于集群服务,又能用于单独的容器来和其他docker守护进程中的单独的容器进行通信的网络,加上--attachable标记:
$ docker network create -d overlay --attachable my-attachable-overlay
你可以指定IP地址范围,子网,网关和其他选项。细节请查看docker network create --help。
overlay网络上的加密传输
所有的服务管理相关的传输都默认用GCM模式的AES算法加密。集群中的管理节点每12个小时轮换加密用的键(key)。
如果要加密应用数据,在创建网络时加上--opt encrypted。这个参数支持在vxlan级别的IPSEC加密。这个操作会导致不可忽略的性能下降,所以在应用到生产环境前要先测试。
当你开启overlay加密后,docker会在所有网络中服务被调度到的节点上创建IPSEC 隧道。这些隧道也会使用GCM模式的AES算法加密,并且每12个小时自动轮换加密用的键(key)。
❌不要把Windows节点加入到加密通信的overlay网络中。
overlay网络上的加密通信不支持Windows。如果Windows节点试图连接到加密通信的overlay网络,不会报错,但这个节点会不能和其他节点通信。
集群模式的overlay网络和单独的容器
你可以用--opt encrypted --attachable或把没有被管理的容器加入到网络的方式来使用overlay网络特性。
$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
修改默认的ingress网络
大多数用户不需要配置ingress网络。但docker17.05以及更高版本允许你这么做。如果自动选择的子网段和你网络中已存在的网络冲突了,或你需要修改其他底层的网络设置比如MTU的时候,这个功能就很有用了。
修改ingress网络需要删除再创建它。这就要求你在集群中创建服务之前完成修改。如果有发布端口的服务,在你删除ingress网络之前要先删除这些服务。
在ingress网络不存在的时候,已存在的没有发布端口的服务能继续提供服务,但没有负载均衡功能。那些发布端口的服务比如发布80端口的WordPress服务会受影响。
用docker network inspect ingress检查ingress网络,然后删除所有所在容器连到ingress的服务。这些服务是发布端口的服务比如发布80端口的WordPress服务。如果所有这些服务没有停掉,下一步会失败。
删除ingress网络。
$ docker network rm ingress
WARNING! Before removing the routing-mesh network, make sure all the nodes in your swarm run the same docker engine version. Otherwise, removal may not be effective and functionality of newly created ingress networks will be impaired.
Are you sure you want to continue? [y/N]
3.用ingress标记创建新的overlay网络,加上你想要的配置。下面的例子把MTU配置成1200,把子网设置成10.11.0.0/16,并把网关设成10.11.0.2。
$ docker network create \ --driver overlay \ --ingress \ --subnet=10.11.0.0/16 \ --gateway=10.11.0.2 \ --opt com.docker.network.mtu=1200 \ my-ingress