概念モデル
Chip-in を構成する要素は外から見ると、1個のコアサービスと複数のマイクロサービスからなります。ブラウザからのアクセスをコアサービスで受け付けマイクロサービスに分散して処理を行います。接続の方向をマイクロサービスからコアサービスへの方向に限定することで前述の課題を解決します。コアサービスはグローバルIPとサーバ証明書を持ちます。マイクロサービスはクライアント証明書をもっており、コアサービスとの間で mTLS認証を行います。 ユーザからの HTTP アクセスをコアサービスの API Gateway で受け、SPN(Secure Private Network) 経由でマイクロサービスを集約します。
階層構造
クラス タ
Chip-in のクラスタ内には複数のサービスを収容することができます。クラスタはサービス間通信のためのプライベートなネットワークとインターネットとのゲートウェイを持ちます。
クラスタにコアサービスが含まれている場合は、ゲートウェイはグローバルIPを持ち、インターネットからの通信を受けつけ、HTTPS, QUIC の接続をコアサービスに DNAT します。
コアサービスが含まれていない場合は、ゲートウェイはコアサービスへの接続のみを提供します。 クラスタは IaaS 上に構築するのが一般的ですが、オンプレミス上のデバイスにアクセスする場合や開発環境などでは、単一サーバ上の docker compose であったり、 kubernaetes, docker swarm などのコンテナクラスタであったりします。
サービスとインスタンス
コアサービスもマイクロサービスもサービスの一種です。サービスにはインスタンスの定義が登録されており、デプロイするとインスタンスが起動されます。冗長負荷分散の目的で、一つのサービスに同じインスタンスを複数起動することもできます。これをレプリカセットと呼びます。
コンテナ
一つのイ ンスタンスの中に複数のコンテナを収容できます。その場合、メインとなるコンテナに対して補助的な機能を提供するコンテナをサイドカーと呼びます。 一つのインスタンスの中でコンテナ間通信する場合、127.0.0.* のアドレスで通信できます。この場合、通信はインスタンス内で閉じており、物理的にも一つのホストサーバの中で通信することが保証されます。逆にサイドカーをメインとなるコンテナと別のホストサーバに分散して動作させることはできません。
IaaS 上の用語
クラウドベンダごとの用語と Chip-in で使用する用語の対応は以下のとおりです。
Chip-in | AWS ECS | GCP Cloud Run | Azure Container Apps |
---|---|---|---|
クラスタ | ECS クラスタ | (GCPプロジェクト / リージョン) | 環境 (Environment) |
サービス | ECS サービス | Cloud Run サービス | コンテナアプリ (Container App) |
インスタンス | ECS タスク | Cloud Run インスタンス | Pod / レプリカ |
コンテナ | ECS コンテナ | コンテナ | コンテナ |
Chip-in の階層構造は docker compose, kubernaetes, docker swarm の個々の概念モデルに直接写像できません。個々の実装で同様の概念モデルを構成する必要があります。以下の課題が判明しています。
- docker compose はレプリカセットをサポートしていません。
- docker swarm はサイドカーをサポートしていません。
- kubernetes は機能的にすべてをサポートしていますが自由度が高すぎるため、IaCの書き方で Chip-in の階層構造を実装する必要があります。
マイクロサービス認証局
Chip-in に参画するマイクロサービスは必ずマイクロサービス認証局の認証を得なければなりません。 運用者はこの認証局の CP/CPS を定義する必要があります。 マイクロサービス証明書の発行は SCEP プロトコルにより、行われます。 SCEP サービスはCSRの内容が事前に承認された証明書の属性に一致した場合のみマイクロサービス証明書を発行します。
インベント リサービス
コアサービス内にはインベントリサービスが含まれています。インベントリサービスは S3 や etcd などの KVS をバックエンドに持ち、インベントリ Swagger ファイルで定義された Restful API を提供します。インベントリサービスには以下のものが登録されています。
- 登録済みマイクロサービス証明書のリスト
- マイクロサービス証明書を発行するCA局の証明書
- マイクロサービス定義のリスト
- ゾーン定義(ホスト定義、サーバ証明書を含む)
インベントリサービスはアクセス元のマイクロサービス証明書に含まれる拡張属性を使用してじ次世代アクセス制御(NBAC)を行う。NBAC は rego で記述され、opa-go などのクレートを使用して実装される。
API Gateway
API Gateway は Web アプリケーションをマイクロサービスに分割して実装するための基本的な機能を提供します。 たとえば、WebコンテンツやAPIを提供する Web サイトを構築する際に、以下のように WAFサービス、認証サービス、認可サービス、コンテンツサービス、APIサービス、データベースサービス、アクセスログサービス、監査ログサービス、時系列データベースサービスというようにマイクロサービスに分割して提供できます。API Gateway とマイクロサービスの間およびマイクロサービス間の通信は SPN を経由して行われます。 API Gateway はコアサービスのメインコンテナと動作します。
ゾーン
API Gateway にはDNSゾーンを登録します。ゾーンにゾーン同期サービスが登録されている場合、ゾーンの内容を API Gateway と同期します。 また、ACME サービスが登録されている場合、 ACME DNS-01 プロトコルでサーバ証明書を取得します。
レルム
Chip-in ではマルチテナント SaaS の提供を目的として、接続されるサービスをレルムと呼ばれるグループごとに論理的に完全に分離する機能を提供します。 API Gateway, SPN Hub などの基盤となるサービスのインスタンスはレルム間で共有しますが、配置されるサービスは異なるレルムに属するサービスとは一切通信することはできません。 master レルムはシステムで予約されており、レルムの作成、変更、削除などの管理するためのサービスが提供されます。