Docker swarm网络

docker ginotang 2281℃ 0评论

简介

当我们在创建swarm集群的时候,默认有两个网络会同时被创建,它们是

  • ingress 属于overlay网络,通过routing mesh的方式实现容器网络的负载均衡
  • docker_gwbridge 用于连接不同Docker host上的docker进程

swarm模式中,如果容器没有显示指定网络,默认使用名为ingress的overlay网络,虽然它是一个overlay网络,但是ingress下的容器是不能互相通讯的,ingress的作用是把用户的请求分发给指定节点的容器之中,实现流量的负载。

routing mesh和VIP

ingress的特点是routing mesh,即容器内部的负载均衡。假设网络上部署了一个3副本的web服务器,用户向容器发送请求的时候,routing mesh负责选择节点响应用户的请求。

routing mesh的核心是VIP,每个容器除了自己原来真实的IP地址之外,还有一个VIP,routing mesh就是把请求转发VIP实现负载均衡的。

swarm network

从上图可见,不管容器中是否提供服务(node 3),只要端口开放了,routing mesh就会转发该容器的流量。

从外界访问容器

和普通容器一样,swarm node中的容器要向外界提供服务,只需要使用--publish选项开放指定的端口即可,例如http服务。

短语法:

为已有容器添加开放端口

容器之间互相访问

默认的ingress网络即使是相同的网络中的容器也不能互相访问。例如两个容器:webapp和mysql,如果它们都处于ingress网络,那么webapp是连不上mysql容器的。解决办法有两个:

  1. 开放mysql的访问端口
  2. 使用自定义overlay网络

第一种方法安全性差,一旦mysql的端口发布出来,外界就可以任意访问mysql服务,安全得不到保障。

第二种方法是推荐的,因为同一个自定义overlay网络中容器的任意端口是互相开放的,不需要publish任何一个端口,提供了可访问性的同时保证了安全性。

创建自定义overlay网络

swarm模式中的自定义overlay网络不需要使用key-value数据库保存网络信息。

该命令只能在manager node中执行。

创建后查看网络,它的范围是swarm

创建服务并加入自定义网络

首先创建web服务容器

其次是mysql容器

为了方便测试,直接在mysql容器中安装ping命令测试容器间的连通性

完成后使用ping命令测试webapp

由于overlay网络提供了DNS解析,我们可以直接使用名称访问容器,现在证明webapp和mysql现在是可以通讯的,且webapp的ip地址是10.0.1.8。现在我们进入webapp内部安装net-tools程序,这样就可以使用ifconfig命令查看容器内部网络

发现容器内部除了本地回环(lo)外还有3个ip地址,但是没有一个是10.0.1.8,实际上,10.0.1.8就是所谓的VIP,我们不需要知道容器的实际IP地址就可以容器网络,routing mesh就是通过这个地址进行流量分发。可以使用下面的命令查看容器的VIP

跳过routing mesh转发

有时候部分容器不需要routing mesh,通过把端口的开放模式设置为host即可。

外部负载均衡器

routing mesh可以和外部负载均衡器混合使用,也可以禁用routing mesh,单独配置外部负载均衡,例如keepalived、haproxy等。

ingress load balancer

在这种情况下,端口8080必须能被HAProxy访问。

禁用routing mesh

如果我们只选择使用外部负载均衡,则可以关掉内部的routing mesh。禁用routing mesh很简单,创建的时候更改--endpoints-mode为dnsrr即可,默认是vip。

现在使用docker service inspect web2,已经没有VIP的信息了。

转载请注明:Pure nonsense » Docker swarm网络

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x