【问题标题】:How to load balance services in CoreOS?如何在 CoreOS 中负载均衡服务?
【发布时间】:2026-01-06 19:10:01
【问题描述】:
  • 我有一个运行 3 个 Web 容器的 coreos 集群,每个容器运行相同的 Web 应用程序。
  • 如何使用 haproxy 和 nginx 对这些正在运行的容器的请求进行负载平衡。
  • 请提出建议。

【问题讨论】:

    标签: nginx docker haproxy coreos


    【解决方案1】:

    我建议你仔细看看 vulcand,它是一个在 coreos 上运行的反向代理,旨在对运行在 coreos 上的容器之间的 http 请求进行负载平衡:

    Vulcand 是 HTTP API 管理和微服务的反向代理。 它的灵感来自于 Hystrix。

    它使用 Etcd 作为配置后端,因此需要更改配置 立即生效,无需重启服务。

    https://coreos.com/blog/zero-downtime-frontend-deploys-vulcand/

    http://vulcand.github.io/

    一篇不错的博文,其中包括使用 vulcand 跨 docker 容器进行负载平衡:

    http://www.recorditblog.com/post/how-to-create-a-web-scale-infrastructure-based-on-docker-coreos-vulcand-and-mesos-and-why-object-storage-becomes-the-de-facto-data-repository/

    这个 github repo 有一些用于设置 coreos、docker 和 vulcand 的示例源代码:

    https://github.com/bradgignac/intro-to-coreos

    【讨论】:

    • 如果你有一个 coreos 集群,其中容器不是对称分布的(coreos-1 运行一个服务的 3 个实例,coreos-2 运行 1 个实例,coreos-3 没有运行)怎么办?您如何透明地为它们添加负载均衡器,以便其他尝试访问负载均衡服务的服务知道如何访问它们?而且,如果将来我将一项服务部署到 coreos-3,负载均衡器会知道要接它吗?
    • vulcand 似乎停滞不前。文档已过时,文档中的最后一个测试版已回滚,最后一个测试版已使用一年。
    【解决方案2】:

    这有点晚了,但它确实类似于数字海洋教程在他们的 CoreOS 入门中教你做的事情:

    https://www.digitalocean.com/community/tutorials/how-to-use-confd-and-etcd-to-dynamically-reconfigure-services-in-coreos

    几乎你在一台机器上运行 HAProxy 容器,并且有任意数量的服务运行后端服务器。然后你使用confd 在添加和删除后端服务器时动态构建配置文件。

    这是我根据教程构建的HAProxy Service。我使用这些 two service files 将其与我的 Web 应用程序一起调用。

    请注意我的 webapp.service 文件中的这一行:

    ExecStartPost=/bin/bash -c 'etcdctl set /app/servers/%n "%n $(curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address):80"'
    

    这会将要在 HAProxy 配置文件中使用的服务器位置添加到 /app/servers/webapp.service。 Digital Ocean 教程通过一个“Sidekick”容器来实现这一点,但它可能更通用且更不容易出错。

    【讨论】:

    • 有几个例子,其中 confd (hihjtower) 用于监控 etcd,然后构建 haproxy 配置文件,然后重新启动 haproxy。这意味着您计划代理的服务将在 haproxy 重新启动时中断。而且,如果您要使用静态配置对 webserver 实例进行静态配置,那么如果任何 webserver 都不可用,haproxy 可能无法启动或重新启动。 (需要阅读)
    最近更新 更多