メインコンテンツまでスキップ

ワークロード管理

個々の Pod を直接作成することもできますが、本番環境では Pod を手動で管理することはほとんどありません。代わりに、ワークロードコントローラーを使用します。これは、さまざまなアプリケーションパターンに応じて Pod を作成・管理する上位レベルの Kubernetes リソースです。

ワークロードコントローラーは、以下のような賢いマネージャーと考えてください:

  • 定義したテンプレートに基づいて Pod を作成
  • Pod の健全性を監視し、障害が発生したインスタンスを置き換え
  • 需要に応じてスケーリングを処理
  • ローリングデプロイメントのような戦略で更新を管理
  • さまざまなアプリケーションタイプに対して特化した動作を提供

ワークロードコントローラーの種類

Kubernetes は、特定のユースケース向けに設計されたいくつかのワークロードコントローラーを提供しています:

  • Deployment は、ステートレスアプリケーション向けに複数の同一 Pod を管理します。スケーリング、ローリングアップデート、障害が発生した Pod の自動置換を処理します。任意の Pod が任意のリクエストを処理できる Web アプリケーションに最適です。
  • ReplicaSet は、指定された数の同一 Pod が常に実行されていることを保証します。ReplicaSet を直接作成することはほとんどありませんが、Deployment が Pod を管理するために内部で使用する構成要素です。
  • StatefulSet は、ステートフルアプリケーション向けに安定したアイデンティティと永続的ストレージを提供します。各 Pod は一意の名前(mysql-0mysql-1 など)と独自の Persistent Volume を取得します。データベースやクラスター化されたアプリケーションに不可欠です。
  • DaemonSet は、各ノード(または選択されたノード)で正確に 1 つの Pod が実行されることを保証します。ログコレクターや監視エージェントなど、クラスター内のあらゆる場所で実行する必要があるシステムレベルのサービスに最適です。
  • Job は、Pod が正常に完了するまで実行し、その後停止します。他のコントローラーとは異なり、完了した Pod を再起動しません。データ移行やバッチ処理などの一度きりのタスクに最適です。
  • CronJob は、使い慣れた cron 構文を使用してスケジュールに従って Job を作成します。バックアップ、レポート生成、クリーンアップ操作などの定期的なタスクに最適です。

コントローラー階層の理解

これらのコントローラーがどのように関連しているかを理解することは役立ちます:

Deployment → ReplicaSet → Pod

Deployment を作成すると、以下のことが起こります:

  1. Deployment が ReplicaSet を作成・管理
  2. ReplicaSet が実際の Pod を作成・管理
  3. Pod がアプリケーションコンテナを実行

この階層的なアプローチにより、強力な機能が実現されます:

  • ローリングアップデート: Deployment は古い ReplicaSet を徐々にスケールダウンしながら新しい ReplicaSet を作成
  • ロールバック: Deployment は以前の ReplicaSet バージョンに戻すことが可能
  • スケーリング: レプリカ数の変更が ReplicaSet を通じて Pod に伝播

デバッグ時に ReplicaSet を見ることがよくありますが(kubectl get rs など)、通常は Deployment を通じて間接的に管理します。

ワークロードコントローラーを使用する理由

Pod を直接管理する場合:

  • 障害時の手動での Pod 置換
  • 組み込みのスケーリングメカニズムがない
  • 複雑な更新手順
  • ロールバック機能がない
  • 本番環境での管理が困難

ワークロードコントローラーを使用する場合:

  • Pod の自動置換と自己修復
  • 単一のコマンドで簡単にスケーリング
  • ダウンタイムなしのローリングアップデート
  • 以前のバージョンへの簡単なロールバック
  • 本番環境に対応した管理
コントローラー目的最適な用途
DeploymentステートレスアプリケーションWeb アプリ、API、マイクロサービス
ReplicaSetPod レプリカの維持通常は 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 - バッチ処理とスケジュールされたタスクをマスター