Aide-mémoire CKAD

exemple YAML PersistentVolume Kubernetes

Un PersistentVolume est le stockage du cluster. Un claim dans un namespace se lie à un volume, et un Pod monte le claim.

Une caisse arrimée reste sur le pont pendant qu’une navette décolle. Une caisse arrimée reste sur le pont pendant qu’une navette décolle.
PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: /mnt/data
    type: DirectoryOrCreate
PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  storageClassName: manual
  resources:
    requests:
      storage: 1Gi
StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: manual
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: Immediate
Lier, remplacer, réutiliser
kubectl get pv,pvc
kubectl delete pvc data
kubectl patch pv data-pv --type=json -p='[{"op": "remove", "path": "/spec/claimRef"}]'

Champs

storageClassName
La même chaîne sur le volume et le claim. Immuable après create. Chaîne vide des deux côtés : pas de classe.
accessModes
ReadWriteOnce, c’est un nœud. Le claim et le volume listent le même mode.
volumeMode
Filesystem ou Block. Le défaut est Filesystem. Les deux objets doivent être d’accord.
persistentVolumeReclaimPolicy
Retain garde le volume après la suppression du claim. Il reste Released tant que claimRef est là.
hostPath.path
Répertoire sur le nœud, pas dans l’image. Le Pod et le volume doivent arriver sur ce nœud.
hostPath.type
DirectoryOrCreate crée le répertoire. Directory exige qu’il existe déjà.
capacity.storage
Ce que le volume offre. La demande du claim doit être inférieure ou égale.
requests.storage
Ce que le claim demande. Plus grand que le volume, et le claim reste Pending.
provisioner
kubernetes.io/no-provisioner signifie que vous créez le PersistentVolume vous-même.
volumeBindingMode
Immediate lie dès qu’un volume correspond. WaitForFirstConsumer attend un Pod.
kubectl delete
Supprimer un claim Pending et le recréer. La classe, le mode et volumeMode ne se changent pas sur place.
kubectl patch
Retire claimRef sur un volume Released pour que le claim suivant puisse se lier. Retain laisse cette ref.

Pièges

  • Un claim se lie quand storageClassName, accessModes et volumeMode correspondent à un volume, et que requests.storage est inférieur ou égal à capacity.storage. Lire le volume d’abord et en copier ces quatre.
  • storageClassName est immuable. Supprimer un claim Pending et le recréer avec la classe que le volume a déjà. Un claim qui omet le champ prend le StorageClass par défaut, qui ne correspond pas à un volume nommé manual.
  • volumeBindingMode: WaitForFirstConsumer reste Pending jusqu’à ce qu’un Pod utilise le claim. Immediate lie dès qu’un volume correspond. kubernetes.io/no-provisioner ne crée pas de disques. Vous écrivez le PersistentVolume.
  • Retain laisse le volume Released après la suppression du claim. Retirer claimRef avant qu’un autre claim puisse se lier. hostPath type DirectoryOrCreate crée le chemin sur le nœud. Le volume est au niveau du cluster. Le claim est namespacé. Le Pod nomme le claim.

Doc officielle Persistent Volumes Storage Classes

S’entraîner sur un cluster réel →