Tag: 服务发现

在CoreOS上使用etcd进行服务发现时如何处理陈旧的数据?

我目前正在修补CoreOS并基于它创build一个集群。 到目前为止,在单个主机上使用CoreOS的经验非常stream畅。 但是在服务发现方面,事情会变得有些模糊。 不知何故,我没有得到整体的想法,因此我现在要求在这里寻求帮助。 我想要做的是让两个Docker容器在第一个依赖于第二个容器的位置运行。 如果我们正在谈论纯粹的Docker,我可以使用链接容器来解决这个问题。 到现在为止还挺好。 但是这种方法不能跨越机器边界,因为Docker不能跨多个主机链接容器。 所以我想知道如何做到这一点。 到目前为止,我所了解的是CoreOS关于如何处理这个问题的想法是使用它的etcd服务,它基本上是一个分布式的key-value-store,可以通过端口4001在每台主机上访问,所以你没有作为etcd一个消费者来处理任何networking信息:只要访问localhost:4001就行了。 所以,在我的脑海中,我现在有这样的想法,这意味着,当一个提供服务的Docker启动时,它将本身(即它的IP地址和端口)注册到本地etcd , etcd负责分发信息通过networking。 这样,例如,您可以获得键值对,例如: RedisService => 192.168.3.132:49236 现在,当另一个Docker容器需要访问一个RedisService ,至less在信息分发到networking上的RedisService ,它会从他们自己的本地etcd获取IP地址和端口。 到现在为止还挺好。 但现在我有一个问题,我不能回答,这已经困扰了我几天:当一个服务失败时会发生什么? 谁清理了etcd里面的数据? 如果没有清理,所有客户端都尝试访问不在那里的服务。 我现在所能想到的唯一(可靠的)解决scheme是利用etcd的数据TTLfunction,但这涉及到一个折衷:要么你有很高的networkingstream量,因为你需要发送一个心跳秒,或者你必须忍受陈旧的数据。 两者都不好。 另一方面,我所能想到的“解决scheme”就是在服务失效的时候让服务自行注销,但这只适用于计划中的closures,而不是针对崩溃,权限限制,… 那么,你如何解决这个问题呢?

哪种方法更适合发现容器的准备情况?

这个问题已经讨论了很多次了,但是我想听听一些使用下面每种方法的最佳实践和真实案例: devise能够检查相关服务健康的容器。 简单的脚本对于这种开发容器来说可能是有用的,但不适合更复杂的部署。 例如,数据库可以接受连接,但迁移尚未应用。 使容器能够在Consul / etcd中发布自己的状态。 所有从属服务将轮询某个包含所需服务状态的端点。 看起来不错,但似乎多余,不是吗? 通过外部调度程序pipe理容器的启动顺序。 在交付过程中,上述哪种方法在Swarm / Kubernetes /等缺席/在场协调员的情况下更可取?

在一个容器内(泊坞窗)宣布你的应用程序

我在周末在docker的IRC上问了这个问题,但是在我想通过这个答案之前,我不得不走开: 如果我有许多应用程序在容器中运行(现在让我们假设它们都运行在相同的物理硬件上,但情况并非如此),我希望每个应用程序都能够find每个应用程序其他自动。 使用某种registry(例如etcd或DNS-SD / Bonjour),您可以宣布您的服务和任何相关的详细信息,并让其他应用程序了解它们并相应地路由stream量。 这里的问题是,当一个应用程序可以知道它在一个容器内服务的主机名/端口时,它不一定是它可以访问的端口或地址。 有两点需要join的信息: 服务可以访问的地方; 从容器外可以进入 什么服务(版本号,服务types); 从容器内部可以进入 你会如何推荐我通过集装箱壁垒获取这些信息? 我可以通过TCP将Docker暴露给容器,所以应用程序可以查询它显示的位置,但这似乎违反了关注的分离。 我可以在我的容器中打开一个文件/端口,主机系统在启动一个容器以准备发布之后查询,但这有点像我将重新创buildWSDL。 任何想法或指导我应该如何解决这个问题?

无法发现docker集装箱

我正在按照本教程进行服务发现http://jasonwilder.com/blog/2014/07/15/docker-service-discovery 简述: 我创build了一个在xyzd:4001上运行的etcd主机 docker run -d –name etcd -p 4001:4001 -p 7001:7001 coreos/etcd 在backend_serverip:8000和docker-register上创build一个运行容器的后端服务器 $ docker run -d -p 8000:8000 –name whoami -t jwilder/whoami $ docker run –name docker-register -d -e HOST_IP=$(hostname –all-ip-addresses | awk '{print $1}') -e ETCD_HOST=xyzd:4001 -v /var/run/docker.sock:/var/run/docker.sock -t jwilder/docker-register 在backend2_serverip:8000和docker-register上创build另一个运行容器的后端服务器 $ docker run -d -p 8000:8000 –name whoami -t jwilder/whoami $ […]

在不使用领事的情况下在docker工人中发现服务

我是新来的docker和微服务。 我已经开始将我的networking应用程序分解成微服务,目前我正在进行手动configuration。 经过一番研究,我遇到了允许服务发现的docker swarm模式。 另外,我遇​​到了其他的服务发现工具,例如Eureka和Consul。 我的主要目标是用服务名称replacecurl调用中的IP地址,并在同一服务的多个实例之间进行负载平衡。 即前例。 curl http://192.168.0.11:8080/来curlhttp:// my-service 我必须保持我的服务语言独立。 请build议,我需要使用领事与docker群进行服务发现,或者我可以做没有领事? 有什么优势?