私は現在 CoreOS をいじくり回しており、それに基づいてクラスターを作成しています。これまでのところ、単一ホストでの CoreOS のエクスペリエンスは非常にスムーズです。しかし、サービス ディスカバリに関しては、少し曖昧になります。どういうわけか全体的なアイデアが得られないため、ここで助けを求めています。
私がやりたいことは、最初のコンテナーが 2 番目のコンテナーに依存する 2 つの Docker コンテナーを実行することです。純粋な Docker について話している場合は、リンクされたコンテナーを使用してこれを解決できます。ここまでは順調ですね。
ただし、Docker は複数のホスト間でコンテナーをリンクできないため、このアプローチはマシンの境界を越えては機能しません。だから私はこれを行う方法を考えています。
私がこれまでに理解したのは、これに対処する方法に関するCoreOSのアイデアは、etcd
基本的にポートを介して各ホストでローカルにアクセスできる分散キー値ストアであるサービスを使用することであるという4001
ことです。したがって、対処する必要はありません( の消費者としてetcd
) ネットワークの詳細: アクセスするだけlocalhost:4001
で問題ありません。
したがって、私の頭の中では、サービスを提供する Docker がスピンアップすると、自分自身 (つまり、その IP アドレスとそのポート) を local に登録し、Dockeretcd
全体etcd
に情報を配布することを意味するという考えが浮かびました。通信網。このようにして、たとえば次のようなキーと値のペアを取得します。
RedisService => 192.168.3.132:49236
現在、別の Docker コンテナが にアクセスする必要がある場合、少なくともネットワーク全体に情報が配布された後は、RedisService
独自のローカル から IP アドレスとポートを取得します。etcd
ここまでは順調ですね。
しかし今、私には答えられない質問があり、それはすでに数日間私を困惑させています: サービスがダウンするとどうなりますか? 内のデータをクリーンアップするのは誰etcd
ですか? クリーンアップされていない場合、すべてのクライアントが存在しないサービスにアクセスしようとします。
現時点で私が考えることができる唯一の (信頼できる) 解決策はetcd
、データに の TTL 機能を利用することですが、これにはトレードオフがあります: 数秒ごとにハートビートを送信する必要があるため、ネットワーク トラフィックが非常に多い、または古いデータと一緒に暮らす必要があります。どちらもいいじゃない。
私が考えることができるもう 1 つの「解決策」は、サービスがダウンしたときにサービス自体を登録解除することですが、これは計画的なシャットダウンに対してのみ機能し、クラッシュや停電などに対しては機能しません …</p>
それで、あなたはこれをどのように解決しますか?