Nginx代理运行在不同的CoreOS节点上的许多容器

在网上冲浪,我find了许多有关使用Nginx / Confd(或Haproxy或Vulcand)在同一主机上运行的不同Docker容器的教程。 但是,我需要做的是不同的。 在对我的基础设施进行概述后,

  • 一个有5个节点的在线CoreOS集群,全部运行etcd
  • 在集群的每个节点上都启动不同的Docker容器(运行WordPress应用的Nginx web服务器),而不需要暴露一个端口并在etcd上写入他们的ips(Docker检查到的Docker ip)。
  • 如果某个节点closures,我的服务将自动移动到另一个可用节点上

现在,我需要做的是让我们说一个Nginx代理,根据虚拟主机,我的stream量路由到各种容器。 以下例子:

Nginx(带pub IP)接收请求xxx.domain.com – > node-1 – >带有自动分配IP的container (监听端口80)

Nginx(带pub IP)接收请求yyy.domain.com – > node-2 – > container与自动分配的IP(侦听端口80)

在这里我的问题:

  • 这是我的scheme是正确的? 我在想错吗?
  • 我的Nginx代理必须在CoreOS集群之外? 或者我必须在每个CoreOS节点上运行它?
  • 我怎样才能达到这个configuration? 什么是最好的方法?

先谢谢你!

您需要为nginxfind某种types的服务发现,以便能够“查找”在节点上运行的容器。 您可以在容器启动时将一条logging写入etcd,并在退出时删除并让nginx检查这些logging。

为了移动服务,你可以看看船队简单的时间表。

我不知道我是否正确。 但是,我会这样做:

在集群外部放置一个负载平衡器(HAProxy,Nginx,Amazon ELB(如果您在EC2上)),在集群内部路由每个stream量。

在里面你可以试试Gogeta: https : //github.com/arkenio/gogeta

它是全局运行(在每个节点上)的逆向代理,并将基于etcd中域项的stream量路由到特定容器。 然后你可以设置你的服务文件添加和删除他们的存在etcd这gogeta监视器。

 ExecStart=<do something> ExecStartPost=/usr/bin/etcdctl set /services/<your_service>/%i/location '{\"host\": "%H", \"port\": <your containers exposed port>}' ExecStop=/usr/bin/docker stop <your service> ExecStopPost=/usr/bin/etcdctl rm --recursive /services/<your_service>/%i 

它工作和负载平衡请求与循环策略。 虽然似乎有一个问题,我提交了https://github.com/arkenio/gogeta/issues/10

这对你有帮助吗?

你可以使用三重nginx,etcd&confd来完成这个任务。 有一篇很棒的博客文章,题为“ 使用CoreOS,confd和nginx进行负载平衡 ” ,这篇文章引导你运行三个容器。

  1. 您需要一个共享的“数据”容器,您可以在其中存储dynamic生成的nginxconfiguration
  2. 您需要一个运行confd的容器,它将读取etcd中的值,并为您dynamic生成nginxconfiguration(这将保存在共享“数据”容器的卷中)
  3. 最后,你需要nginx,它只是使用共享“数据”卷的configuration。

然后关键是让每个HTTP后端通过etcd宣布自己,然后confd将会提取更改并在运行中重新configurationnginx。 这个过程非常接近于@朱连在之前的回答中提到的:

 ExecStart=<do something> ExecStartPost=/usr/bin/etcdctl set /services/<your_service>/%i/location '{\"host\": "%H", \"port\": <your containers exposed port>}' ExecStop=/usr/bin/docker stop <your service> ExecStopPost=/usr/bin/etcdctl rm --recursive /services/<your_service>/%i 

查看confd模板文档以获取更多示例,但是您可以得到如下所示的内容:

 {{range $dir := lsdir "/services/web"}} upstream {{base $dir}} { {{$custdir := printf "/services/web/%s/*" $dir}}{{range gets $custdir}} server {{$data := json .Value}}{{$data.IP}}:80; {{end}} } server { server_name {{base $dir}}.example.com; location / { proxy_pass {{base $dir}}; } } {{end}} 

要注意的是,除非需要更高的可用性设置,否则只需要运行其中的一个“trios”,在这种情况下,您将需要两个或更多的可用性。 当你走的时候,你可能会想要一个ELB实例。