hub オーバーレイでマイクロサービスを接続する
シナリオ
複数のサービスを独立してデプロイしているとします。仕様やロールアウトの予定が異なり、ノード、クラスター、NAT 配下にある開発者のノート PC も異なるかもしれません。IP アドレスを固定で書き込んだり、サービスメッシュを用意したりせずに、各サービスが安定した名前でほかのサービスへ到達できる必要があります。Cornus サーバーはスター型ハブとして動作します。各ワークロードはスポークとして参加し、自身がホストするサービスを登録して、ほかのスポークのサービスへ名前で到達します。ハブが通信データを中継します。
使用するもの
- ワークロード間ハブオーバーレイと、その中継方式。ワークロードハブを参照してください。
- クラスター内ワークロード向けデプロイスペックの
hub:ブロック。デプロイスペックを参照してください。 - ノート PC を含む任意の場所からオーバーレイに参加するための
cornus hub。cornus hubを参照してください。
手順
データベースをデプロイし、ハブに公開します。
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 }shcornus deploy -f db.yaml --server http://cornus.example:5000 --detachAPI をデプロイし、データベースを名前で取り込みます。
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] }shcornus deploy -f api.yaml --server http://cornus.example:5000 --detachAPI は
db:5432としてデータベースに到達し、自身を取り込む相手にはapiとして提供されます。どちらもアドレスを固定で書き込む必要はありません。ノート PC からオーバーレイ上のサービスに到達します。 NAT 配下の開発者は
cornus hubを使って同じオーバーレイにスポークとして参加し、オーバーレイのdbサービスへ転送するローカルループバックポートをバインドします。サーバーは--serverまたは選択済みの接続プロファイルから解決されます。shcornus 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 から同じオーバーレイに参加できます。export、import、importDynamic、identity を含む全フィールドはデプロイスペックリファレンスにあります。
アクセスは二つの任意のポリシーマトリクスで管理され、設定されている場合にだけ適用されます。到達マトリクス (呼び出し元 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