【问题标题】:Adding new containers to existing cluster (sworm)将新容器添加到现有集群 (sworm)
【发布时间】:2017-01-01 21:37:13
【问题描述】:

我在尝试实现将新容器添加到现有集群的最佳方法时遇到问题,而所有容器都在 docker 中运行。

假设我有一个 docker swarm,并且每当一个容器由于某种原因停止/失败时,swarm 会启动新容器并期望它将自己添加到集群中。

如何让任何容器都能够将自己添加到集群中?

我的意思是,例如,如果我想创建一个 RabbitMQ HA 集群,我需要创建一个 master,然后创建 slave,假设每个 RabbitMQ 实例(master 或 slave)都是一个容器,现在假设一个其中失败了,我们有两个选择:

1) 从属容器发生故障。

2) 主容器失败。

通常,一个能够作为集群运行的服务,它也能够选举一个新的leader作为master,所以,假设这个scenerio 在没有任何干预的情况下运行顺畅,添加到 swarm 的新容器(使用 docker swarm)如何能够将自己添加到集群中?

这里的问题是,新容器不是每次都使用新参数创建的,容器总是在第一次部署时创建,这意味着,我不能只更改它的命令行参数,这是一个云,所以我不能硬编码要使用的 IP。

这里有些东西不见了。 也许尝试在“docker Swarm”级别声明“服务”,实际上会让新容器能够将自己添加到集群中,而无需真正了解集群中的其他机器...

【问题讨论】:

    标签: docker rabbitmq cloud cluster-computing docker-swarm


    【解决方案1】:

    使用 Swarm 扩展容器有很多选择。它的范围可以从通过容器环境变量传递信息这样简单到像服务发现一样广泛。

    这里有几个选项:

    • 将 IP 作为容器环境变量传入。例如docker run -td -e HOST_IP=$(ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}') somecontainer:latest
      • 这会将内部容器环境变量HOST_IP 设置为启动它的机器的IP。
    • Service Discovery。查询已知入口点以确定有关任何所需服务的信息,例如 IP、端口等。
      • 这是最常见的横向扩展选项类型。您可以在official Docker docs 中阅读更多相关信息。高级概述是您在主服务器上设置了Consul 之类的服务,您可以通过服务查询以查找其他相关服务的信息。示例:Web 服务器需要 DB。 DB 会将自身添加到 Consul,Web 服务器将启动并查询 Consul 以获取数据库 IP 和端口。
    • Network Overlay。创建一个集群网络,让您的服务相互通信。
      • 示例:

    
    $ docker network create -d overlay mynet
    $ docker service create –name frontend –replicas 5 -p 80:80/tcp –network mynet mywebapp
    $ docker service create –name redis –network mynet redis:latest
    

    这允许 web 应用通过将它们放置在同一网络上来与 redis 进行通信。

    最后,在上面的示例中,最好将其部署为 2 个单独的容器,您可以单独扩展它们。例如部署一个MASTER 和一个SLAVE 容器。然后你会根据你需要的数量来缩放每个。例如要扩展到 3 个从站,您将使用 docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>,这将启动额外的从站。在这种情况下,如果其中一个扩展的从站失败,swarm 将启动一个新的从站以将任务数恢复到 3。

    【讨论】:

    • 我想你误解了,想象你有 3 个兔子容器在不同的虚拟机中作为一个集群运行。现在,由于rabbit在不同的虚拟机中,这意味着rabbit在一个集群内工作,这意味着,它就像一个集群与一个集群。现在的问题是,如果 1 个容器失败,或者,如果我想自动将新容器添加到集群中,如果不手动向新兔子显示集群中的节点,我将如何做到这一点,有什么方法可以告诉他 -问一个兔子服务:“我的集群在哪里”,其中一个活动节点会回答......
    【解决方案2】:

    https://docs.docker.com/engine/reference/builder/#healthcheck

    Docker 镜像有一个新的健康检查层。 例如,在容器中使用健康检查层:

    RUN ./anyscript.sh HEALTHCHECK exit 1 or (Any command you want to add) HEALTHCHECK 检查命令 0 或 1 的状态码,结果为 1. 健康 2. 不健康 3.启动等

    Docker swarm 自动重启 swarm 集群中不健康的容器。

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 2015-07-31
      • 2019-05-10
      • 2018-08-06
      • 2019-08-02
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多