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