アーキテクチャ
全体像
Karmada は独立したコントロールプレーンである: 専用の karmada-apiserver と etcd が、素の Kubernetes リソーステンプレートと Karmada の CRD の両方を保持する。メンバークラスタは Cluster オブジェクトとして登録される。コントローラ群とスケジューラが、1 つのテンプレートと PropagationPolicy を、クラスタごとの Work オブジェクトに変換する。Work はコントロールプレーン (Push) かメンバー内のエージェント (Pull) によってメンバークラスタへ適用される。各コンポーネントは cmd/ 配下の cobra アプリで、func main が app.NewXxxCommand を呼ぶ。
コンポーネント
karmada-controller-manager
中核プロセス。リソース detector と、ResourceBinding および Work を構築するコントローラ群を駆動する。エントリポイントは cmd/controller-manager/controller-manager.go:30。
karmada-scheduler
各 ResourceBinding にクラスタを割り当てる。filter/score/select/assign パイプラインを動かし、結果を binding の spec.Clusters に書き戻す。cmd/scheduler と pkg/scheduler 配下。
karmada-agent
Pull モード用。メンバークラスタ内で動作し、コントロールプレーンへ外向きに接続して Work をローカルに適用する。cmd/agent 配下。
補助コンポーネント
karmada-aggregated-apiserver(cmd/aggregated-apiserver):cluster/proxyなどの集約 API。karmada-search(cmd/karmada-search): クラスタ横断のリソース検索とキャッシュ。karmada-deschedulerとkarmada-scheduler-estimator(cmd/descheduler,cmd/scheduler-estimator): 再スケジュールとメンバークラスタの実残容量見積もり。karmada-metrics-adapter(cmd/metrics-adapter): federated HPA 向けにクラスタ横断でメトリクスを集約。karmada-webhook(cmd/webhook): admission。karmadactl/kubectl-karmada(cmd/karmadactl,cmd/kubectl-karmada): CLI。initがコントロールプレーンを構築する (pkg/karmadactl/cmdinit/cmdinit.go:121)。operator/: Karmada インスタンスをKarmadaCRD で宣言管理する。
リクエストの流れ
1 個の Deployment をメンバークラスタへ配布する流れ:
- detector が
pkg/detector/detector.go:231(Reconcile) でテンプレート変更を拾い、PropagationPolicyをマッチさせApplyPolicy(detector.go:441) を適用する。BuildResourceBinding(detector.go:822) がResourceBindingを生成し、そのspec.Resourceがテンプレートを参照、spec.Placementがポリシーの配置ルールを持つ。 - スケジューラが
pkg/scheduler/scheduler.go:359(scheduleNext) で反応し、doScheduleBinding(scheduler.go:395) からscheduleResourceBinding(scheduler.go:571)、affinity ベースの配置ではscheduleResourceBindingWithClusterAffinity(scheduler.go:590) を経てs.Algorithm.Schedule(...)(scheduler.go:600) を呼ぶ。 - スケジューリングアルゴリズム本体は
pkg/scheduler/core/generic_scheduler.go:71(Schedule)。filter プラグイン (findClustersThatFit,generic_scheduler.go:119)、score プラグイン (prioritizeClusters,generic_scheduler.go:166)、selectClusters(generic_scheduler.go:196,core/common.go:34のSelectClusters)、assignReplicas(generic_scheduler.go:201,core/common.go:51のAssignReplicas) を順に走らせる。スケジューラは結果を binding のspec.Clustersに patch する (patchScheduleResultForResourceBinding,scheduler.go:610)。 - binding コントローラが
pkg/controllers/binding/binding_controller.go:70(Reconcile) でsyncBinding(binding_controller.go:110)、続いてensureWork(pkg/controllers/binding/common.go:53) を呼ぶ。対象クラスタごとに workload を DeepCopy し、レプリカ数をスケジュール結果で上書きし、override ポリシーを適用 (common.go:109) し、per-cluster の実行 namespacekarmada-es-<cluster>にWorkを生成する。 - execution コントローラが
pkg/controllers/execution/execution_controller.go:82(Reconcile) でsyncWork(execution_controller.go:151)、syncToClusters(execution_controller.go:266) を呼び、各マニフェストをObjectWatcher.Create/Update(execution_controller.go:324,:332) でメンバー API に適用し、成功でWorkに Applied を立てる (execution_controller.go:302)。
pkg/controllers/status 配下の status コントローラ群が逆向きに走り、各メンバーの実状態を Work から ResourceBinding、テンプレートへ集約する。
主要な設計判断
- Push と Pull: Push はコントロールプレーンがメンバー API を直接叩く。Pull は
karmada-agentが外向きに接続するため、NAT やファイアウォール背後のクラスタでも動く (karmada.io)。 - テンプレートは触らず、レプリカはスケジューリングが所有:
ensureWorkは workload のレプリカ数を常にスケジュール結果で上書きし、テンプレートを信用しない。手で書き換えたテンプレートがスケジューラの quota や queue 計上を迂回できないようにするためである (pkg/controllers/binding/common.go:80-96)。 - クラスタごとの実行隔離: 各メンバークラスタの
Workは専用 namespacekarmada-es-<cluster>に置かれ (pkg/util/names/names.go:80,92)、配布状態を宛先ごとに分離する。
拡張ポイント
- PropagationPolicy / ClusterPropagationPolicy と OverridePolicy CRD で配置とクラスタごとのカスタマイズを制御する (
pkg/apis/policy/v1alpha1/propagation_types.go:52)。 - Resource Interpreter Framework: インターフェース (
pkg/resourceinterpreter/interpreter.go:50) と、Lua スクリプト実装 (ResourceInterpreterCustomizationCRD) により、任意の CRD についてレプリカの読み取り・改訂・status 集約を Karmada に教える。 - スケジューラフレームワークのプラグイン: filter と score プラグイン。スコアは 0..100 に制限される (
pkg/scheduler/framework/interface.go:39-42)。 - Admission webhook (
cmd/webhook)。