NFS’yi Kubernetes Kalıcı Birim Depolama Alanı Olarak Yapılandırma

Bu kılavuzda Kubernetes (k8s) kümesinde dinamik nfs sağlamanın nasıl kurulacağını öğreneceğiz.

Ağ Dosya Sistemi (NFS), dağıtılmış dosya paylaşımına yönelik bir ağ protokolüdür.  Bilgisayarların ağ üzerinden dosyalara erişmesini veya bunları paylaşmasını sağlayan bir protokoldür.  Birden fazla kullanıcının ve heterojen istemci cihazlarının merkezi disk kapasitesinden veri alabildiği özel bir dosya depolama alanına sahip olmak kolay bir çözümdür.

Kubernetes’te dinamik NFS depolama provizyonu, isteğe bağlı olarak Kubernetes uygulamalarınız için NFS (Ağ Dosya Sistemi) birimlerini otomatik olarak sağlamanıza ve yönetmenize olanak tanır.  Kalıcı birimlerin (PV’ler) ve kalıcı birim taleplerinin (PVC’ler) manuel müdahale veya önceden provizyonlanmış depolama gerektirmeden oluşturulmasına olanak tanır.

NFS sağlayıcısı, dinamik olarak PV’ler oluşturmaktan ve bunları PVC’lere bağlamaktan sorumludur.  Her PVC için dizinler veya birimler oluşturmak üzere NFS sunucusuyla etkileşime girer.

NFS sunucusunu kurma

Ubuntu 22.04 sunucusuna bir NFS sunucusu kuracağız ancak Debian tabanlı başka bir sisteminiz varsa bu kılavuz işe yarayacaktır.

First install the NFS server:

1
2
sudo apt update
sudo apt install nfs-kernel-server -y

Create the following folder and share it using nfs,

1
2
3
sudo mkdir /mnt/k8s-dynamic-store
sudo chown -R nobody:nogroup /mnt/k8s-dynamic-store
sudo chmod 2770 /mnt/k8s-dynamic-store

Add the following entries in /etc/exports file

1
2
$ sudo vim /etc/exports
/mnt/k8s-dynamic-store 10.20.1.0/24(rw,sync,no_subtree_check)

Save and close the file.

  Note: Don’t forget to change network in exports file that suits to your deployment.

To make above changes into the effect, run

1
2
3
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server

On each of the worker nodes, install nfs-common package using following apt command.

1
sudo apt install nfs-common -y

Kubernetes NFS Subdir External Provisioner Kurulumu

NFS subdir external provisioner, Kalıcı Birim Talepleri aracılığıyla Kubernetes Kalıcı Birimlerin dinamik provizyonunu desteklemek için mevcut ve önceden yapılandırılmış NFS sunucunuzu kullanan otomatik bir provizyonlayıcıdır.  Kalıcı birimlerin temel hazırlığı ${namespace}-${pvcName}-${pvName} olarak sağlanır.

Bu nedenle, NFS alt dizini harici provizyonlayıcıyı kurmak için öncelikle aşağıdaki komut setini kullanarak Helm ‘i kurun,

1
2
3
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Zaten bir NFS Sunucunuz olması gerekir.

Aşağıdaki komutu çalıştırarak helm deposunu etkinleştirin:

1
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

Aşağıdaki helm komutunu kullanarak hazırlayıcıyı dağıtın

1
2
3
4
5
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --create-namespace \
    -n nfs-provisioning \
    --set nfs.server=10.20.1.4 \
    --set nfs.path=/mnt/k8s-dynamic-store

Yukarıdaki komut, nfs-provisioning adı verilen bir ad alanı oluşturacak ve nfs provizyonlayıcı bölmesini/dağıtımını, depolama sınıfını (nfs-client) adıyla yükleyecek ve gerekli rbac’ı oluşturacaktır.

Beklendiği gibi çalıştığını doğrulayabilirsiniz:

1
2
kubectl get all -n nfs-provisioning
kubectl get sc -n nfs-provisioning

Bu benim çıktım:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
➜ kubectl get all -n nfs-provisioning

NAME                                                   READY   STATUS              RESTARTS   AGE
pod/nfs-subdir-external-provisioner-6b8fbdc787-bws5h   1/1     Running             0          102s

NAME                                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-subdir-external-provisioner   1/1     1            1           44m

NAME                                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/nfs-subdir-external-provisioner-6b8fbdc787   1         1         1       103s

Ve bu

1
2
3
4
➜ kubectl get sc -n nfs-provisioning
NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path                           Delete          WaitForFirstConsumer   false                  4d3h
nfs-client             cluster.local/nfs-subdir-external-provisioner   Delete          Immediate              true                   45m

Kalıcı Birim Talepleri Oluşturun (PVC’ler)

Kurulumumuzu test etmek için bir kapsül için depolama talep edecek bir PVC oluşturacağız.  PVC, StorageClass’tan (nfs-client) belirli bir miktarda depolama talep edecektir.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ vim test-pvc.yml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  namespace: nfs-provisioning
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Mi

Kaydet ve kapat.

Yukarıda oluşturulan yml dosyasını kullanarak pvc oluşturmak için aşağıdaki kubectl komutunu çalıştırın,

1
kubectl create -f test-pvc.yml

PVC ve PV’nin oluşturulup oluşturulmadığını doğrulayın,

1
kubectl get pv,pvc -n nfs-provisioning

Bu

1
2
3
4
5
6
7
➜ kubectl get pv,pvc -n nfs-provisioning

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS   REASON   AGE
persistentvolume/pvc-d4e1d20d-ac8a-4f66-8fec-ca9537ac4ed3   5Mi        RWX            Delete           Bound    nfs-provisioning/test-claim   nfs-client              55s

NAME                               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/test-claim   Bound    pvc-d4e1d20d-ac8a-4f66-8fec-ca9537ac4ed3   5Mi        RWX            nfs-client     55s

Yukarıdaki çıktı pv ve pvc’nin başarıyla oluşturulduğunu göstermektedir.

Dinamik NFS Hazırlamayı Test Edin ve Doğrulayın

Dinamik nfs sağlamayı test etmek ve doğrulamak için aşağıdaki yml dosyasını kullanarak bir test bölmesini başlatın,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ vim test-pod.yml

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: nfs-provisioning
spec:
  containers:
  - name: test-pod
    image: busybox:latest
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && sleep 600"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim

Aşağıdaki kubectl komutunu kullanarak bölmeyi dağıtın,

1
kubectl create -f test-pod.yml

Test bölmesinin durumunu doğrulayın,

1
2
3
4
➜ kubectl get pods -n nfs-provisioning

NAME                                               READY   STATUS    RESTARTS   AGE
test-pod                                           1/1     Running   0          113s

Pod’u alın

1
kubectl get pods -n nfs-provisioning

Pod’da oturum açın ve nfs biriminin takılı olup olmadığını doğrulayın.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜ kubectl exec -it test-pod -n nfs-provisioning -- /bin/sh

/ # df -h
Filesystem                Size      Used Available Use% Mounted on
overlay                  29.3G      3.3G     24.7G  12% /
tmpfs                    64.0M         0     64.0M   0% /dev
10.20.1.4:/mnt/k8s-dynamic-store/nfs-provisioning-test-claim-pvc-d4e1d20d-ac8a-4f66-8fec-ca9537ac4ed3
                         19.5G      2.0G     16.6G  11% /mnt
/dev/sda1                29.3G      3.3G     24.7G  12% /etc/hosts
/dev/sda1                29.3G      3.3G     24.7G  12% /dev/termination-log
/dev/sda1                29.3G      3.3G     24.7G  12% /etc/hostname
/dev/sda1                29.3G      3.3G     24.7G  12% /etc/resolv.conf
shm                      64.0M         0     64.0M   0% /dev/shm
tmpfs                     3.8G     12.0K      3.8G   0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs                     1.9G         0      1.9G   0% /proc/acpi
tmpfs                    64.0M         0     64.0M   0% /proc/kcore
tmpfs                    64.0M         0     64.0M   0% /proc/keys
tmpfs                    64.0M         0     64.0M   0% /proc/timer_list
tmpfs                     1.9G         0      1.9G   0% /sys/firmware
/ # cd /mnt/ && ls
SUCCESS
/mnt #

Harika, pod’dan alınan yukarıdaki çıktı, dinamik NFS biriminin takılı ve erişilebilir olduğunu doğruluyor.

Son olarak pod ve PVC’yi silip pv’nin otomatik olarak silinip silinmediğini kontrol edelim.

1
2
kubectl delete -f test-pod.yml
kubectl delete -f test-pvc.yml

Daha sonra onaylayın

1
2
➜ kubectl get pv,pvc -n  nfs-provisioning
No resources found

Birden Çok Hazırlayıcı Yükleme

Birden çok nfs sunucusuna erişim sağlamak ve/veya tek bir nfs sunucusundan birden çok dışa aktarıma sahip olmak için kümenize birden çok NFS sağlayıcısı yüklemek mümkündür.  Her provizörün farklı bir StorageClass.provisionerName’e ve farklı bir StorageClass.name’e sahip olması gerekir.  Örneğin:

1
2
3
4
5
helm install  -n nfs-provisioner second-nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=x.x.x.x \
    --set nfs.path=/second/exported/path \
    --set storageClass.name=second-nfs-client \
    --set storageClass.provisionerName=k8s-sigs.io/second-nfs-subdir-external

 

Yazının orijinalini buradan okuyabilirsiniz.