Aller au contenu

Utiliser un serveur NFS pour vos volumes dans K8S

Dans ce guide on mettra en place un serveur NFS qui sera exploité par notre cluster K8S.

Présentation

C'est utile de centraliser les données à un seul endroit. Ton node-01 tombe, le pods qui était dessus se relance vers un autre noeud en retrouvant les données.

architecture

Mise en place d'un serveur NFS

Préparer le disque

lsblk -f

Identifier le disque non initialiser, dans mon cas /dev/sdb

Puis on va créer une partition et formater en ext4.

fdisk /dev/sdb

Puis on utilise la commande n pour ajouter une nouvelle partition, fdisk nous demande ensuite le type de partition : -p pour primaire -e pour étendue

Enfin on peut écrire dans la table de partition avec la commande w. Cela quitte fdisk.

Pour formater notre partition /dev/sdb1.

sudo mkfs -t ext4 /dev/sdb1

Ressources:

Montage fstab

mkdir -p /mnt/data

Editer votre /etc/fstab :

/dev/sdb1 /mnt/data ext4 rw 0 0

Verification montage:

sudo mount -a

Ressources :

Création de notre montage

apt install nfs-kernel-server

Déclarer notre partage :

sudo nano /etc/exports
/mnt/data 172.16.10.0/29(rw,no_subtree_check,no_root_squash)

Réseaux backbone dédier au partage de fichier.

Activer le serveur NFS

systemctl enable --now nfs-server.service

Ressources:

Configuration sur le cluster K8S

Prérequis

Sur chaque noeuds !

Maintenant, pour se connecter au serveur NFS, les noeuds Kubernetes ont besoin du paquetage client NFS. Vous devez exécuter la commande suivante uniquement sur les noeuds de travail Kubernetes - et les noeuds du plan de contrôle s'ils agissent également en tant que travailleurs.

apt install -y nfs-common

Configuration sur le control plan

Récupérer le dépôt Git :

git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git kubernetes-incubator
cd kubernetes-incubator

On va utiliser un namespace dédier pour l'objet.

sed -i'' "s/namespace:.*/namespace: k8s-nfs-storage/g" ./deploy/rbac.yaml
sed -i'' "s/namespace:.*/namespace: k8s-nfs-storage/g" ./deploy/deployment.yaml

Editer le fichier ./deploy/deployment.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: k8s-nfs-storage
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs
            - name: NFS_SERVER
              value: 172.16.10.4 << IP SERVEUR NFS
            - name: NFS_PATH
              value: /mnt/data << MONTAGE
      volumes:
        - name: nfs-client-root
          nfs:
            server: 172.16.10.4
            path: /mnt/data
Editer le fichier ./deploy/class.yaml :

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: storage.io/nfs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"

Créer le namespace

kubectl create namespace k8s-nfs-storage

Appliquer rbac.yml :

kubectl create -f ./deploy/rbac.yaml
kubectl create -f ./deploy/class.yaml
kubectl create -f ./deploy/deployment.yaml
kubectl get all -n k8s-nfs-storage

Vérification

kubectl apply -f ./deploy/test-pvc.yaml

Sur votre serveur NFS, /mnt/data une ressource sera créer.