サービス ディスカバリ

このドキュメントでは、Kubernetes DNS ベースのサービス ディスカバリの概要と Kf での使用方法について説明します。

Kf で Kubernetes サービス ディスカバリを使用する場合

Kubernetes サービス ディスカバリは、アプリケーションがデプロイされている場所に関係なく、一貫した方法でバッキング サービスを見つける必要があるアプリケーションで使用できます。たとえば、構成で常にローカル SMTP ゲートウェイを参照する共通の URI を使用して、コードを実行した環境から分離したい場合があります。

アプリケーション チームにとって、サービス ディスカバリは次のような利点があります。

  • 環境ごとの構成の量を削減する。
  • クライアント アプリケーションとサーバー アプリケーションを分離する。
  • アプリケーションを新しい環境に移植できる。

Kubernetes サービス ディスカバリは、次の場合に使用できます。

  • アプリケーションがコンテナの DNS 構成を使用してホストを解決する。
  • アプリケーションが、バッキング サービスを使用して同じ Kubernetes クラスタまたは Namespace にデプロイされる。
  • バッキング サービスに関連する Kubernetes Service がある。Kf はアプリごとにこれらを作成します。
  • Kubernetes NetworkPolicies では、通信に必要な Kubernetes Service とアプリケーションの間のトラフィックが許可されます。Kf は、これらのポリシーを各 Kf スペースに作成します。

次のような場合は Kubernetes サービス ディスカバリを使用しないでください

  • アプリケーションを複数のクラスタ間でフェイルオーバーする必要がある。
  • アプリケーションで使用される DNS リゾルバをオーバーライドする。
  • アプリケーションが特定の種類の負荷分散を必要とする。

Kubernetes サービス ディスカバリの仕組み

Kubernetes サービス ディスカバリは、Kubernetes ノードで実行されているコンテナの DNS 構成を変更することで機能します。アプリケーションが非修飾ドメイン名を検索した場合、ローカル DNS リゾルバが最初にローカル クラスタ内の名前を解決しようとします。

複数のパートのないドメインは、コンテナの名前空間内の Kubernetes Services の名前に解決されます。各 Kf アプリは同じ名前の Kubernetes Services を作成します。2 つの Kf アプリ pingpong が同じ Kf スペースにデプロイされている場合、ping は URL http://pong を使用してトラフィックを他のサービスに送信できます。

1 つのドットを含むドメインは、ドットの後にラベルと同じ名前を持つ Kubernetes 名前空間内の Kubernetes Services に解決されます。たとえば、database 名前空間に PostgreSQL データベースと customers サービスがある場合、別の名前空間内のアプリケーションは postgres://customers.database を使用して名前を解決できます。

Kf でサービス ディスカバリを使用する方法

Kubernetes DNS ベースのサービス ディスカバリは任意の Kf アプリで使用できます。Kf アプリは同じ名前の Kubernetes Service を作成し、Kf スペースは同じ名前の Kubernetes 名前空間を作成します。

  • 現在のスペースの Kf アプリは、protocol://app-name を使用して参照します。
  • 異なるスペースの Kf アプリは、protocol://app-name.space-name を使用して参照します。
  • カスタムポートをリッスンする現在のスペースの Kf アプリは、protocol://app-name:port を使用して参照します。
  • カスタムポートをリッスンする別のスペースの Kf アプリは、protocol://app-name.space-name:port を使用して参照します。

ベスト プラクティス

DNS ベースのサービス ディスカバリの対象になるアプリケーションの場合は、ヘルスチェックを頻繁に行い、接続を受け入れるホストのプールでアプリケーションの追加と削除が迅速に行われるようにします。

DNS ベースのサービス ディスカバリを使用するアプリケーションは、サービスの安定性が保証されません。このため、解決されたサービスの IP アドレスをキャッシュに保存するべきではありません。

環境固有のサービスがクラスタ外部に存在する場合は、ExternalName Kubernetes Services を設定すると、Kubernetes DNS を使用して解決できます。これらの Kubernetes Services は同じ解決機能を備えていますが、CNAME レコードを返してリクエストを外部認証局にリダイレクトします。

Eureka との比較

Eureka は、Netflix によって作成されたオープンソースのクライアント側ロードバランサです。これは、Spring Cloud Services サービス ブローカーの一部として一般的に使用されます。Eureka は、ワークロードが頻繁に中断し、IP アドレスの解決が不安定になる環境で実行されているサービスに対するリージョン ロードバランサとサービス ディスカバリ メカニズムとして構築されています。

Eureka は、クライアント モデル、サーバーモデルとして設計されています。クライアントはサーバーに自身を登録し、ハートビートを定期的に送信します。サーバーは、クライアントに関連付ける名前を提供します。このサーバーにより、接続しているすべてのクライアントが名前を解決されます。

次の理由から、Kubernetes の Eureka ではなく、Kubernetes DNS を使用する必要があります。

  • DNS は、ライブラリを必要とせず、あらゆるプログラミング言語とアプリケーションで動作します。
  • アプリケーションの既存のヘルスチェックを再利用することで、エラーの組み合わせを減らすことができます。
  • Kubernetes が DNS サーバーを管理するため、依存関係を少なくすることができます。
  • Kubernetes DNS は、他の Kubernetes と同じポリシーと RBAC の制約に従います。

次のような場合は、Eureka サーバーをデプロイするほうが良いこともあります。

  • Kubernetes と VM ベースのアプリケーション全体でサービス ディスカバリが必要である。
  • クライアント ベースの負荷分散が必要である。
  • 独立したヘルスチェックが必要である。

次のステップ