Hulpartikel overzicht

Hulpartikel

Block storage aan je Kubernetes-cluster koppelen

De individuele nodes van Kubernetes-clusters komen met een kleine hoeveelheid opslagruimte. Wanneer je voor jouw use case aanvullende schijfruimte nodig hebt, voeg je die toe door een 'Persistent Volume' en/of 'Persistent Volume Claim' te gebruiken. Hierin kun je aangeven wat voor type storage je wil gebruiken, bijvoorbeeld block storage, file storage of object storage.

Wanneer dit nieuwe termen voor je zijn raden we aan eerst ons artikel over Persistent Volumes en Persistent Volume Claims te lezen. In deze handleiding laten we zien hoe je een 'block storage' gebruikt op je Kubernetes-cluster door middel van een Persistent Volume Claim.

  • Een overzicht van gebruikte block storages binnen jouw Kubernetes-cluster (gebruikt en eventueel ongebruikt) vind je in het TransIP-controlepaneel.
     
  • We gaan ervan uit dat je bekend bent met de basis van hoe een Kubernetes-object in elkaar steekt. Zo niet, neem dan eerst een kijkje in onze handleiding 'Kubernetes objecten maken' waarin we uitleggen hoe de structuur in elkaar steekt.

Een block storage gebruiken op je cluster

 

Wanneer je begint met Kubernetes kom je veel voorbeelden tegen zowel online in .yaml-objecten als in Helm-charts waarin er gebruik wordt gemaakt van block storages via de 'kind' PersistentVolume en/of PersistentVolumeClaim.

Als je je eigen applicatie containerizeert dan kom je al snel een punt tegen waarop je zelf extra schijfruimte aan je deployment wil toekennen. In de volgende stappen laten we aan de hand van een simpel voorbeeld zien hoe je via een PersistentVolumeClaim extra schijfruimte aan je applicaties toekent.

 

Stap 1

Maak eerst een namespace aan waarin je je (test-)setup opneemt:

kubectl create ns transip-demo

Je bent uiteraard vrij om de namespace naam transip-demo aan te passen naar een andere naam. Let wel dat je dat in de volgende stappen dan ook doet.


 

Stap 2

Maak het object aan waarin je de setup definieert:

nano transip-demo.yaml

Geef het bestand de inhoud uit het codeblock hieronder. In dit voorbeeld maken we gebruik van een Nginx-deployment met een loadbalancer service, MySQL-server en twee block storages om extra schijfruimte te bieden.

Het is altijd handiger om per applicatie een PVC toe te voegen omdat in een praktijktoepassing elke applicatie mogelijk verschillende opslagvereisten heeft in termen van grootte, toegangsmodus (ReadWriteOnce, ReadOnlyMany, ReadWriteMany), etc. Het scheiden van PVC's per applicatie zorgt ook voor een betere isolatie en beveiliging.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: transip-demo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: transip-fast-storage 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: transip-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-storage
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-storage
        persistentVolumeClaim:
          claimName: nginx-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: transip-demo
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: transip-demo
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: transip-fast-storage 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  namespace: transip-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: my-secret-pw
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

Sla de wijzigingen op en sluit het bestand (ctrl + x > y > enter).

 

De onderdelen van deze configuratie:

In een notendop bestaat deze configuratie uit de volgende onderdelen:

  1. Een PersistentVolumeClaim voor Nginx van 1Gi. Dit geeft Nginx extra schijfruimte die je bijvoorbeeld kunt inzetten om statische bestanden van een website te hosten.
  2. Een Deployment voor Nginx, die een enkele replica van de Nginx pod draait en de eerder gemaakte PersistentVolumeClaim gebruikt voor opslag.
  3. Een Service voor Nginx, die de Nginx pod blootstelt aan het internet via een LoadBalancer.
  4. Een PersistentVolumeClaim van 10 Gi voor MySQL.
  5. Een Deployment voor MySQL, die een enkele replica van de MySQL pod draait en de 'mysql-pvc' PersistentVolumeClaim gebruikt voor opslag.

 

Code specifiek voor het gebruik van Persistent Volume Claims:

Een groot deel van de code in dit object zal er vertrouwd uit zien als je vaker in Kubernetes met .yaml-objecten hebt gewerkt. Zo niet, raden we aan om onze handleiding over het maken van .yaml-objecten te bekijken. Er zijn in het PVC-blok echter twee elementen die in het bovengenoemde artikel niet behandeld worden, namelijk:

  • spec.accessModes: De modus waarop het volume gemount wordt, zie deze pagina voor de beschikbare opties.
  • spec.storageClassName: Het type storage class dat je gebruikt. Beschikbare opties zijn transip-fast-storage op basis van NVMe en transip-big-storage op basis van HDD.

Let op: Dit is een eenvoudig voorbeeld en in een productieomgeving zou je geheime waarden zoals het MySQL-wachtwoord niet direct in het YAML-bestand opnemen, maar ze opslaan in een Kubernetes Secret. Daarnaast zou je ook gebruik maken van SSL. Dit valt echter buiten de scope van deze handleiding.


 

Stap 3

Pas je configuratie toe op je cluster met het commando:

kubectl apply -f transip-demo.yaml

Je krijgt nu een bevestiging te zien die er ongeveer als volgt uitziet:

transip:~$ kubectl apply -f bsdemo.yaml
persistentvolumeclaim/nginx-pvc created
deployment.apps/nginx-deployment created
service/nginx-service created
persistentvolumeclaim/mysql-pvc created
deployment.apps/mysql-deployment created

Daarmee zijn we aan het eind van deze handleiding over het gebruik van block storage via een Persistent Volume Claim gekomen.

 

Heb je ook een goed idee?

Stuur jouw idee in! Met genoeg stemmen komt jouw idee op onze wishlist!

Heeft dit artikel je geholpen?

Maak een account aan of log in om een beoordeling achter te laten.

Reacties

Maak een account aan of log in om een reactie te plaatsen.

Kom je er niet uit?

Ontvang persoonlijke hulp van onze supporters

Neem contact op