【さーびすでぃすかばり】

サービスディスカバリ とは?

最終更新:
💡 動き回るサービスの居場所を自動で見つける「住所録システム」

マイクロサービスやコンテナ環境で、呼び出したいサービスが今どのアドレス・ポートで動いているかを見つける仕組み。インスタンスの増減や移動に合わせて接続先の一覧を更新する。

📌 このページのポイント
サービスディスカバリの仕組み サービスレジストリ 名前 → IP:ポート 管理 クライアント 接続先を問合せ サービスA 192.168.1.10:8080 サービスB 192.168.1.20:3000 サービスC 192.168.1.30:5000 登録 ① 問合せ ② 応答 ③ 直接接続 動的追加/削除
サービスディスカバリの仕組み(クライアントサイド方式の例)
ひよこ ひよこ
サービスディスカバリって何で必要なの?IPアドレスを設定ファイルに書いておけばいいんじゃない?
ペンギン先生 ペンギン先生
コンテナ環境ではアドレスが変わりやすいんだ。コンテナが作り直されると別のIPが割り当てられることがあるし、オートスケーリングで台数も増減する。固定のIPを書いておくと、すぐに古い情報になってしまうんだよ。
ひよこ ひよこ
DNSで名前解決するのと何が違うの?
ペンギン先生 ペンギン先生
対立するものではなくて、DNSはサービスディスカバリの入口としてよく使われるよ。KubernetesやConsulもDNSで問い合わせられるんだ。ただ、普通のDNSはキャッシュの有効期間(TTL)の間は古い答えが使われることがあるから、ヘルスチェックの結果や一覧の更新とあわせて設計するのが大事だよ。
ひよこ ひよこ
クライアントサイドとサーバーサイドって何が違うの?
ペンギン先生 ペンギン先生
クライアントサイド方式は、呼び出し側がレジストリに「今どこで動いている?」と問い合わせて、自分で接続先を選ぶんだ。サーバーサイド方式は、ロードバランサーなどが間に入って、呼び出し側は決まった宛先に送るだけ。Kubernetesの通常のServiceは、決まったIPに送ると振り分けてくれるからサーバーサイド方式に近いよ。
ひよこ ひよこ
サービスディスカバリ自体が落ちたらどうなるの?
ペンギン先生 ペンギン先生
新しく起動したサービスの登録や、接続先の更新ができなくなるおそれがあるね。だからConsulやetcdは複数台のクラスタで動かして、Raftという合意アルゴリズムで情報をそろえるんだ。過半数の台数(クォーラム)を失うと書き込みができなくなるけど、Consulには古いかもしれない情報を返してでも読み取りに応える「stale」モードもあるよ。
ひよこ ひよこ
ヘルスチェックも関係あるの?
ペンギン先生 ペンギン先生
大ありだよ。止まったインスタンスを一覧から外すのにヘルスチェックを使うんだけど、判定を厳しくしすぎると一時的な遅れで正常なインスタンスまで外してしまうし、緩すぎると止まったインスタンスに通信が続いてしまう。どのくらいの間隔と回数で判定するかは、サービスの性質に合わせて調整しようね。
もっと詳しく知りたい人へ

KubernetesではPodのIPアドレスが変わっても、なぜ同じ名前でつながるの?

Serviceという仕組みが間に入るからだよ。Serviceにはラベルで対象のPodを選ぶ条件があり、コントローラーが条件に合うPodを見張って接続先の一覧(EndpointSlice)を更新する。呼び出し側は、Podが入れ替わっても変わらないServiceのクラスターIPや、my-service.default.svc.cluster.local のようなDNS名を使えばいいんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「サービスディスカバリ」って出てきたら「サービスの今の居場所を見つけて、接続先の一覧を最新に保つ仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Service Discovery」 = サービスの発見
💬 Service(サービス)+ Discovery(発見・探索)。「このサービスはどこにいる?」を解決する仕組みだよ

参考資料

← 用語集にもどる