persistent volume (PV) はクラスタで共通のリソースで、pod が削除されてもデータを維持したいときに使えます。PV の裏の仕組みは worker node 上のローカル接続ストレージではなく、EBS や NFS のようなネットワークストレージシステムや、あるいは Ceph のような分散ファイルシステムです。
PV を使うためには、最初に persistent volume claim (PVC) で宣言する必要があります。PVC は PV に望ましい仕様 (サイズ、速度など) を Kubernetes から要求し、次に PV を volume としてマウントできる pod にバインドします。では、PVC を作成しましょう。Kubernetes に 1 GB のストレージをデフォルトの storage class で要求します。
$ kubectl apply -f https://raw.githubusercontent.com/openshift-evangelists/kbe/master/specs/pv/pvc.yaml
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pvc-27fed6b6-3047-11e9-84bb-12b5519f9b58 1Gi RWO gp2-encrypted 18m
永続化の仕組みを理解するために、上の PVC を使用して PV を /tmp/persistent
に volume としてマウントする deployment を作成しましょう。
$ kubectl apply -f https://raw.githubusercontent.com/openshift-evangelists/kbe/master/specs/pv/deploy.yaml
さて、volume が実際に永続化されているかテストしたいと思います。そのために、上記の deployment で管理している pod を見つけ、そのメインのコンテナに exec を実行して、/tmp/persistent
ディレクトリ (PV をマウントすることにしたディレクトリ) に data
という名前のファイルを作成します。
$ kubectl get po
NAME READY STATUS RESTARTS AGE
pv-deploy-69959dccb5-jhxx 1/1 Running 0 16m
$ kubectl exec -it pv-deploy-69959dccb5-jhxxw -- bash
bash-4.2$ touch /tmp/persistent/data
bash-4.2$ ls /tmp/persistent/
data lost+found
今度は、pod を削除して deployment に新しい pod を起動させます。期待されることは、PV が新しい pod でも利用可能で、/tmp/persistent
内のデータがまだ存在していることです。確認しましょう。
$ kubectl delete po pv-deploy-69959dccb5-jhxxw
pod pv-deploy-69959dccb5-jhxxw deleted
$ kubectl get po
NAME READY STATUS RESTARTS AGE
pv-deploy-69959dccb5-kwrrv 1/1 Running 0 16m
$ kubectl exec -it pv-deploy-69959dccb5-kwrrv -- bash
bash-4.2$ ls /tmp/persistent/
data lost+found
実際、data
ファイルとその中身が期待される場所にきちんとあります。
留意点として、デフォルトの動作では deployment が削除されても PVC (と PV) は存在し続けます。ストレージをこのように保護する機能はデータ損失を防ぐためです。データがもう確実に不要になったら、PVC を削除することができます。それに伴って PV も削除されます。
$ kubectl delete pvc myclaim
persistentvolumeclaim "myclaim" deleted
どんなタイプの PV が Kubernetes クラスタで利用できるかは環境によります (オンプレミスかパブリッククラウドか)。このトピックについてさらに学びたい場合は、Stateful Kubernetes を参照してください。