在docker 1.12中将vip addr绑定到服务的每个容器中的目的是什么?

时间:2016-08-07 08:33:45

标签: docker

Docker使用ipvs的NAT模式来获得服务负载平衡,在NAT模式下,真实服务器对VIP一无所知。

根据我的理解,VIP仅用于来自不同服务的容器之间的通信,因此它只应出现在iptables的mangle表中。

1 个答案:

答案 0 :(得分:7)

我相信现在(2016年8月)在PR 25414讨论这个问题,其中服务创建中的容器网络最初报告为:

  

可以通过虚拟IP(VIP)在服务发现中访问以docker swarm模式配置的容器,并通过docker swarm ingress覆盖网络进行路由。或者通过DNS循环码(DNSRR)

Charles Smith (sfsmithcha)补充道:

  

VIP不在入口覆盖网络上。您需要创建用户定义的覆盖网络才能使用VIP或DNSRR。 (见PR 25420

     

我们不应该混淆ingress,即(--publish ports)与swarm-internal overlay网络。

查尔斯关于VIP存在的说明是(docs/swarm/networking.md

  

Docker Engine群集模式本身支持覆盖网络,因此您可以启用容器到容器网络   使用swarm模式时,不需要外部键值存储。

     

群模式覆盖网络的功能包括:

     
      
  • 您可以将多个服务附加到同一网络。
  •   
  • 默认情况下,服务发现会为群组中的每个服务分配虚拟IP地址(VIP)和DNS条目,使其服务名称可用于同一网络上的容器
  •   
  • 您可以将服务配置为使用DNS循环而不是VIP。
  •   
     

使用群模式服务发现

     

默认情况下,当您创建连接到网络的服务时,swarm会为服务分配VIP。 VIP根据服务名称映射到DNS别名。网络上的容器通过八卦共享服务的DNS映射,因此网络上的任何容器都可以通过其服务名称访问服务

     

您无需公开特定于服务的端口,即可将该服务提供给同一覆盖网络上的其他服务   swarm的内部负载均衡器自动将请求分配给活动任务中的服务VIP。

OP坚持认为:

  

仍然无法理解为什么VIP被附加在容器的eth0 ...

好:

  • eth0接口表示连接到覆盖网络的容器接口。因此,如果您创建一个覆盖网络,您将拥有与之关联的VIP。
  • eth1接口表示连接到docker_gwbridge网络的容器接口,用于容器集群外部的外部连接。

现在issue 25325是关于Docker 1.12群模式负载平衡不能正常工作,其中IPVS表没有正确填充。

这说明了那些ipv的作用,这个bug应该在1.12.1-rc1中修复。