コンテナ・クラウド基盤

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のデプロイメントの実践ステップ

  1. 小さなアプリのコンテナのイメージを用意する。
  2. Deployment の定義ファイルを書き、apply で作成する。
  3. Pod が指定の数だけ動いていることを確認する。
  4. 1つの Pod を手動で削除し、自動で補充される様子を確認する。
  5. イメージの版を変えて更新し、更新の進み具合を確認する。
  6. わざと不具合のある版を入れて、ロールバックを体験する。
  7. 定義ファイルを、バージョン管理に入れる。

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・ツールの機能・料金・無料枠・仕様は頻繁に更新されるため、最新の内容は各社の公式ページでご確認ください。契約・法務・セキュリティに関する判断は、専門家や社内の担当部門にご相談ください。「筆者の見解」は一つの考え方です。