本文へスキップ
BecomeCoder

Kubernetesコース · 第5章 設定とストレージ ― 状態をどう持つか · レッスン27

ボリューム ― コンテナが消えてもデータを残す

ローカル実施

導入

コンテナの中に書いたファイルは、そのコンテナが再起動したり作り直されたりするときれいさっぱり消えます。これを 揮発(volatile、消えてなくなる性質) と呼びます。ログや一時ファイルならそれでいいですが、消えては困るデータもあります。そこで登場するのが Volume(ボリューム) です。

説明

コンテナのファイルシステムは、コンテナと運命を共にします。作り直せばまっさら。この性質のままだと、コンテナ内に置いたデータは残せません。

graph LR
    subgraph novol["ボリューム無し"]
        C1["コンテナ"] --> D1["内部にデータ"]
        C1 -. 再起動 .-> C2["新コンテナ<br/>データは消失"]
    end
    subgraph vol["ボリューム有り"]
        C3["コンテナ"] --> V["Volume<br/>(外部の入れ物)"]
        C3 -. 再起動 .-> C4["新コンテナ"]
        C4 --> V
    end

Volume は、コンテナの外側にある「データの入れ物」を、コンテナ内のディレクトリに接続する仕組みです。コンテナが作り直されても Volume 側のデータは残るので、新しいコンテナが同じデータを引き継げます。Volume にはいくつか種類があります。

  • emptyDir … Pod が生きている間だけ存在する一時領域。同じ Pod 内の複数コンテナでデータを共有するのに便利。ただし Pod が消えれば消える(コンテナ再起動には耐えるが Pod 削除には耐えない)。
  • hostPath … Pod が動いているノード上のディレクトリを直接マウントする。特定ノードに縛られるため、本番の一般用途では慎重に。
spec:
  containers:
    - name: app
      image: myapp:1.0
      volumeMounts:
        - name: tmp-data
          mountPath: /data
  volumes:
    - name: tmp-data
      emptyDir: {}          # Podの生存中だけ有効な一時領域

ここで大事な限界があります。emptyDir は Pod が消えれば消え、hostPath は特定のノードに縛られます。つまり「Pod がどこで作り直されても確実に残り続ける本物の永続化」には、これらでは足りません。それを実現するのが、次のレッスンの PersistentVolume(永続ボリューム) です。

「一時的に置くだけなら Volume(emptyDir)、消えては困る本番データなら次の PV/PVC」――この段階の違いを意識しておきましょう。