nfs provisioner

Wenn ihr ein eigenen k3s Cluster auf eurem Raspberry Pi betreibt, dann verwendet ihr automatisch für das anlegen von Persistent Volume Claim den local-path-provisioner. Damit wird ein Verzeichnis auf dem jeweiligen Kubernetes Node angelegt und verwendet. Das funktioniert alles, solange ihr nicht mehrere Nodes in eurem Cluster habt. Erhöht ihr die Node-Anzahl um eins, kann ein Pod bei einem Neustart auf einem anderen Node gestartet werden. Da dort die Dateien nicht lokal liegen, wird es so wirken als wären die Dateien verschwunden. Eine Lösung bietet der nfs-subdir-external-provisioner, welcher die Daten auf einem NFS-Server ablegt und damit von mehreren Nodes erreicht werden kann. Gleichzeitig erreicht man damit die Möglichkeit ein Deployment mit mehreren Replicas zu erstellen, da hier ein ReadWriteMany möglich ist.

Ich möchte euch hier kurz erklären wie ihr den nfs-subdir-external-provisioner einrichtet. Ihr müsst dazu im Voraus einen NFS-Server betreiben, was ich hier mit einem ZFS Dateisystem erklärt habe. Ihr könnt aber auch beispielsweise dieser Anleitung von Raspberry Pi befolgen.

Der einfachste Weg ist eine Verteilung des nfs-subdir-external-provisioner über helm. Dazu benötigt ihr helm auf eurem System (nicht zwingend auf dem Raspberry Pi). Ich hab helm nur auf meinem Desktop-PC installiert und das ging unter Debian 10 wie folgt.

curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt update
sudo apt install helm

Anschließend konnte ihr den nfs-subdir-external-provisioner als Repo hinzufügen und schließlich installieren. Anpassen müsst ihr lediglich die IP-Adresse auf die Adresse eures NFS-Servers und den NFS-Pfad.

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner --namespace nfs-subdir-external-provisioner --create-namespace nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.1.99 --set nfs.path=/

Nachdem ihr den nfs-subdir-external-provisioner installiert habt, habt ihr eine zusätzliche Storage Class in eurem Cluster mit dem Namen nfs-client. Ihr könnt dann wie folgt ein Persistent Volume Claim anlegen und anschließend in eurem Deployment verwenden.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: example
  name: example-pvc-data
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client
  resources:
    requests:
      storage: 1Gi

Wenn ihr euch dann den Inhalt des NFS-Servers anschaut, seht ihr, dass dort ein Verzeichnis entstandend ist, indem die Daten abgespeichert werden.

Wie immer hoffe ich, dass ich euch mit der kleinen Anleitung etwas weiter helfen konnte. Wenn ihr noch Fragen oder Anregungen habt, dann schreibt einfach ein Kommentar und sonst freue ich mich über einen Kaffee.


[1]: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

[2]: https://de.wikipedia.org/wiki/Network_File_System