我目前正在修补 CoreOS 并基于它创建一个集群。到目前为止,在单主机上使用 CoreOS 的体验还是相当流畅的。但是在服务发现方面,事情变得有点模糊。不知何故,我没有得到整体的想法,因此我现在在这里寻求帮助。
我想做的是让两个 Docker 容器在第一个依赖于第二个的地方运行。如果我们谈论的是纯 Docker,我可以使用链接容器来解决这个问题。到现在为止还挺好。
但是这种方法不能跨机器边界工作,因为 Docker 不能跨多个主机链接容器。所以我想知道如何做到这一点。
到目前为止我所了解的是,CoreOS 处理这个问题的想法是使用它的etcd
服务,它基本上是一个分布式键值存储,可以在每个主机上通过 port 本地访问4001
,所以你不必处理(作为 的消费者etcd
)具有任何网络详细信息:只需访问localhost:4001
即可。
所以,在我的脑海里,我现在有这样的想法,这意味着当一个提供服务的 Docker 启动时,它会在本地注册自己(即它的 IP 地址和它的端口)etcd
,并etcd
负责在整个网络。这样,例如,您将获得键值对,例如:
RedisService => 192.168.3.132:49236
现在,当另一个 Docker 容器需要访问 aRedisService
时,它会从它们自己的本地获取 IP 地址和端口etcd
,至少在信息已通过网络分发后。到现在为止还挺好。
但是现在我有一个我无法回答的问题,这已经让我困惑了几天:当服务出现故障时会发生什么?谁清理里面的数据etcd
?如果没有清理,所有客户端都会尝试访问不再存在的服务。
目前我能想到的唯一(可靠)解决方案是使用etcd
的 TTL 功能来处理数据,但这需要权衡:要么您的网络流量很高,因为您需要每隔几秒发送一次心跳,否则您必须忍受陈旧的数据。两者都不好。
我能想到的另一个“解决方案”是让服务在出现故障时自行注销,但这仅适用于计划中的关闭,不适用于崩溃、停电……</p>
那么,你如何解决这个问题?