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 | 「何をどう動かすか」の設計書。ユーザーが書く |
| ReplicaSet | Deploymentに作られる中間管理者。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はその中でもステートレス(状態を持たない)アプリに最適化されたものです。
| オブジェクト | 主な用途 | 特徴 |
|---|---|---|
| Deployment | WebサーバーやAPIなど一般的なアプリ | ローリングアップデート・スケール・自己修復 |
| StatefulSet | DBやキャッシュなど状態を持つアプリ | PodごとにIDと永続ストレージを付与 |
| DaemonSet | 監視エージェントやログ収集など | 全ノードに必ず1台ずつ起動 |
| Job / CronJob | バッチ処理・定期実行 | 完了したら終了、スケジュール実行も可 |
関連する規格・RFC
| 仕様・ドキュメント | 内容 |
|---|---|
Kubernetes API Reference apps/v1 Deployment | Deploymentオブジェクトの公式仕様定義 |
| Kubernetes Enhancement Proposal (KEP) #1 | Deploymentの設計提案ドキュメント |
| OCI (Open Container Initiative) Image Spec | Deploymentが参照するコンテナイメージの形式規格 |
関連用語
- Pod — Kubernetesで実際にコンテナが動く最小単位
- ReplicaSet — Deploymentが内部で使うPod数管理オブジェクト
- Service — Deploymentで動くPodへのネットワーク窓口
- Namespace — Deploymentを論理的に分離するグループ機能
- Helm — Deploymentなどのマニフェストをパッケージ管理するツール
- ローリングアップデート — 無停止でアプリを段階的に更新する手法