Waarom dynamic storage provisioning?
Containers zijn in principe ephemeral. Dat betekent dat ze vervangbaar moeten kunnen zijn zonder dat je data verliest. Dat is echter niet in elk geval wenselijk. Om te voorkomen dat je data verloren gaat zodra je je container of pod herstart of upgrade, kan je gebruik maken van persistent volumes. Een persistent volume kan blijven bestaan bestaan op het moment dat je container vervangen wordt of stopt. In Kubernetes kan je handmatig een persistent volume aanmaken, maar dat is een relatief tijdrovend proces. Zeker als je voor meerdere deployments een persistent volume nodig hebt.
Door gebruik te maken van Dynamic Provisioning hoef je niet telkens handmatig een Persistent Volume met bijbehorende Persistent Volume Claim aan te maken. Dankzij Dynamic Provisioning worden de benodigde volumes vanzelf aangemaakt zodra je deployment daarom vraagt. In plaats van handmatig de Persistant Volumes aan te maken, maak je een StorageClass aan die het aanmaken van de Persistent Volume Claims afhandelt. In de deployments die je op je cluster wilt draaien, hoef je alleen nog maar aan te geven van welke StorageClass gebruik gemaakt moet worden. Hierdoor hoef je je niet iedere keer opnieuw bezig te houden met de storage provisioning. Bovendien biedt deze werkwijze je de optie om meerdere storagetypes eenvoudig naast elkaar te gebruiken, bijvoorbeeld high-perfomance SSD’s en wat goedkopere storage voor applicaties waarvoor snelheid minder van belang is.
NFS Storage aanmaken
In deze handleiding laten we je zien hoe je dynamic provisioning kunt activeren in combinatie met NFS Storage op het Cloud-platform van Cloudlets.
- Maak een NFS disk aan in de webinterface van Cloudlets. Dat kan via Storage -> File Systems
- Maak een mount target aan, zodat de disk vanuit je Kubernetes cluster benaderbaar wordt.
- Selecteer het netwerk waarbinnen de storage benaderbaar moet zijn en kies een IP dat binnen het netwerk valt.
NFS storage koppelen aan het Kubernetes Cluster
- Je kunt de NFS disk koppelen aan het Kubernetes cluster. Hierdoor moeten een ClusterRole, ClusterRoleBinding, Deployment en een StorageClass aangemaakt worden. Om het je eenvoudig te maken, hebben wij al een .yaml-file aangemaakt waarmee je dit eenvoudig kunt doen. Het enige dat je in het bestand nog dient aan te passen zijn de twee IP-adressen onder het kopje kind: Deployment. In beide gevallen vul je daar het IP in dat je hebt aangemaakt bij de mount target uit de vorige stap.Download de yaml op onze Github pagina:
- Heb je de IP-adressen uit bovenstaande bestand aangepast naar het IP-adres dat je hebt gebruikt voor je mount point? Dan kan je StorageClass met alle bijbehorende Kubernetes resources eenvoudig aanmaken met kubectl:
kubectl create -f nfs-deployment.yaml
- Controleer of je deployment draait met onderstaande commando:
kubectl get deployment nfs-client-provisioner
Als het goed is laat de output van dit commando zien dat de nfs-client-provisioner available is.
StorageClass als standaard instellen
Geef je in je deployment niet aan welke StorageClass gebruikt moet worden? Dan valt Kubernetes terug op de StorageClass die je als default hebt aangemerkt. Maak je de StorageClass aan met de configuratie die je in bovenstaande stappen hebt gedownload? Dan zal de nieuwe NFS storage als default worden aangemerkt, tenzij er al een default StorageClass op het cluster aanwezig was. Als er meerdere StorageClasses als default zijn aangemerkt, dan zal Kubernetes geen van beide StorageClasses als default beschouwen. Twee commando’s die van belang zijn in dit kader:
- Controleren welke StorageClasses er zijn en of je meerdere StorageClasses als default hebt aangemerkt:
kubectl get storageclass
- De StorageClass van je voorkeur instellen als default kan door die StorageClass te patchen. Volg hierdoor de instructies op https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class/