Skip to content

hub オーバーレイでマイクロサービスを接続する

シナリオ

複数のサービスを独立してデプロイしているとします。仕様やロールアウトの予定が異なり、ノード、クラスター、NAT 配下にある開発者のノート PC も異なるかもしれません。IP アドレスを固定で書き込んだり、サービスメッシュを用意したりせずに、各サービスが安定した名前でほかのサービスへ到達できる必要があります。Cornus サーバーはスター型ハブとして動作します。各ワークロードはスポークとして参加し、自身がホストするサービスを登録して、ほかのスポークのサービスへ名前で到達します。ハブが通信データを中継します。

使用するもの

  • ワークロード間ハブオーバーレイと、その中継方式。ワークロードハブを参照してください。
  • クラスター内ワークロード向けデプロイスペックの hub: ブロック。デプロイスペックを参照してください。
  • ノート PC を含む任意の場所からオーバーレイに参加するための cornus hubcornus hubを参照してください。

手順

  1. データベースをデプロイし、ハブに公開します。 hub: ブロックによりワークロードがオーバーレイに参加します。export には、このワークロードがホストするサービスの名前を指定します。ハブが Pod に直接接続できない場合は、エクスポートに deliver: true を指定してください。ハブが Pod に中継し、Pod は localhost のポートへ接続します。

    yaml
    # db.yaml
    name: db
    image: cornus.example:5000/postgres:16
    hub:
      identity: db
      export:
        - { name: db, port: 5432, deliver: true }
    sh
    cornus deploy -f db.yaml --server http://cornus.example:5000 --detach
  2. API をデプロイし、データベースを名前で取り込みます。 import には、このワークロードが到達するサービスを列挙します。バックエンドは取り込みごとに合成ループバック IP を割り当て、DNS レコードを設定して caretaker リスナーをバインドします。そのため、API コンテナ内からの通常の db:5432 への接続は、アプリケーションを変更せずにハブへ流れます。

    yaml
    # api.yaml
    name: api
    image: cornus.example:5000/api:v1
    env:
      DATABASE_URL: postgres://db:5432/shop
    hub:
      identity: api
      export:
        - { name: api, port: 8080 }
      import:
        - { name: db, ports: [5432] }
    sh
    cornus deploy -f api.yaml --server http://cornus.example:5000 --detach

    API は db:5432 としてデータベースに到達し、自身を取り込む相手には api として提供されます。どちらもアドレスを固定で書き込む必要はありません。

  3. ノート PC からオーバーレイ上のサービスに到達します。 NAT 配下の開発者は cornus hub を使って同じオーバーレイにスポークとして参加し、オーバーレイの db サービスへ転送するローカルループバックポートをバインドします。サーバーは --server または選択済みの接続プロファイルから解決されます。

    sh
    cornus hub --identity laptop --reach db=127.0.0.1:5432
    # ここで実行: psql 'host=127.0.0.1 port=5432 dbname=shop ...'

    同じコマンドで --register name=host:port を使うと、ローカルで実行中のサービスをオーバーレイに提供することもできます。ノート PC 上で開発中のサービスにも、作業を繰り返している間、クラスターから名前で到達できます。

仕組み

各参加者はスポークであり、サーバーがハブです。スポークはホストするサービスを、次の二つのモードのいずれかで登録します。

  • 直接接続 — ハブが到達できるアドレスでサービスを登録し、ハブ自身が接続します。
  • 配送 (中継) — 到達可能なアドレスなしでサービスを登録します (エクスポートの deliver: true、またはすべての cornus hub --register)。ハブはサービスをホストするスポークにイングレスストリームを戻して開き、スポークが自身のローカル接続先へ接続してストリームをつなぎます。これにより、NAT 配下のノート PC やクラスターをまたぐ Pod にも到達できます。ハブ自身にそこへの経路は必要ありません。

ピアに到達するには、送信元スポークがサービス名を指定したデータストリームを開きます。ハブはそれを検索して自身で接続するか、所有するスポークを通じて配送し、データをコピーします。TCP と UDP の両方を利用できます。/udp 形式の protocol: udp で UDP を選択します。クラスター内ワークロードでは、すべてを hub: ブロックに宣言します。ノート PC やクラスター外のホストでは、cornus hub --register / --reach により CLI から同じオーバーレイに参加できます。exportimportimportDynamicidentity を含む全フィールドはデプロイスペックリファレンスにあります。

アクセスは二つの任意のポリシーマトリクスで管理され、設定されている場合にだけ適用されます。到達マトリクス (呼び出し元 ID から許可する呼び出し先サービス、CORNUS_HUB_POLICY) と、登録マトリクス (ID からホスト可能なサービス名、CORNUS_HUB_REGISTER_POLICY) です。スポークは identity を宣言しますが、mTLS では検証済みクライアント証明書の CommonName から ID を取得します。したがって、ポリシーではスポークが偽造できない資格情報をキーとして使用します。ID とポリシーの仕組みはワークロードハブを参照してください。

バリエーション

  • 動的検出。 静的な import リストの代わりに、共通のポートセットを指定して importDynamic を設定します。caretaker はハブカタログのプッシュを購読し、サービスが現れたり消えたりすると、カタログ内の各サービスにリスナーをバインドします。
  • UDP サービス。 エクスポートまたはインポートに protocol: udp を追加すると、データをコピーする UDP フローを利用できます。
  • バックエンドをまたぐ接続。 ハブがデータを中継するため、同じハブに接続するスポークであれば、バックエンドやクラスターが異なっても同じ方法で相互に到達できます。

関連項目: ワークロード間 hub · ネットワークと conduit · デプロイスペック · cornus hub

Released under the Apache-2.0 License.