【问题标题】:Discoverabilty of Tasks in Docker SwarmDocker Swarm 中任务的可发现性
【发布时间】:2018-10-20 10:26:53
【问题描述】:

我正在运行一个小型 Docker Swarm,它运行一个具有 2 个副本的服务。 在该服务中,该服务的“task-1”需要与同一服务的“task-2”通信,但我没有找到实现此目的的方法

首先,我想避免将服务设置为主机网络模式,因为这样将它放入 swarm 就没有什么意义了。

其次,我发现您可以在docker-compose.yml 文件中设置一个包含TaskName 的环境变量,我使用docker stack deply ... 部署到群中:

    environment:
        - NODENAME={{.Node.Hostname}}
        - NODEID={{.Node.ID}}
        - SERVICEID={{.Service.ID}}  
        - SERVICENAME={{.Service.Name}}  
        - TASKID={{.Task.ID}}
        - TASKNAME={{.Task.Name}}

您可以从各种容器 ping $TASKNAME。但它是不可发现的,因为名称 TASKNAME=e2foobar_yada.gq7ygzvp114q2x3t99lasuowc.e6ncft2k14g9o2u4blvhns19 包含在您重新启动服务时会发生变化的 ID。

我可以设置别名还是有什么方法可以让我进行任务通信?

【问题讨论】:

    标签: docker docker-swarm service-discovery


    【解决方案1】:

    您可以在 tasks.$servicename 上运行 DNS 查找,其中 $servicename 是您的服务名称。它将解析为指向服务中每个任务的 ip 列表。它是为 swarm 模式实现的 DNS-RR,以支持无法通过基于 IP 的内置 RR 负载平衡器的进程。

    您每次访问服务时都需要查询 DNS 列表,因为可以更换容器。存在 DNS 会变得陈旧的风险,您将与停机容器或完全不同的容器通信(这就是基于 IP 的负载平衡如此流行的原因)。您还需要将自己从返回的 IP 列表中排除。

    【讨论】:

    • 感谢您的回答。我必须说这个答案并没有让我高兴。因为这意味着我无法配置连接,我需要动态处理它?!没有永久的 IP 地址或名称?
    • @MartinBarth docker 中没有单个任务的内置 dns 条目。关于如何在 github 存储库中实现这一点的讨论,例如github.com/moby/moby/pull/24973
    【解决方案2】:

    我想一种解决方法可能是使用唯一名称为每个服务初始化不同的服务 - web_1、web_2、.. web_N。 (即使他们使用相同的图像)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多