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

xda*_*ays 12 docker

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

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

Von*_*onC 7

我相信现在(2016年8月)在PR 25414中对此进行了讨论,其中服务创建中的容器网络最初报告为:

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

查尔斯史密斯(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模式服务发现

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

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

OP坚持认为:

仍然无法得到VIP附在容器上的原因......

好:

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

现在问题25325是关于Docker 1.12群模式负载平衡不能始终如一地工作,其中IPVS表没有正确填充.

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