Kubernetesのデプロイメントとは更新・ロールバック・スケールの基本
KubernetesのDeploymentとは、Podの複製や更新を宣言的に管理するリソースです。ReplicaSetとの関係、ローリングアップデート、ロールバック、スケールの基本操作と、運用上の注意点を整理します。
公的機関・公式資料などの一次情報と照合して作成しています。このサイトについて
Kubernetesのデプロイメントとは
Kubernetes の Deployment(デプロイメント)とは、アプリを動かす Pod の集まりを管理するためのリソースです。公式ドキュメントでは、主にWebアプリのような、状態を持たないアプリを動かすためのもので、Pod と ReplicaSet に対する宣言的な更新を提供すると説明されています。
宣言的とは、「こうなっていてほしい」という状態を書いて伝えると、Kubernetes が、現在の状態をそこに近づけてくれる、という考え方です。たとえば「このイメージで、Pod を3つ動かす」と書けば、Pod が1つ壊れても、自動で補充されます。
Pod は使い捨てなので、通常は、Pod を直接作らず、Deployment を通じて作ります。
基本(仕組みと主な操作)
関係は、次のようになっています。
| 層 | 役割 |
|---|---|
| Deployment | 望ましい状態(イメージ、Pod の数、更新の方法)を宣言する |
| ReplicaSet | 指定した数の Pod を維持する |
| Pod | 実際にコンテナを動かす |
Deployment を更新すると、新しい ReplicaSet が作られ、新しい Pod を少しずつ増やしながら、古い ReplicaSet の Pod を少しずつ減らします。これが、ローリングアップデートです。全部を一度に止めずに、段階的に入れ替えるため、サービスを止めにくい更新ができます。
公式ドキュメントが挙げる、Deployment の主な使い方です。
| 使い方 | 内容 |
|---|---|
| 複製の作成 | 指定した数の Pod を、宣言的に動かす |
| 更新 | Pod のひな形を変えて、新しい版に入れ替える |
| ロールバック | 問題があれば、前の版に戻す |
| スケール | 負荷に応じて、Pod の数を増減する |
| 一時停止と再開 | 更新を一時止めて、複数の修正をまとめて適用する |
| 古い ReplicaSet の整理 | 不要になった古い履歴を削除する |
Kubernetesのデプロイメントの具体例
公式ドキュメントの定義の例(抜粋)です。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
replicas が Pod の数、selector が管理する Pod を見分ける目印、template が Pod のひな形です。
よく使う操作です。
| 操作 | コマンドの例 |
|---|---|
| 作成・更新 | kubectl apply -f deployment.yaml |
| 状態の確認 | kubectl get deployments |
| 更新の進み具合 | kubectl rollout status deployment/nginx-deployment |
| 履歴の確認 | kubectl rollout history deployment/nginx-deployment |
| 前の版に戻す | kubectl rollout undo deployment/nginx-deployment |
| Pod の数を変える | kubectl scale deployment nginx-deployment –replicas=5 |
更新の流れの例です。Pod が3つの状態で新しい版に更新すると、新しい Pod が起動して、準備が整うごとに、古い Pod が1つずつ止まります。更新中も、少なくとも一部の Pod が動き続けるため、利用者から見たサービスの停止を、小さくできます。更新後に不具合が見つかったら、rollout undo で、前の版に戻せます。
Kubernetesのデプロイメントの実践ステップ
- 小さなアプリのコンテナのイメージを用意する。
- Deployment の定義ファイルを書き、apply で作成する。
- Pod が指定の数だけ動いていることを確認する。
- 1つの Pod を手動で削除し、自動で補充される様子を確認する。
- イメージの版を変えて更新し、更新の進み具合を確認する。
- わざと不具合のある版を入れて、ロールバックを体験する。
- 定義ファイルを、バージョン管理に入れる。
Kubernetesのデプロイメントの注意点
- 状態を持つアプリ(データベースなど)には、別のリソースが適する場合があります。公式ドキュメントでも、用途ごとに異なるリソースが示されています。
- latest のような版が動くタグは、更新やロールバックの再現性を下げます。版を固定します。
- ロールバックで戻るのは、アプリの版です。データベースの内容の変更などは、自動では戻りません。
- 更新中に、新旧の版が同時に動く時間があります。互換性(データ形式など)を考慮します。
- 仕様や推奨は更新されます。最新の公式ドキュメントを確認してください。
Kubernetesのデプロイメントでよくあるミス
- Pod の数を1つにして、更新時にサービスが止まる。
- 版を固定せず、意図しない版が動く。
- データの変更を伴う更新で、ロールバックの方法を考えていない。
- selector と ラベルの不一致で、期待どおりに管理されない。
Kubernetesのデプロイメントのチェックリスト
- Pod の数と、更新の方法を決めたか。
- イメージの版を固定したか。
- ロールバックの手順を確認したか。
- データの変更を伴う更新の対策があるか。
- 定義ファイルをバージョン管理しているか。
KubernetesのデプロイメントのFAQ(よくある質問)
Q. Deployment と ReplicaSet は、何が違いますか。
A. ReplicaSet は、指定した数の Pod を維持するものです。Deployment は、その上で、更新やロールバックを管理します。通常は、Deployment を使います。
Q. ロールバックすれば、すべて元に戻りますか。
A. 戻るのは、Deployment の版(Pod のひな形)です。データの内容の変更などは、別に対処が必要です。
Q. Pod の数は、自動で変えられますか。
A. 自動でスケールさせる機能があります。手動では、scale コマンドで変更できます。
筆者の見解(Kubernetesのデプロイメント)
Deployment は、更新を安全に行うための仕組みですが、その安全は、アプリの互換性の設計に支えられていると考えます。新旧の版が同時に動く時間があるため、データ形式やAPIの互換性を保たないと、仕組みが正しく動いても、サービスは壊れるためです。私見では、最初の検証で、ロールバックを実際に体験して、戻る範囲と戻らない範囲を、確認しておくことを勧めます。
Kubernetesのデプロイメントの関連項目
出典(一次情報)
本記事は一般的な情報の提供を目的としています。SaaS・ツールの機能・料金・無料枠・仕様は頻繁に更新されるため、最新の内容は各社の公式ページでご確認ください。契約・法務・セキュリティに関する判断は、専門家や社内の担当部門にご相談ください。「筆者の見解」は一つの考え方です。