個人的に勘違いしていたこと
PVCを作るときに、PVを指定するものだと思っていたが、PVCの設定に、PVを指定する場所は基本的にはない。
PVCを作成すると、k8s は、適切なサイズのPVを見つけてPVCに割り当ててくれます。
Persistent Volume(PV)
Kubernetesクラスター内でストレージを提供するためのリソースです。PVは、クラスター管理者によって事前にプロビジョニングされ、クラスター内のノードや外部ストレージシステム(例えば、NFS、iSCSI、クラウドストレージなど)にバインドされます。PVは、Podが再スケジュールされたり、削除されたりしてもデータが失われないようにするための持続的なストレージを提供します。
PVC
PVとPVCの関係は、ストレージの提供者(PV)と要求者(PVC)の関係です。PVCが作成されると、Kubernetesは対応するPVを探し、要件を満たすPVを見つけた場合、それをPVCにバインドします。このバインディングにより、PVCが指定されたストレージをPodに提供することができます。
PV, PVC の一覧取得
# kubectl get pv,pvc -A
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/microai-pv 50Gi RWX Retain Bound default/microai-pvc microai-storage <unset> 16d
persistentvolume/microai-redis-pv 1Gi RWX Retain Bound redis/microai-redis-pvc microai-storage <unset> 15d
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
default persistentvolumeclaim/microai-pvc Bound microai-pv 50Gi RWX microai-storage <unset> 16d
redis persistentvolumeclaim/microai-redis-pvc Bound microai-redis-pv 1Gi RWX microai-storage <unset> 15d
STATUS
Available
: PVが利用可能で、まだPVCにバインドされていない状態。Bound
: PVがPVCにバインドされている状態。Released
: PVCが削除されたが、PVがまだリリースされていない状態。Failed
: PVに何らかのエラーが発生している状態。
CLAIMフィールド
このフィールドはPVにバインドされているPVCを示します。ここにバインドされているPVCの名前空間と名前が表示されます。
詳細取得
PV
# kubectl describe pv microai-pv
Name: microai-pv
Labels: <none>
Annotations: pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pv-protection]
StorageClass: microai-storage
Status: Bound
Claim: default/microai-pvc
Reclaim Policy: Retain
Access Modes: RWX
VolumeMode: Filesystem
Capacity: 50Gi
Node Affinity: <none>
Message:
Source:
Type: NFS (an NFS mount that lasts the lifetime of a pod)
Server: 100.64.1.114
Path: /srv/nfs/share
ReadOnly: false
Events: <none>
PVC
# kubectl describe pvc microai-pvc -n default
Name: microai-pvc
Namespace: default
StorageClass: microai-storage
Status: Bound
Volume: microai-pv
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 50Gi
Access Modes: RWX
VolumeMode: Filesystem
Used By: <none>
Events: <none>
作成
PV (hostPath)
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{好きな名前}}-pv
spec:
capacity:
storage: {{好きなサイズ}}Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: {{好きなパス(ex:/mnt/data)}}
PV (NFS)
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{好きな名前}}-pv
spec:
capacity:
storage: {{好きなサイズ}}Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: {{NFSのIP(ex:100.64.1.114)}}
path: {{NFSのパス(ex:/srv/nfs/share)}}
PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{好きな名前}}-pvc
spec:
accessModes:
- {{アクセスモード(ex:ReadWriteMany)}}
resources:
requests:
storage: {{好きなサイズ}}Gi
volumeName: {{PVの名前}}
accessModes
ストレージのアクセスモード。主に以下の3つがある
ReadWriteOnce (RWO)
: 1つのノードから読み書きできる。ReadOnlyMany (ROX)
: 複数のノードから読み取りのみ可能。ReadWriteMany (RWX)
: 複数のノードから読み書き可能。
削除関連
PVの削除
# kubectl delete pv {{PV名}}
persistentvolume "xxxxxx" deleted
PVCの削除
# kubectl delete pvc {{PVC名}} -n {{ネームスペース}}
persistentvolumeclaim "xxxxxx" deleted
ストレージクラス (storageclass)
一覧表示
# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
microai-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 16d
デフォルトにする
# kubectl patch storageclass microai-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/microai-storage patched
# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
microai-storage (default) kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 16d
(default) がついていればOK
デフォルトを解除する
# kubectl patch storageclass microai-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":null}}}'
storageclass.storage.k8s.io/microai-storage patched
# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
microai-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 16d