Kubernetes 永続化ボリューム(PV,PVC)周りのまとめ

May 21, 2024, 8:35 PM


個人的に勘違いしていたこと

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


Kubernetes ネームスペース(namespace)周りのまとめ
kube-prometheus-stack で、Prometheus、Grafana をインストールして、Kubernetes クラスターのいろいろな情報を監視するkube-prometheus-stack で、Prometheus、Grafana をインストールして、Kubernetes クラスターのいろいろな情報を監視する