Sveltosによるシンプルで柔軟なKubernetesクラスタ運用

みなさまこんにちは、れおりんです。

この記事では、Kubernetesクラスタの運用をよりシンプルかつ柔軟にする「[Sveltos]()」というツールについて紹介していきます。複雑なマルチクラスター環境でのアドオンやアプリケーション展開を、Sveltosはどのように効率化できるのか、その概要やメリット、考え方をザックリとまとめていこうと思います。

## Sveltosとはなにか？

Sveltosは、Kubernetesマルチクラスタ環境におけるアドオン管理を簡素化するコントローラです。管理クラスタ(マネジメントクラスタ)にインストールすることで、以下のようなことを可能にします：

* 複数クラスタへのアドオン・アプリケーションの自動デプロイ・管理
* Helmチャート、YAML、Kustomize、Carvel ytt、Jsonnetといった様々なフォーマットに対応
* テンプレート的なリソース定義で、各クラスタ環境の差異に柔軟に対応

マルチクラスター環境を扱う際は、各クラスタごとの設定やバージョン、ネットワークポリシー、セキュリティなどが複雑になりがちです。Sveltosはこれらを一元的にコントロールし、変更があれば自動的に適用・同期してくれます。

## Cluster API (CAPI)との組み合わせ

Sveltosは、Cluster API で管理されるクラスタ(CAPIクラスタ)や、その他のKubernetesクラスタを一元的に扱うことができます。Cluster APIはKubernetes上でクラスタそのものを定義・ライフサイクル管理する仕組みを提供し、インフラ抽象化やクラスタの増減、アップグレードなどを容易にします。

SveltosがCAPIクラスタと組み合わさると、以下のようなメリットが得られます：

* クラスタ作成からアドオン展開までの自動化：Cluster APIで新たなクラスタを作成した際、Sveltosが自動的に必要なアドオンを適用できます。
* ライフサイクルの統合管理：CAPIによるインフラとクラスタのライフサイクル管理と、Sveltosによるアドオン層の統合管理により、クラスタ運用全体をコード化・自動化し、統一的なパイプラインを構築できます。
* 異種環境への一元的適用：CAPI以外のKubernetesクラスタもSveltos管理下に置くことで、Cluster APIがサポートするクラウドやオンプレ環境、あるいは手動で管理している既存クラスタにも一貫したアドオン配信戦略を適用できます。

要するに、Cluster APIがクラスタの「生命線（生命管理と進化）」を担当し、Sveltosがその上での「機能拡張や設定適用」を担当することで、マルチクラスタ環境の運用をよりシンプルかつスケーラブルにするわけです。

## テンプレート指向のアドオン管理

Sveltosでは、アドオンやアプリケーションを「テンプレート」として定義し、そこから各クラスタに合わせて展開します。このアプローチには以下の利点があります：

* 再利用性の向上：同一のアドオン設定を、環境ごとの差異（バージョン、ネットワーク設定など）に合わせてわずかな変更で各クラスタへ適用可能
* 統一的な運用スタイル：標準化されたテンプレートを用いることで、大規模なマルチクラスター環境でも共通のポリシーや設定を展開しやすくなる

## ProfilesとClusterProfilesの違い

Sveltosには、「Profiles」と「ClusterProfiles」という2つの類似した管理手段があります：

* ClusterProfiles：任意のネームスペースに跨って、グローバルなポリシーやアドオンを適用できます。プラットフォーム管理者やインフラ担当者が、全てのクラスタに共通で入れたいアドオンやガバナンス設定を一元的に行うのに向いています。
* Profiles：特定のネームスペースに制限され、そこに紐づくクラスタに対してのみアドオン展開や設定適用を行います。これにより、チームやテナントごとに独立した管理が可能になり、他のテナントやネームスペースに影響を与えません。

つまり、ClusterProfilesは「全体管理用」、Profilesは「特定空間ごとの管理用」 と押さえるとわかりやすいでしょう。

## カスタムリソース例：ClusterProfile

ここで、実際のClusterProfileリソースの例を見てみましょう。

### HelmチャートとYAMLリソースを使った例

```yaml
apiVersion: config.projectsveltos.io/v1beta1
kind: ClusterProfile
metadata:
  name: deploy-kyverno
spec:
  clusterSelector:
    matchLabels:
      env: prod
  syncMode: Continuous
  helmCharts:
  - repositoryURL:    https://kyverno.github.io/kyverno/
    repositoryName:   kyverno
    chartName:        kyverno/kyverno
    chartVersion:     v3.0.1
    releaseName:      kyverno-latest
    releaseNamespace: kyverno
    helmChartAction:  Install
    values: |
      admissionController:
        replicas: 3
  policyRefs:
  - name: storage-class
    namespace: default
    kind: Secret
  - name: contour-gateway
    namespace: default
    kind: ConfigMap
```

ポイント：

* clusterSelector：env: prodというラベルを持つクラスタにこの設定を適用します。これにより、指定した環境属性を持つ全クラスタへKyvernoのHelmチャートや追加のリソースが適用されます。
* syncMode: Continuous：常時クラスタ状態を監視し、定義との不整合（ドリフト）が発生した場合に自動修正します。
* helmCharts：Kyvernoチャートをv3.0.1でkyvernoネームスペースにインストールします。valuesでレプリカ数などの詳細設定を注入できます。
* policyRefs：SecretやConfigMapを参照し、それらに含まれるYAMLマニフェスト（例: storage-class定義やcontour-gateway定義）を対象クラスタに適用します。

このようにClusterProfileは、「どのクラスタに、どのアドオンやリソースを、どの状態で適用するか」を一元的に表現できます。

### FluxとKustomizeを組み合わせた例

```yaml
apiVersion: config.projectsveltos.io/v1beta1
kind: ClusterProfile
metadata:
  name: flux-system
spec:
  clusterSelector:
    matchLabels:
      env: fv
  syncMode: Continuous
  kustomizationRefs:
  - namespace: flux-system
    name: flux-system
    kind: GitRepository
    path: ./helloWorld/
    targetNamespace: eng
```

ポイント：

* kustomizationRefs：ここではFlux経由で管理しているGitRepositoryリソースを参照し、その中にあるhelloWorld/ディレクトリ配下のKustomizeマニフェストを適用します。
* targetNamespace：engというネームスペースにデプロイリソースを配置します。
* clusterSelectorでenv: fvというラベルを持つクラスタに対して、このGitリポジトリ由来のリソースをKustomizeを通じて展開します。

これにより、FluxとSveltosを組み合わせることで、GitOps的な運用をマルチクラスタに拡張できます。FluxがGitリポジトリを同期し、Sveltosがそのテンプレートを対象クラスタに適用するイメージです。

## デプロイ順序や依存関係、イベントドリブンにも対応

Sveltosはアドオンをデプロイする際、以下のような柔軟な制御が可能です：

* デプロイ順序の明示的な指定：ProfileやClusterProfile内に定義したアドオンを記述順通りに適用し、依存関係を明確に表現できます。
* ClusterProfiles間の依存関係：あるアドオンを適用する前に、別のプロファイルで適用されるアドオンを待つなど、段階的なロールアウトが可能です。
* イベントドリブンフレームワーク：特定のイベント（クラスタの状態変化やリソース更新など）に応じてアドオンを自動導入・更新します。

## SyncModeで運用スタイルを選べる

Sveltosは、「SyncMode」という概念により、アドオン展開のスタイルを選択できます：

* OneTime：初期構築時など、一度きりのアドオン導入に有効。CAPIで新クラスタを起動した後、Sveltosが初期アドオンを導入し、その後はクラスタ側の仕組みに任せる、といった使い方が想定できます。
* Continuous：常に変更を監視し、プロファイルの更新やクラスタ側の状態変化に合わせて自動的に設定を維持します。全てのクラスタで常に最新ポリシーをキープしたい場合に有効です。
* ContinuousWithDriftDetection：クラスタ状態のドリフト（意図せぬずれ）を検知し、自動修正します。セキュリティポリシーが書き換わった際も即座に復元し、常に正しい状態を保てます。

## 演習用ドキュメントやリソースも豊富

Sveltosにはわかりやすいドキュメントやクイックスタートガイドがあり、テスト用クラスタで簡単に試せます。また、HelmやKustomize、Fluxなどの既存ツールとの組み合わせも容易で、既存の知識資産を有効活用できます。

## 開発者が参加しやすいエコシステム

Sveltosはオープンソースで、以下を通じてコミュニティに参加できます：

* GitHub Issues：改善提案やバグ報告
* Slack：気軽な相談やコミュニティメンバーとの交流
* YouTube：デモ動画で実践的な使い方を学べます

自分で拡張・改善ができるので、プロジェクトへの貢献や独自ニーズへのカスタマイズにも柔軟に対応可能です。

## まとめ

マルチクラスター環境の運用は、設定、バージョン、アドオン、依存関係……と多くの要素が絡み合い、複雑さを増しがちです。Sveltosはこうした複雑性に対処するため、以下を実現します：

* クラスタ間の設定を統一的に管理し、マルチクラスター運用をシンプル化
* テンプレート化によるアドオン再利用性の向上
* ProfilesやClusterProfilesで適切なスコープによる階層的な管理を実現
* ドリフト検知やイベントドリブンな展開で常にクラスタ状態を理想形に維持

特に、Cluster APIと組み合わせることで、クラスタのライフサイクル管理からアドオン展開までを統合的に扱うことができ、より洗練されたマルチクラスタ管理が可能になります。

興味があれば、ぜひ公式ドキュメントやGitHubリポジトリをチェックしてみてください！