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.

  1. 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.
  2. 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

  1. 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?

  1. 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

volume-hostpath-1-definitie

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

creëer-pod-en-ontdek-zijn-details

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

create-dir-on-host-and-then-create-a-pod

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

inloggen-in-pod-en-creëer-een-bestand

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

verwijder-de-pod-en-controleer-bestand-op-host

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

volume-hostpath-2-definitie

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

maak-een-pod-en-ontdek-zijn-details

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/

maak-bestand-op-host-en-verifieer-in-de-pod

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
verwijder-de-pod-en-controleer-bestand-op-host

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: {}

volume-emptydir-definitie

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

maak-een-pod-en-beschrijf-zijn-details

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

inloggen-op-de-pod-en-zie-geen-map-op-de-host

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.