Kubernetes Storage
In deze post worden de volgende onderdelen behandeld: de layered architecture van Docker en het copy-on-write mechanisme voor image en container layers, het gebruik van Docker volumes voor persistente data, de integratie van externe opslag in Kubernetes via de Container Storage Interface, en het beheer van opslag in Kubernetes met persistent volumes en persistent volume claims.
Docker
Docker maakt gebruik van een layered architecture. Dit betekent dat elke instructiue in een Dockerfile een nieuwe laag is. Het voordeel hiervan is dat wanneer meerdere Docker-images beginnen met FROM ubuntu
, deze laag één keer wordt opgeslagen in de directory /var/lib/docker
. Hierdoor wordt de opslagruimte minder uitgeput en blijft de grootte van Docker beperkt.
Wanneer een image is gebouwd, kan deze niet meer veranderd worden, tenzij deze opnieuw wordt gebouwd, deze laag heet de image layer. Wanneer de container wordt gestart, kan de applicatie of gebruiker data schrijven, deze data wordt opgeslagen in de container layer. Wanneer tijdens het draaien van de container een bestand uit de image layer wordt aangepast, behoudt Docker het originele bestand en slaat de gewijzigde versie op in de container layer, dit heet copy-on-write
Docker Volumes
Volumes worden binnen Docker gebruikt om persistent data op te slaan. In tegenstelling tot de container layer, blijft de data in een volume bestaan wanneer de container wordt afgesloten. Volumes worden beheerd door Docker en slaan data op in de host, los van de containerlayer. Volumes kunnen ook gemount worden door meerdere containers tegelijk, wat nutrtig is voor het delen van bijvoorbeeld configuratie- en logbestanden.
Container Storage Interface
De Container Storage Interface (CSI) is een gestandaardiseerde interface die het mogelijk maakt om externe opslag te integreren met Kubernetes. Dankzij CSI kunnen providers hun eigen drivers ontwikkelen die dynamisch opslag kunnen leveren, beheren en koppelen, onafhankelijk van de onderliggende infrastructuur. Dit maakt het voor Kubernetes mogelijk om Persistent Volumes op een uniforme en consistente wijze aan te maken en te beheren, waarbij de opslagfunctionaliteit volledig losgekoppeld wordt van de Kubernetes core. CSI werkt onder hetzelfde principe als de Container Runtime Interface (CRI), die de communicatie tussen Kubernetes en container runtimes standaardiseert, waardoor beide interfaces een modulair en vervangbaar systeem mogelijk maken.
Volumes
Zonder volumes werkt de opslag in Kubernetes zoals bij Docker: er is een onveranderlijke image layer en een tijdelijke container layer waarin data aangepast kan worden. Volumes definieëren opslag die losstaat van de container, zodat data behouden blijft buiten de container-levenscyclus.
Persistent Volume
Een Persistent Volume (PV) maakt het mogelijk om data op te slaan die blijft bestaan, ongeacht de status van de container. PV’s worden beheerd door de Kubernetes Storage API en ondersteunen dynamische opslag.
Een PV kan worden aangemaakt met het volgende manifest:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nginx
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
Om een container toegang te geven tot een PV, wordt een PersistentVolumeClaim (PVC) aangemaakt. Dit kan als volgt:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nginx
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
Wanneer een PVC wordt verwijderd, blijft de data op het PV bewaard.