【Kubernetes】PVとPVCで永続ボリュームを使う
はじめに
KubernetesのPersistentVolume(PV)とPersistentVolumeClaim(PVC)についてざっくり紹介し、PVとPVCを使って永続ボリュームを試してみたいと思います。
PVとPVC
PersistentVolume(PV)とは、永続化のボリューム自体を表すリソースです。
PersistentVolumeClaim(PVC)とは、PVに対して必要な容量を確保するリソースです。
PVでボリュームを用意して、PVCで実際に必要な容量のボリュームを確保して使うイメージです。
Podで永続ボリュームを試す
実際にPVとPVCを使って、永続ボリュームを試してみます。
PVの作成
まずは、PVから作成します。
2Giのストレージを用意するPVを作成します。
ここでは、シングルノードの開発やテスト用に用意されているhostpath
を使用しています。また、PVCからこのPVにバインドするときに使われるstorageClassName
はmanual
としています。
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: pv-vol1
5spec:
6 capacity:
7 storage: 2Gi
8 accessModes:
9 - ReadWriteMany
10 persistentVolumeReclaimPolicy: Delete
11 storageClassName: manual
12 hostPath:
13 path: /tmp
14 type: Directory
PVを作成します。
1kubectl apply -f pv.yml
作成したPVを確認すると、STATUSがAvailable
になっており、まだバインドされていないことが確認できます。
1❯ kubectl get pv
2NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
3pv-vol1 2Gi RWX Delete Available manual 18s
PVCの作成
次に、PVCを作成します。
PVと同じstorageClassName
とaccessModes
を指定しています。
1apiVersion: v1
2kind: PersistentVolumeClaim
3metadata:
4 name: pvc-vol1
5spec:
6 resources:
7 requests:
8 storage: 1Gi
9 accessModes:
10 - ReadWriteMany
11 storageClassName: manual
PVCを作成します。
1kubectl apply -f pvc.yml
PVCとPVを確認すると、それぞれSTATUSがBound
になっており、バインドされていることが確認できます。
1❯ kubectl get pvc,pv
2NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3persistentvolumeclaim/pvc-vol1 Bound pv-vol1 2Gi RWX manual 29s
4
5NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
6persistentvolume/pv-vol1 2Gi RWX Delete Bound default/pvc-vol1 manual 141m
Podで永続ボリューム
続いて、Podから永続ボリュームを使ってみます。
Podからは、PVCを指定するだけになります。
1apiVersion: v1
2kind: Pod
3metadata:
4 name: busybox
5spec:
6 containers:
7 - name: busybox
8 image: busybox:latest
9 args:
10 - sleep
11 - "999"
12 volumeMounts:
13 - mountPath: /tmp
14 name: volume-pvc
15 volumes:
16 - name: volume-pvc
17 persistentVolumeClaim:
18 claimName: pvc-vol1
Podを作成します。
1kubectl apply -f pod.yml
Podを再作成してみる
Podを再作成しても、データが残っているのか試してみます。
まずは、作成したPodのマウントパスにファイルを作成しておきます。
1❯ kubectl exec -it busybox -- /bin/sh
2
3/ # cd tmp
4
5/tmp # ls
6do-not-delete-cni-config
7
8/tmp # echo "hoge" > hoge.txt
9
10/tmp # ls
11do-not-delete-cni-config hoge.txt
12
13/tmp # cat hoge.txt
14hoge
一旦、Podを削除します。
1kubectl delete pod busybox
削除ができたら、再度Podを作成します。
1kubectl apply -f pod.yml
マウントパスを確認すると、先ほど作成したファイルがそのまま残っていることが確認できます。
1❯ kubectl exec busybox -- ls /tmp
2do-not-delete-cni-config
3hoge.txt
4
5❯ kubectl exec busybox -- cat /tmp/hoge.txt
6hoge