Kubernetes Learning 第17章:VolumeとPersistentVolumeの基礎

Kubernetesを使っていて最初に戸惑うポイントの1つが「Podの中でデータが保存されない」という問題です。この章ではその理由と、それを解決するための Volume、PersistentVolume(PV)、PersistentVolumeClaim(PVC)の考え方を学びます。


❓ なぜVolumeが必要なのか?

Kubernetesでは、Pod内のコンテナが一時的にデータを保存できますが、そのライフサイクルは非常に短いです。

例えば:

  • Podが再起動されたら → データは消える
  • 新しいPodに置き換えられたら → データは引き継がれない

つまり、アプリケーションのログ、DBデータ、ファイルアップロードなどを残したい場合、何らかの外部ストレージが必要になります。

ここで登場するのが Kubernetes の Volume です。


📦 Volumeとは?

KubernetesにおけるVolumeは、コンテナにマウントできるファイルの保存領域です。以下のような種類があります:

Volumeタイプ説明
emptyDirPodが動いている間だけの一時領域
hostPathNode上のディレクトリをマウントする
configMap/secret設定や機密データをファイルとして提供
persistentVolumeClaim外部ストレージをPodに接続する(後述)

emptyDirhostPath は簡単に使えますが、Podが再スケジュールされたらデータは失われます。


💾 PersistentVolume(PV)とPersistentVolumeClaim(PVC)

本格的に永続化するには、**PersistentVolume(PV)とPersistentVolumeClaim(PVC)**という仕組みを使います。

用語の整理:

用語役割
PV (PersistentVolume)管理者があらかじめ用意しておく「物理的なストレージ」リソース(NFS, AWS EBSなど)
PVC (PersistentVolumeClaim)ユーザーが「ストレージを使いたい!」と要求する宣言
PodPVCを通してPVにアクセスする

ざっくり言うと、PVは「空いてる倉庫」、PVCは「これくらいの広さの倉庫がほしい」、Podは「そこに荷物を置く」感じです。


🔧 使い方の流れ(例)

  1. 管理者が PersistentVolume を用意(静的プロビジョニング)
  2. ユーザーが PersistentVolumeClaim を作成
  3. Kubernetesが適合するPVを探してPVCとバインド
  4. PodがそのPVCをVolumeとしてマウント

🧪 シンプルな例(YAML)

# PersistentVolumeClaimの例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
# PodがPVCを使う例
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
    - name: app
      image: nginx
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: my-storage
  volumes:
    - name: my-storage
      persistentVolumeClaim:
        claimName: my-pvc

📌 動的プロビジョニングとは?

クラウド環境では、StorageClass を使えば、PVCを書くだけで PV を自動的に作成できます(これを動的プロビジョニングと呼びます)。非常に便利なので、実運用ではこのパターンが主流です。


📋 まとめ

  • Podの中のデータは基本的に永続化されない
  • 永続化したいなら Volume + PersistentVolume + PersistentVolumeClaim を使う
  • PVC = 倉庫のリクエスト/PV = 実際のストレージ
  • 動的プロビジョニングを使えば、PVを自動で用意してくれる

mh

Related Posts

Kubernetes Learning 第16章:外部アクセスとDNS、LoadBalancerのしくみ

Kubernetesの中にアプリケーションを立てただけでは、…

Kubernetes Learning 第15章:ServiceとIngressを使った公開

Kubernetesクラスターの中で動いているアプリケーショ…

You Missed

Kubernetes Learning 第17章:VolumeとPersistentVolumeの基礎

  • 投稿者 mh
  • 5月 21, 2025
  • 9 views

Android application development 第21章:ViewModel、LiveData、DataBindingの導入

  • 投稿者 mh
  • 5月 21, 2025
  • 5 views

Kubernetes Learning 第16章:外部アクセスとDNS、LoadBalancerのしくみ

  • 投稿者 mh
  • 5月 20, 2025
  • 16 views

Android application development 第20章:非同期処理(Handler / AsyncTask / Coroutineの比較)

  • 投稿者 mh
  • 5月 20, 2025
  • 24 views

Kubernetes Learning 第15章:ServiceとIngressを使った公開

  • 投稿者 mh
  • 5月 19, 2025
  • 20 views

Android application development 第19章:JSONパース(Gson)

  • 投稿者 mh
  • 5月 19, 2025
  • 25 views