Opslag in Kubernetes
Gegevens kunnen niet in de pod worden opgeslagen, als de pod wordt verwijderd of wordt beëindigd blijven de gegevens erin niet op het systeem staan. Om langdurige en tijdelijke opslag te bieden aan Pods in het cluster, biedt Kubernetes verschillende soorten opslagmechanismen.
In dit artikel zullen we voorbeelden zien van slechts 2 soorten opslagmechanismen.
- hostPath:
Een hostPath volume koppelt een bestand of map aan van het bestandssysteem van de host node in je Pod. Dit type volume kan gebruikt worden om een Pod te laten specificeren of een gegeven hostPath moet bestaan voordat de Pod draait, of dat het aangemaakt moet worden. Dit volumetype is niet iets wat de meeste Pods nodig zullen hebben. Het DirectoryOrCreate type maakt een lege directory aan als die niet bestaat met toestemming ingesteld op 0755 en het Directory type helpt om er zeker van te zijn dat er een directory bestaat op het gegeven pad voordat die Pod wordt aangemaakt. - emptyDir:
Een emptyDir volume wordt voor het eerst aangemaakt als een Pod aan een Knooppunt wordt toegewezen en bestaat zolang dat Pod op dat knooppunt draait. Standaard worden emptyDir volumes opgeslagen op het type opslag dat onze omgeving heeft. We kunnen ook het emptyDir.medium veld op Memory zetten om Kubernetes te vertellen een RAM-gebacked bestandssysteem te mounten
Om meer te weten over andere opslagmechanismen in Kubernetes, klik hier.
Pre-requisites
- Kubernetes Cluster met minstens 1 worker node.
Als je wilt leren hoe je een Kubernetes Cluster maakt, klik danhier. Deze gids helpt je een Kubernetes cluster te maken met 1 Master en 2 Nodes op AWS Ubuntu 18.04 EC2 Instances.
Wat zullen we doen?
- Maak een pod met een volume van verschillende soorten erin gemonteerd
Maak een pod met een volume van verschillende types erin gemonteerd
Host pad volume met type: Directory
Maak een object definitie bestand om een bestaande directory in de pod te mounten.
vim volume-hostpath-1.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-1 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-1 volumes: - name: my-volume-1 hostPath: path: /dir type: Directory
Verkrijg een lijst van pods en maak een pod die binnen de pod “/opt/mounted-here” zal mounten op “/dir” van de host.
kubectl get pods
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
Als je nu de pod beschrijft zie je dat de pod creatie mislukt is. Het aankoppelen mislukte omdat de directory “/dir” niet bestaat op de host. Om een volume in de pod te mounten met “type: Directory”, moet de host directory bestaan.
Laten we nu een directory “/dir” aanmaken op de host, d.w.z. op de worker node.
sudo mkdir /dir
Als we een directory op de worker nodes hebben aangemaakt, kunnen we de eerder aangemaakte pod verwijderen en proberen een nieuwe pod aan te maken.
kubectl delete -f volume-hostpath-1.yml
kubectl create -f volume-hostpath-1.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-1
Deze keer zie je dat de pod met succes is aangemaakt en dat onder volumes het aangekoppelde pad “/dir” te zien is.
Laten we nu in de pod inloggen en een bestand maken
kubectl get pods
kubectl exec -it volume-hostpath-example-1 /bin/bash
touch /opt/mounted-here/new-file
Het bestand dat we in de pod maakten is nu vanaf de worker node te zien onder de gemounte directory “/dir”
ll /dir/ #Execute this command on the worker node
Laten we deze keer de pod die we maakten verwijderen en kijken of het bestand nog op de host directory “/dir” bestaat of niet.
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-1
Maak een lijst van de bestanden onder “/dir” op de worker node.
ll /dir/ #Execute this command on the worker node
We zien dat zelfs na het verwijderen van de pod het bestand nog steeds bestaat onder “/dir” op de worker node. Dit betekent dat de gegevens blijven bestaan, ook nadat de pod verwijderd of beëindigd is.
In dit voorbeeld merkten we op dat de host directory die binnen de port gemount moet worden, moet bestaan.
Het host pad volume met type: DirectoryOrCreate
Om er zeker van te zijn dat een host directory beschikbaar is alvorens te mounten kunnen we “type: DirectoryOrCreate” in plaats van “type: Directory” in hostpath volume.
Maak een nieuw bestand met type “type: DirectoryOrCreate”.
vim volume-hostpath-2.yml
apiVersion: v1 kind: Pod metadata: name: volume-hostpath-example-2 spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/mounted-here name: my-volume-2 volumes: - name: my-volume-2 hostPath: # directory location on host path: /mount-this type: DirectoryOrCreate
Haal een lijst van bestaande pods op en maak een nieuwe pod met het bestand dat in de bovenstaande toestand is aangemaakt.
kubectl get pods
kubectl create -f volume-hostpath-2.yml
kubectl get pods
kubectl describe pod volume-hostpath-example-2
Als we de pod beschrijven is te zien dat de pod met succes is aangemaakt. En de directory “/mount-this” die niet bestaat op de host/worker node werd aangemaakt op de host tijdens het mounten in het volume.
Ga naar de worker nodes en controleer of de directory is aangemaakt of niet
ll /mount-this/ #Execute this command on the worker node
Maak nu op de worker nodes een nieuw bestand aan in de map “/mount-this” die in de pod gemount is.
sudo touch /mount-this/created-on-host #Execute this command on the worker node
Log in op de pod en kijk in de map “/opt/mount-this/created-on-host” of het bestand “/mount-this/created-on-host” dat we op de werkknoop aanmaakten in de pod bestaat.
kubectl get pods
kubectl exec -it volume-hostpath-example-2 /bin/bash
ls -l /opt/mounted-here/
Verwijder nu de pod en kijk of het bestand nog bestaat op het werkknooppunt bij “/mount-this/”
exit
kubectl get pods
kubectl delete pod volume-hostpath-example-2
Voer het volgende commando uit om het bestand op de werkknoop bij “/mount-this/” op te sommen.
sudo ls -lt /mount-this/ #Execute this command on the worker node
In dit voorbeeld zagen we dat zelfs als de host directory niet bestaat hij op de host machine wordt aangemaakt voordat hij in de pod gemount wordt.
leegDir volume
Maak een object definitie bestand met het volgende.
vim volume-emptydir.yml
apiVersion: v1 kind: Pod metadata: name: volume-emptydir-example spec: containers: - image: nginx name: my-container volumeMounts: - mountPath: /opt/this name: my-volume-3 volumes: - name: my-volume-3 emptyDir: {}
Verkrijg een lijst van pods en maak een nieuwe pod om een volume met type “emptyDir” te mounten
kubectl get pods
kubectl create -f volume-emptydir.yml #Create an object using the file
kubectl get pods
kubectl describe pod volume-emptydir-example #Get details of the specified pod
In de bovenstaande schermafbeelding is te zien dat de pod gemaakt is en dat het volume beschikbaar is.
Log nu in op de pod en maak een map aan onder het mount pad “/opt/this”. Deze keer hebben we geen volume van de host.
kubectl exec -it volume-emptydir-example /bin/bash #Login into the Pod
Nu kunnen we de pod verwijderen als hij niet langer nodig is.
kubectl get pods #Get a list of Pods
kubectl delete pod volume-emptydir-example #Delete the specified pod
Conclusie
In dit artikel zagen we de stappen en voorbeeld bestanden om pods te maken met een volume van het type hostPath en emptyDir. We zagen hoe “type:DirectoryOrCreate” onder het volumetype hostPath ons kan helpen een map te mounten die niet bestaat op de worker node/host.