在网上冲浪,我find了许多有关使用Nginx / Confd(或Haproxy或Vulcand)在同一主机上运行的不同Docker容器的教程。 但是,我需要做的是不同的。 在对我的基础设施进行概述后,
现在,我需要做的是让我们说一个Nginx代理,根据虚拟主机,我的stream量路由到各种容器。 以下例子:
Nginx(带pub IP)接收请求xxx.domain.com – > node-1 – >带有自动分配IP的container (监听端口80)
Nginx(带pub IP)接收请求yyy.domain.com – > node-2 – > container与自动分配的IP(侦听端口80)
在这里我的问题:
先谢谢你!
您需要为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进行负载平衡 ” ,这篇文章引导你运行三个容器。
然后关键是让每个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实例。