Kubernetes deel 2 de nfs share

Na een aantal cursussen via LinuxAcademy te hebben gevolgd, waaronder docker, nu bezig met een cursus Kubernetes. Een van de lessen was het gebruik van een NFS storage voor de pods. Hiervoor heb je een PersistentVolume (pv), een PersistentVolumeClaim (pvc) en een NFS server nodig. Je begint met het installeren van een NFS server. en gebruikt daarin de volgende export

/var/nfs/general <ips van de client_nodes>(rw,sync,no_subtree_check)

En ook op de nodes moet de nfs-common package geinstalleerd zijn.
Vervolgens maken we een pv.yaml file aan met de volgende inhoud:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: lapv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /var/nfs/general
    server: $your-storage-server-private-IP
    readOnly: false

Waarna we de PersistentVolume kunnen creeeren met

kubectl create -f pv.yaml

Hiermee maken we een connectie tussen de node en de NFS server
Om nu ook de storage kunnen gebruiken in de de andere pods moeten we een PersistentVolumeClaim (pvc) aanmaken. We maken dus een bestand aan genaamd pvc.yaml met de volgende inhoud:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

We creeeren deze pvc met het volgende commando

kubectl create -f pvc.yaml

Nu kunnen de pods welke op nodes draaien welke we in de export file op de NFS server hebben benoemd gebruik maken van cd pvc genaamd nfs-pvc. We maken dus een yaml file voor pods, welke deze storage kunnen gebruiken. Deze nfs-pod.yaml file ziet er alsvolgt uit:

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod
  labels:
    name: nfs-pod
spec:
  containers:
  - name: nfs-ctn
    image: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: nfsvol
      mountPath: /tmp
  restartPolicy: Always
  securityContext:
    fsGroup: 65534
    runAsUser: 65534
  volumes:
    - name: nfsvol
      persistentVolumeClaim:
        claimName: nfs-pvc

Deze yaml file maakt een pod aan met busybox en daain onze NFS share gemount onder /tmp.
We starten de pod op

kubectl create -y nfs-pod.yaml

en kunnen vervolgens inloggen op de pod met:

kubectl exec -it nfs-pod --sh

Ook kun je een deployment maken met een shared storage. Maak een nginx-nfs.yaml file aan met de volgende inhoud:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nfs-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nfs-nginx
  template:
    metadata:
      labels:
        name: nfs-nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
          - containerPort: 80
            name: "http-server"
        volumeMounts:
          # name must match the volume name below
          - name: nfsvol
            mountPath: "/var/nfs"
      volumes:
      - name: nfsvol
        persistentVolumeClaim:
          claimName: nfs-pvc

Hiermee kunnen we dus een cluster maken met de nginx image welke een NFS shared storage gebruikt.
Om dit deployment te starten geven we het commando

kubectl create -y nginx-nfs.yaml

We kunnen nu eventueel opschalen met het commando:

kubectl scale --replicas=4 deployment nfs-nginx

Om vervolgens alle pods te kunnen benaderen via 1 ip adres kunnen we een nodepoort gebruiken. We kunnen dat doen door middel van het volgende commando:

kubectl expose deployment nfs-nginx --name=nodeport --port=80 --target-port=80 --type=NodePort

We kunnen het ip adres vinden door het volgende commando te geven

kubectl get services

We kunnen ons deployment bereiken via het ip adres achter nodeport