手当たり次第に書くんだ

飽きっぽいのは本能

Kubernetes に Docker / Podman のような stop/start がない理由

Docker や Podman を使っていると、コンテナは stop して、必要になったら start するものだと考えがちです。しかし Kubernetes では、Docker / Podman と同じ意味での「停止して残しておく」「あとで同じものを起動する」という感覚はあまり合いません。

Kubernetes はコンテナ単体を手元で起動停止する道具ではなく、宣言した望ましい状態を維持するための仕組みです。この違いを理解しないと、データ永続化や障害時の挙動を誤解しやすくなります。

Docker / Podman の stop/start との違い

Docker や Podman では、コンテナを停止しても削除しない限りコンテナの writable layer は残ります。そのため、検証や一時利用では、ボリュームを明示的に用意しなくても、停止後に同じコンテナを再開できるように見えます。

観点Docker / PodmanKubernetes
操作対象コンテナ単体Pod、Deployment、StatefulSet などのリソース
停止の感覚stop / start で同じコンテナを再利用しやすいPod は消され、必要なら新しい Pod として作られる
状態管理ローカルコンテナの writable layer に残ることがあるPod の一時領域は Pod ライフサイクルに依存する
運用思想手元のコンテナを操作する望ましい状態を宣言し、制御ループが維持する

Kubernetes は望ましい状態を維持する

Kubernetes では、Deployment や StatefulSet などに「どの Pod を、いくつ、どの設定で動かしたいか」を宣言します。Kubernetes はその desired state と実際の状態を比較し、差があれば近づけようとします。

たとえば Deployment の replicas が 1 なら、Kubernetes は Pod が 1 個動いている状態を維持しようとします。Pod を手動で削除しても、Deployment が残っていれば新しい Pod が作られます。

kubectl get deploy
kubectl get pod

# Pod を消しても Deployment が残っていれば再作成される
kubectl delete pod POD_NAME
kubectl get pod

これは Docker / Podman の docker stoppodman stop と同じ操作感ではありません。Kubernetes では、動かしたい状態を保つことが中心です。

停止したい場合は replicas を 0 にする

Kubernetes でアプリケーションを止めたい場合、Pod を直接止めるのではなく、Deployment などの replicas を 0 にするのが基本的な考え方です。

kubectl scale deployment my-app --replicas=0

# 再開する場合
kubectl scale deployment my-app --replicas=1

この操作は「同じコンテナを停止して再開する」というより、「必要な Pod 数を 0 にする」「必要な Pod 数を 1 に戻す」という意味です。再開時には新しい Pod が作られる可能性があり、Pod 内の一時データが残ることは期待できません。

Pod 内のデータは永続化されない前提で考える

Kubernetes の Pod は、作られ、動き、消えるものです。Pod の中に書き込んだデータは、Pod の再作成やノード移動で失われる前提で考える必要があります。

そのため、データを保持したい場合は、PersistentVolume / PersistentVolumeClaim、外部データベース、オブジェクトストレージなど、Pod のライフサイクルと独立した保存先を用意します。

  • アプリケーションの設定は ConfigMap / Secret に分ける
  • DB データは Pod 内ではなく永続ボリュームや外部 DB に置く
  • アップロードファイルは PVC やオブジェクトストレージに置く
  • ログは Pod 内にためず、ログ基盤へ送る
  • Pod の writable layer を永続データ置き場として扱わない

emptyDir と PersistentVolume の違い

Kubernetes には emptyDir のような一時ボリュームもあります。これはコンテナ再起動では残る場合がありますが、Pod が削除されると失われます。永続データを置く場所ではありません。

種類ライフサイクル用途
container filesystemコンテナに依存一時的な書き込み。永続データには向かない
emptyDirPod に依存同じ Pod 内の一時作業領域
PersistentVolume / PVCPod とは独立DB、アップロードファイル、永続データ
外部 DB / Object StorageKubernetes 外部または別管理状態をアプリケーション Pod から分離する

状態を持つアプリケーションは設計が必要

Kubernetes で状態を持つアプリケーションを動かす場合、単に Deployment に入れるだけでは不十分です。DB、ファイル、セッション、キャッシュ、バックアップ、リストアまで含めて設計する必要があります。

たとえば WordPress であれば、WordPress 本体の Pod、アップロードファイル、テーマ、プラグイン、MariaDB、Redis、キャッシュの責務を分ける必要があります。Pod を止めて再開すれば元通り、という発想ではなく、状態をどこに置くかを最初に決めるべきです。

まとめ

Docker / Podman では、コンテナを stop/start して同じコンテナを再利用する感覚があります。しかし Kubernetes では、Pod は一時的な実行単位であり、Deployment や StatefulSet が望ましい状態を維持します。

そのため、Kubernetes では「コンテナを止めて再開する」より、「必要な replicas を変更する」「Pod は再作成されるものとして扱う」「データは Pod の外に永続化する」と考える方が自然です。

Kubernetes を Docker / Podman の延長として見ると、データ永続化や停止・再開の感覚でつまずきます。Kubernetes はコンテナ操作ツールではなく、アプリケーションの望ましい状態を維持するための基盤として見るべきです。

参考
書籍
参考書籍

Kubernetes完全ガイド 第2版

Kubernetes の仕組み、リソース、ネットワーク、運用観点を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

参考

Kubernetes に Docker / Podman のような stop/start がない理由

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る