A) nfs telepítése clusteren belülre, valamelyik node-ra:
NFS függőségek és a microk8s addon telepítése:
apt install -y nfs-common
mikrok8s enable community
mikrok8s enable nfs -n as201 ###----------------------> az as201 lesz az NFS szerver
# az engedélyezés után létrejön az alábbi storage class:
kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE
nfs cluster.local/nfs-server-provisioner Delete Immediate true
3 Gi persistent volume claim létrehozása:
nfs_pvc_3.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-dynamic-volume-claim
spec:
storageClassName: "nfs"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi
kubernetes apply -f nfs_pvc_3.yaml
root@asa201:/# kubectl get pvc -A
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-server-provisioner data-nfs-server-provisioner-0 Bound data-nfs-server-provisioner-0 1Gi RWO 116m
És már lehet is használni a podokhoz.
———————————————————————————————————————————————————————————-
B) nfs telepítése clusteren kívülre:
Persistent storage önálló, külső vm-en futó NFS szerverrel:
Ehhez létre kell hozni egy NFS szervert egy új vm-en . Nálam ez az as204 . A proxmox-ban installáltam egy ubuntu 22.04 LTS szervert és beállítottam az NFS megosztást, az alábbi leírás segítségével:
https://microk8s.io/docs/nfs
Az NFS szerver IP címe 192.168.1.204 , és ez is a proxmox vmbr1 bridge-ébe csatlakozik, a meglévő három cluster node mellé. Az openebs-sel esetén, ha leáll egy node-ja, nincs adatvesztés, az openebs maradék két nodján ott vannak az adatok. Ennél a storage megoldásnál a magas rendelkezésre állást viszont nekünk kell biztosítani. Természetesen HA nélkül is lehet használni a clustert.
Ez most csak egy VM, nincs magas rendelkezésre állás, ha leáll, megszűnik a persistent storage, a podok is leállhatnak. Az NFS megosztást lehet ReadWriteMany/ReadWriteOnce módban használni, több pod is osztozhat ugyanazon a megosztáson, ellentétben a csak ReadWriteOnce tárolókkal.
sudo apt-get install nfs-kernel-server
#nfs megosztáshoz
sudo mkdir -p /srv/nfs
sudo chown nobody:nogroup /srv/nfs
sudo chmod 0777 /srv/nfs
#exports fájl szerkesztése
# nfs szerver ip-je 192.168.1.204
sudo mv /etc/exports /etc/exports.bak
echo '/srv/nfs 192.168.1.204/24(rw,sync,no_subtree_check)' | sudo tee /etc/exports
# újraindítás
sudo systemctl restart nfs-kernel-server
Nfs cluster storage interfész telepítése a microk8s clusterünkben:
A telepítéshez be kell lépni a clusterba és telepíteni a csi-t:
root@asa201: microk8s enable helm3
root@asa201: microk8s helm3 repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
root@asa201: microk8s helm3 repo update
root@asa201: microk8s helm3 install csi-driver-nfs csi-driver-nfs/csi-driver-nfs \
--namespace kube-system \
--set kubeletDir=/var/snap/microk8s/common/var/lib/kubelet
root@asa201:/var/snap/microk8s/current/certs# kubectl --namespace=kube-system get pods --selector="app.kubernetes.io/instance=csi-driver-nfs" --watch
NAME READY STATUS RESTARTS AGE
csi-nfs-node-dlr42 0/3 ContainerCreating 0 19s
csi-nfs-controller-f9bd9cfc-m9mts 0/3 ContainerCreating 0 19s
csi-nfs-node-zt6bd 3/3 Running 0 19s
csi-nfs-node-h4mph 3/3 Running 0 19s
csi-nfs-controller-f9bd9cfc-m9mts 3/3 Running 0 20s
csi-nfs-node-dlr42 3/3 Running 0 20s
microk8s kubectl wait pod --selector app.kubernetes.io/name=csi-driver-nfs --for condition=ready --namespace kube-system
root@asa201:/var/snap/microk8s/current/certs# microk8s kubectl wait pod --selector app.kubernetes.io/name=csi-driver-nfs --for condition=ready --namespace kube-system
pod/csi-nfs-node-zt6bd condition met
pod/csi-nfs-node-h4mph condition met
pod/csi-nfs-controller-f9bd9cfc-m9mts condition met
pod/csi-nfs-node-dlr42 condition met
root@asa201:/var/snap/microk8s/current/certs# microk8s kubectl get csidrivers
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE
nfs.csi.k8s.io false false false <unset> false Persistent 2m58s
#root@asa201:/var/snap/microk8s/current/certs# microk8s kubectl get cs
#Warning: v1 ComponentStatus is deprecated in v1.19+
#NAME STATUS MESSAGE ERROR
#controller-manager Healthy ok
#scheduler Healthy ok
nfs1.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.1.204
share: /srv/nfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- hard
- nfsvers=4.1
nfs2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
storageClassName: nfs-csi
accessModes: [ReadWriteMany]
resources:
requests:
storage: 10Gi
Inditsuk el a podokat:
kubectl apply -f nfs1.yaml
kubectl apply -f nfs2.yaml
root@asa201:/home/vastag/k8s/nfs/nfs# k get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Delete Immediate false 7m30s
root@asa201:/home/vastag/k8s/nfs/nfs# k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67 10Gi RWX Delete Bound default/my-pvc nfs-csi 3m42s
root@asa201:/home/vastag/k8s/nfs/nfs# k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67 10Gi RWX nfs-csi 3m45s
root@asa201:/home/vastag/k8s/nfs/nfs# k get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Delete Immediate false 7m30s
root@asa201:/home/vastag/k8s/nfs/nfs# k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67 10Gi RWX Delete Bound default/my-pvc nfs-csi 3m42s
root@asa201:/home/vastag/k8s/nfs/nfs# k get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67 10Gi RWX nfs-csi 3m45s
Készitsümk egy podot az nfs megosztás kipróbálásához, fiof.yaml néven és futtassuk le:
kubectl apply -f fiof.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fiof
spec:
selector:
matchLabels:
name: fiof
replicas: 1
strategy:
type: Recreate
rollingUpdate: null
template:
metadata:
labels:
name: fiof
spec:
containers:
- name: perfrunnerf
image: openebs/tests-fio
command: ["/bin/bash"]
args: ["-c", "while true ;do sleep 50; done"]
volumeMounts:
- mountPath: /datadir_nfs
name: fio-vol
volumes:
- name: fio-vol
persistentVolumeClaim:
claimName: my-pvc
kubectl apply -f fio.yaml
Elindult a fiof pod , lépjünk be a podba:
root@asa201:/# k get pod
NAME READY STATUS RESTARTS AGE
fiof-6ddf7c8d7f-7kglj 1/1 Running 0 6m2s
## Belépés a konténerbe
root@asa201:/# kubectl exec -it fiof-6ddf7c8d7f-7kglj -- /bin/bash
## A komténer könyvtárai az nfs_datadir_nfs könyvtárral
root@fiof-6ddf7c8d7f-7kglj:/# ls -la
total 88
drwxr-xr-x 1 root root 4096 Mar 13 21:06 .
drwxr-xr-x 1 root root 4096 Mar 13 21:06 ..
drwxr-xr-x 2 root root 4096 Feb 12 2020 bin
drwxr-xr-x 2 root root 4096 Apr 12 2016 boot
drwxr-xr-x 2 nobody nogroup 4096 Mar 13 20:37 datadir_nfs
drwxr-xr-x 5 root root 360 Mar 13 21:06 dev
drwxr-xr-x 1 root root 4096 Mar 8 2020 etc
-rwxrwxr-x 1 root root 6230 Mar 8 2020 fio_runner.sh
drwxr-xr-x 2 root root 4096 Apr 12 2016 home
drwxr-xr-x 1 root root 4096 Sep 13 2015 lib
drwxr-xr-x 2 root root 4096 Feb 12 2020 lib64
drwxr-xr-x 2 root root 4096 Feb 12 2020 media
drwxr-xr-x 2 root root 4096 Feb 12 2020 mnt
drwxr-xr-x 2 root root 4096 Feb 12 2020 opt
dr-xr-xr-x 197 root root 0 Mar 13 21:06 proc
drwx------ 1 root root 4096 Mar 13 21:07 root
drwxr-xr-x 1 root root 4096 Mar 13 21:06 run
drwxr-xr-x 1 root root 4096 Feb 21 2020 sbin
drwxr-xr-x 2 root root 4096 Feb 12 2020 srv
dr-xr-xr-x 13 root root 0 Mar 13 21:05 sys
drwxr-xr-x 3 root root 4096 Mar 8 2020 templates
drwxrwxrwt 1 root root 4096 Mar 8 2020 tmp
drwxr-xr-x 1 root root 4096 Feb 12 2020 usr
drwxr-xr-x 1 root root 4096 Feb 12 2020 var
## A felcsatolt datadir_nfs könyvtár:
root@fiof-6ddf7c8d7f-7kglj:/# cd datadir_nfs/
root@fiof-6ddf7c8d7f-7kglj:/datadir_nfs# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 30G 9.2G 19G 33% /
tmpfs 64M 0 64M 0% /dev
192.168.1.204:/srv/nfs/pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67 25G 13G 11G 57% /datadir_nfs
/dev/sda2 30G 9.2G 19G 33% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 7.7G 12K 7.7G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 3.9G 0 3.9G 0% /proc/scsi
tmpfs 3.9G 0 3.9G 0% /sys/firmware
Futtassunk egy fiót, egész jó, 459 MB/sec, de vm-en belül vagyunk, valósi, fizikai gigabites hálózaton nem lesz ennyi:
root@fiof-6ddf7c8d7f-7kglj:/datadir_nfs# fio --name=ssdtest --filename=testfile1 --size=100M --bs=4k --iodepth=16 --rw=randwrite |grep WRITE:
WRITE: io=102400KB, aggrb=459192KB/s, minb=459192KB/s, maxb=459192KB/s, mint=223msec, maxt=223msec
root@fiof-6ddf7c8d7f-7kglj:/datadir_nfs# touch xtest1
root@fiof-6ddf7c8d7f-7kglj:/datadir_nfs# touch xtest2
root@fiof-6ddf7c8d7f-7kglj:/datadir_nfs# ls -la
total 102408
drwxr-xr-x 2 nobody nogroup 4096 Mar 13 21:38 .
drwxr-xr-x 1 root root 4096 Mar 13 21:06 ..
-rw-r--r-- 1 nobody nogroup 104857600 Mar 13 21:31 testfile1
-rw-r--r-- 1 nobody nogroup 0 Mar 13 21:38 xtest1
-rw-r--r-- 1 nobody nogroup 0 Mar 13 21:38 xtest2
root@fiof-6ddf7c8d7f-7kglj:/datadir_nfs# exit
exit
root@asa201:/#
root@asa201:/home/vastag/k8s/nfs/nfs#
root@asa201:/home/vastag/k8s/nfs/nfs# k delete -f fiof.yaml
deployment.apps "fiof" deleted
## töröltük a podot, de apod által a datadir_nfs könyvrárában létrehozott fájlokat nem, az nfs szerveren (asa204) ott maradtak a létrehozott fájlok:
root@asa204:/srv/nfs/pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67# la -la
total 102408
drwxr-xr-x 2 nobody nogroup 4096 márc 13 21:38 .
drwxrwxrwx 3 nobody nogroup 4096 márc 13 21:40 ..
-rw-r--r-- 1 nobody nogroup 104857600 márc 13 21:31 testfile1
-rw-r--r-- 1 nobody nogroup 0 márc 13 21:38 xtest1
-rw-r--r-- 1 nobody nogroup 0 márc 13 21:38 xtest2
root@asa204:/srv/nfs/pvc-8b8a1b82-0c0a-412c-a2d6-9592152d6b67#