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#



Tags