Kubernetes

Deployment でぷろいめんと

PodReplicaSetローリングアップデートスケーリング自己修復Kubernetes
Deploymentについて教えて

簡単に言うとこんな感じ!

Deployment(デプロイメント)は、「このアプリを3台分動かしておいて、クラッシュしたら自動で直して、更新するときも止めずにやっておいて」を一枚の設定書で叶えてくれる、Kubernetesの”現場監督”みたいな仕組みだよ!


Deploymentとは

Kubernetesでアプリケーションをどのように動かし続けるかを宣言する設定オブジェクトです。「Podを何台起動するか」「どのコンテナイメージを使うか」「更新時にどう切り替えるか」をまとめて定義でき、Kubernetesがその状態を常に維持しようとします。

たとえば「Webサーバーを3台動かしたい」と Deployment に書いておくと、万が一1台が落ちても自動的に新しいPodを起動して3台を保ちます。これを自己修復(Self-healing)と呼びます。手動で監視・復旧していた運用作業をKubernetesに任せられるのが最大の価値です。

Deployment は直接Podを管理するのではなく、ReplicaSetという中間オブジェクトを介してPodを管理します。この構造により、アプリのバージョンアップ時に旧ReplicaSetから新ReplicaSetへ段階的に切り替えるローリングアップデートが実現されています。


Deploymentの構造と仕組み

オブジェクトの関係

Deployment
 └─ ReplicaSet(新)  ← 新バージョンのPodを管理
 │   ├─ Pod
 │   ├─ Pod
 │   └─ Pod
 └─ ReplicaSet(旧)  ← ロールバック用に保持
要素役割
Deployment「何をどう動かすか」の設計書。ユーザーが書く
ReplicaSetDeploymentに作られる中間管理者。Pod数を維持する
Pod実際にコンテナが動く最小単位

Deploymentのマニフェスト(設定ファイル)例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 3                   # Podを3台維持
  selector:
    matchLabels:
      app: my-web-app
  template:
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
      - name: web
        image: nginx:1.25       # 使うコンテナイメージ
        ports:
        - containerPort: 80
  strategy:
    type: RollingUpdate         # 更新方法
    rollingUpdate:
      maxSurge: 1               # 一時的に増やせる台数
      maxUnavailable: 0         # 同時に落としてよい台数

ローリングアップデートの流れ

[旧 v1] Pod×3  →  新Pod(v2)追加 → 旧Pod(v1)削除 → 繰り返し → [新 v2] Pod×3
         ↓               ↓                ↓
       稼働中         無停止で切替え      完了

maxUnavailable: 0 にすると常に最低3台が稼働した状態でアップデートが進むため、ユーザーからはサービス停止なしに見えます

覚え方

「D(Deployment)は現場監督、R(ReplicaSet)は職長、P(Pod)は作業員」 監督が「3人でやれ」と指示 → 職長が人数を管理 → 作業員が実際に仕事、と覚えると迷わない!


歴史と背景

  • 2014年 — Kubernetesがオープンソース化。当初はReplicationControllerというシンプルな仕組みでPod数を管理していた
  • 2016年apps/v1beta1 として Deployment が導入。ローリングアップデートやロールバック機能を備え、ReplicationControllerの後継として設計された
  • 2018年(v1.9)apps/v1 として正式安定版(GA)に昇格。以降、Kubernetesでアプリを動かす際の事実上のスタンダードになる
  • 現在 — ほぼすべてのKubernetes上のWebアプリ・APIサーバー・バッチ処理の定義にDeploymentが使われており、HelmチャートやArgo CDなどのツールも前提として設計されている

Deploymentと関連オブジェクトの比較

Kubernetesにはアプリを動かすオブジェクトが複数あります。Deploymentはその中でもステートレス(状態を持たない)アプリに最適化されたものです。

オブジェクト主な用途特徴
DeploymentWebサーバーやAPIなど一般的なアプリローリングアップデート・スケール・自己修復
StatefulSetDBやキャッシュなど状態を持つアプリPodごとにIDと永続ストレージを付与
DaemonSet監視エージェントやログ収集など全ノードに必ず1台ずつ起動
Job / CronJobバッチ処理・定期実行完了したら終了、スケジュール実行も可
Kubernetesアプリ管理オブジェクトの使い分け Deployment ステートレスなアプリ全般 WebサーバーやAPIサーバー ★ ローリングアップデート対応 StatefulSet 状態を持つアプリ DB・キャッシュ・メッセージキュー ★ 永続ストレージを確保 DaemonSet 全ノードへの一斉配備 監視・ログ収集エージェント ★ ノード追加時に自動追従 Job / CronJob バッチ・定期実行 データ集計・夜間処理 ★ 完了したら終了する設計

関連する規格・RFC

仕様・ドキュメント内容
Kubernetes API Reference apps/v1 DeploymentDeploymentオブジェクトの公式仕様定義
Kubernetes Enhancement Proposal (KEP) #1Deploymentの設計提案ドキュメント
OCI (Open Container Initiative) Image SpecDeploymentが参照するコンテナイメージの形式規格

関連用語

  • Pod — Kubernetesで実際にコンテナが動く最小単位
  • ReplicaSet — Deploymentが内部で使うPod数管理オブジェクト
  • Service — Deploymentで動くPodへのネットワーク窓口
  • Namespace — Deploymentを論理的に分離するグループ機能
  • Helm — Deploymentなどのマニフェストをパッケージ管理するツール
  • ローリングアップデート — 無停止でアプリを段階的に更新する手法