ワークロード管理
個々の Pod を直接作成する こともできますが、本番環境では Pod を手動で管理することはほとんどありません。代わりに、ワークロードコントローラーを使用します。これは、さまざまなアプリケーションパターンに応じて Pod を作成・管理する上位レベルの Kubernetes リソースです。
ワークロードコントローラーは、以下のような賢いマネージャーと考えてください:
- 定義したテンプレートに基づいて Pod を作成
- Pod の健全性を監視し、障害が発生したインスタンスを置き換え
- 需要に応じてスケーリングを処理
- ローリングデプロイメントのような戦略で更新を管理
- さまざまなアプリケーションタイプに対して特化した動作を提供
ワークロードコントローラーの種類
Kubernetes は、特定のユースケース向けに設計されたいくつかのワークロードコントローラーを提供しています:
- Deployment は、ステートレスアプリケーション向けに複数の同一 Pod を管理します。スケーリング、ローリングアップデート、障害が発生した Pod の自動置換を処理します。任意の Pod が任意のリクエストを処理できる Web アプリケーションに最適です。
- ReplicaSet は、指定された数の同一 Pod が常に実行され ていることを保証します。ReplicaSet を直接作成することはほとんどありませんが、Deployment が Pod を管理するために内部で使用する構成要素です。
- StatefulSet は、ステートフルアプリケーション向けに安定したアイデンティティと永続的ストレージを提供します。各 Pod は一意の名前(
mysql-0、mysql-1など)と独自の Persistent Volume を取得します。データベースやクラスター化されたアプリケーションに不可欠です。 - DaemonSet は、各ノード(または選択されたノード)で正確に 1 つの Pod が実行されることを保証します。ログコレクターや監視エージェントなど、クラスター内のあらゆる場所で実行する必要があるシステムレベルのサービスに最適です。
- Job は、Pod が正常に完了するまで実行し、その後停止します。他のコントローラーとは異なり、完了した Pod を再起動しません。データ移行やバッチ処理などの一度きりのタスクに最適です。
- CronJob は、使い慣れた cron 構文を使用してスケジュールに従って Job を作成します。バックアップ、レポート生成、クリーンアップ操作などの定期的なタスクに最適です。
コントローラー階層の理解
これらのコントローラーがどのように関連しているかを理解することは役立ちます:
Deployment → ReplicaSet → Pod
Deployment を作成すると、以下のことが起こります:
- Deployment が ReplicaSet を作成・管理
- ReplicaSet が実際の Pod を作成・管理
- Pod がアプリケーションコンテナを実行
この階層的なアプローチにより、強力な機能が実現されます:
- ローリングアップデート: Deployment は古い ReplicaSet を徐々にスケールダウンしながら新しい ReplicaSet を作成
- ロールバック: Deployment は以前の ReplicaSet バージョンに戻すことが可能
- スケーリング: レプリカ数の変更が ReplicaSet を通じて Pod に伝播
デバッグ時に ReplicaSet を見ることがよくありますが(kubectl get rs など)、通常は Deployment を通じて間接的に管理します。
ワークロードコントローラーを使用する理由
Pod を直接管理する場合:
- 障害時の手動での Pod 置換
- 組み込みのスケーリングメカニズムがない
- 複雑な更新手順
- ロールバック機能がない
- 本番環境での管理が困難
ワークロードコントローラーを使用する場合:
- Pod の自動置換と自己修復
- 単一のコマンドで簡単にスケーリング
- ダウンタイムなしのローリングアップデート
- 以前のバージョンへの簡単なロールバック
- 本番環境に対応した管理
| コントローラー | 目的 | 最適な用途 |
|---|---|---|
| Deployment | ステートレスアプリケーション | Web アプリ、API、マイクロサービス |
| ReplicaSet | Pod レプリカの維持 | 通常は Deployment によって管理 |
| StatefulSet | ステートフルアプリケーション | データベース、メッセージキュー |
| DaemonSet | ノードレベルサービス | ロギングエージェント、監視 |
| Job | 完了まで実行するタスク | データ移行、バッチ処理 |
| CronJob | スケジュールされたタスク | バックアップ、レポート、クリーンアップ |
適切なワークロードコントローラーの選択
適切なコントローラーを選択するために、以下の質問を自問してください:
どのようなタイプのアプリケーションを実行していますか?
-
Web アプリ、API、またはマイクロサービス? → Deployment を使用
- Pod は交換可能でステートレス
- 複数の同一コピーを実行可能
- 例:小売ストアの UI、カタログサービス
-
データベースまたはメッセージキュー? → StatefulSet を使用
- 永続的ストレージが必要
- 安定したネットワークアイデンティティが必要
- 例:MySQL データベース、Kafka クラスター
-
すべてのノードで実行するシステムサービス? → DaemonSet を使用
- 監視、ロギング、またはネットワーキング
- ノードごとに自動的に 1 つの Pod
- 例:ログコレクター、ノード監視
-
一度きりのタスクまたはバッチジョブ? → Job を使用
- 完了まで実行
- データベース移行、データ処理
- 例:製品カタログのインポート
-
定期的にスケジュールされたタスク? → CronJob を使用
- スケジュールに従って実行(cron のように)
- バックアップ、レポート、クリーンアップ
- 例:日次売上レポートの生成
覚えておくべき重要なポイント
- さまざまなワークロードコントローラーが、異なるアプリケーションパターンに対応
- Deployment は、同一のレプリカを持つことができるステートレスアプリケーション向け
- StatefulSet は、永続的なアイデンティティが必要なステートフルアプリケーション向け
- DaemonSet は、システムレベルサービスのためにすべてのノードで Pod を実行
- Job はタスクを完了まで実行、CronJob はスケジュールに従って実行
- アプリケーションの要件に基づいて適切なコントローラーを選択
各ワークロードタイプを探索
ワークロードコントローラーの概要を理解したところで、各タイプについてさらに深く掘り下げてみましょう:
- Deployment - 小売ストア UI のようなステートレスアプリケーションのデプロイと管理を学習
- StatefulSet - 永続的ストレージを持つデータベースのようなステートフルアプリケーションの実行方法を理解
- DaemonSet - すべてのノードで実行されるシステムレベルサービスを探索
- Job & CronJob - バッチ処理とスケジュールされたタスクをマスター