【Kubernetes】PVとPVCで永続ボリュームを使う

2022.06.16
2024.03.24
Kubernetes
PersistentVolumePersistentVolumeClaim

はじめに

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にバインドするときに使われるstorageClassNamemanualとしています。

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と同じstorageClassNameaccessModesを指定しています。

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

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee