Capsule
Capsule は、複数の Namespace を Tenant カスタムリソースの下に束ね、admission webhook で分離を強制することで、単一の Kubernetes クラスタをマルチテナント基盤に変える。
- カテゴリ: Identity & Policy
- CNCF 成熟度: Sandbox
- 言語: Go
- ライセンス: Apache-2.0
- リポジトリ: projectcapsule/capsule
- ドキュメント基準コミット:
8d89d68(タグ v0.13.7 付近、2026-06-24)
何をするものか
Capsule はソフトマルチテナンシー向けの Kubernetes オペレータである。ソフトマルチテナンシーとは、多数のチームが 1 つの API サーバと 1 つのコントロールプレーンを共有し、境界をクラスタ分割や仮想コントロールプレーンではなく admission control と Role-Based Access Control (ロールベースアクセス制御、RBAC) で引く方式を指す。Capsule はクラスタスコープの Tenant Custom Resource Definition (カスタムリソース定義、CRD) を追加し、Namespace の集合・その所有者・適用ポリシーを 1 つにまとめる。
素の Kubernetes Namespace はフラットである。「これら 10 個の Namespace は 1 チームに属し quota を共有する」と表す native なオブジェクトは存在しない。チームはチームごとにクラスタを分けて回避しがちで、これがクラスタ乱立 (cluster sprawl) とその運用コストを生む。Capsule は単一クラスタ内でこの隙間を埋める。テナントオーナーは新しい Namespace をセルフサービスで作れ、Capsule は各 Namespace をテナントに定義された上限・NetworkPolicy・RoleBinding の枠内に保つ。
Capsule は 2 つの役割を持つ単一のコントローラバイナリとして動く。1 つはテナントのポリシーをメンバー Namespace へ同期する controller-runtime ベースの reconciler 群、もう 1 つは Namespace・Pod・Ingress などのリクエストを永続化前に横取りする admission webhook 群である。両者は cmd/controller/main.go:115 で 1 つの Manager に登録される。
いつ使うか
- API サーバを共有できる程度に相互信頼のある内部チームで 1 クラスタを共有し、各チームに quota の枠内で Namespace をセルフサービスさせたいとき。
- チームごとのクラスタを 1 クラスタ + 論理的なテナント境界へ集約し、クラスタ乱立を避けたいとき。
- Namespace 群へのポリシー (共有 quota、デフォルトの NetworkPolicy、RoleBinding、許可する storage / priority class) を、GitOps に乗る単一の宣言的オブジェクトとして表したいとき。
- 向かないのは、テナントが相互に非信頼であるか、テナント自身のクラスタスコープ資源や CRD を必要とする場合。そこは vCluster や Kamaji のような仮想/専用コントロールプレーンが適する。
このディープダイブの構成
- 歴史: Clastix での起源、中立な CNCF org への移管、マイルストーン。
- アーキテクチャ: controller 側と webhook 側の二面構成、および Namespace 作成の流れ。
- 採用事例・エコシステム: 出典のある採用組織、GitHub シグナル、代替。
- 内部実装: 所有権モデル、中核の型、追跡した 1 つのコードパス。
- はじめに: Helm でのインストールと最初のテナント作成。
出典
- projectcapsule/capsule (GitHub): https://github.com/projectcapsule/capsule
- Capsule プロジェクトページ (CNCF): https://www.cncf.io/projects/capsule/
- Sandbox Inclusion Results from December 13, 2022: https://lists.cncf.io/g/cncf-toc/message/7743
- CNCF Sandbox project onboarding (umbrella issue #812): https://github.com/projectcapsule/capsule/issues/812
- Project Capsule ドキュメント: https://projectcapsule.dev/
- Capsule インストールガイド: https://projectcapsule.dev/docs/operating/setup/installation/
- Capsule adopters: https://projectcapsule.dev/adopters/
- Capsule (clastix ミラーサイト): https://capsule.clastix.io/
- Dario Tranchitella の Capsule 公開告知スレッド: https://threadreaderapp.com/thread/1293084561908400128.html
- Comparing Multi-tenancy Options in Kubernetes (vCluster): https://www.vcluster.com/blog/comparing-multi-tenancy-options-in-kubernetes
- Building a Multi-Tenancy Platform with Capsule and vCluster (SREKubeCraft): https://srekubecraft.io/posts/k8s-multi-tenancy/
- ADOPTERS.md @ commit 8d89d68: https://github.com/projectcapsule/capsule/blob/main/ADOPTERS.md
- MAINTAINERS.md @ commit 8d89d68: https://github.com/projectcapsule/capsule/blob/main/MAINTAINERS.md
- GitHub REST API repos/projectcapsule/capsule: https://api.github.com/repos/projectcapsule/capsule