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.
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
./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.