Fork me on GitHub

Herr Knedel/Du grand avec les conteneurs : cluster Kubenetes et stockage NFS

Created Sun, 20 Jun 2021 00:00:00 +0000 Modified Sat, 02 Apr 2022 15:02:30 +0000 Niveau de difficulté: Très sportif

960 Words

Aujourd’hui, j’installe un nouveau cluster Kubenetes et il y a beaucoup à faire !

J’ai commandé ces composants pour cela :

C’est parti !

Pour l’installation, j’ai créé ma propre image basée sur l’installation de Raspian Lite. Dans celle-ci, mon utilisateur/clé publique est déjà enregistré et le fichier “/boot/config.txt” est adapté à mes LEDs.

# meine Server brauchen kein HDMI, WLAN und Bluetooth
dtoverlay=disable-bt
dtoverlay=disable-wifi
disable_splash=1
hdmi_blanking=1
hdmi_ignore_hotplug=1
hdmi_ignore_composite=1
 
 
# Status-LEDs an GPIO weiterleiten
dtoverlay=act-led,gpio=21
dtparam=act_led_trigger=cpu0

Serveur 1 - Monter le disque

Tout d’abord, j’installe un service NFS sur le “serveur 1”. Ce stockage pourra être utilisé plus tard pour mon cluster de conteneurs. J’ai connecté le disque dur USB au “serveur 1” et l’ai formaté en EXT4 en suivant les instructions : https://homecircuits.eu/blog/mount-sata-cubieboard-lubuntu/ Ensuite, j’ai créé un point de montage pour le disque USB :

x
+
Terminal

$ sudo mkdir /media/usb-platte

J’ai ajouté le nouveau système de fichiers au fichier “/etc/fstab” comme suit :

/dev/sda1 /media/usb-platte ext4 defaults 0 2

Le réglage peut être vérifié avec “sudo mount -a”. Le disque USB devrait maintenant être monté sous “/media/usb-platte”.

Installer NFS

Pour NFS, ce paquet est nécessaire :

x
+
Terminal

$ sudo apt-get install nfs-kernel-server -y

En outre, un nouveau dossier a été créé sur le disque USB

x
+
Terminal

$ sudo mkdir /media/usb-platte/nfsshare
$ sudo chown -R pi:pi /media/usb-platte/nfsshare/
$ sudo find /media/usb-platte/nfsshare/ -type d -exec chmod 755 {} \;
$ sudo find /media/usb-platte/nfsshare/ -type f -exec chmod 644 {} \;

Il faut ensuite éditer le fichier “/etc/exports”. Le chemin d’accès, l’ID d’utilisateur et l’ID de groupe doivent y être inscrits :

/media/usb-platte/nfsshare *(rw,all_squash,insecure,async,no_subtree_check,anonuid=1000,anongid=1000)

Il est maintenant possible de reprendre le réglage comme suit.

x
+
Terminal

$ sudo exportfs -ra

Comment monter le NFS ?

Je peux monter le volume comme suit :

x
+
Terminal

$ sudo mount -t nfs SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs

Ou l’ajouter de manière permanente au fichier “/etc/fstab” :

SERVER-1-IP:/media/usb-platte/nfsshare /mnt/nfs/ nfs defaults 0 0

Ici aussi, je peux utiliser “sudo mount -a”.

Installer Kubernetes

Les commandes suivantes doivent être exécutées sur le serveur 1, le serveur 2 et le serveur 3. Tout d’abord, nous installons Docker et ajoutons l’utilisateur “PI” dans le groupe Docker.

x
+
Terminal

$ curl -sSL get.docker.com | sh
$ sudo usermod pi -aG docker

Après cela, le réglage de la taille d’échange est mis à zéro sur tous les serveurs. Cela signifie que je modifie le fichier “/etc/dphys-swapfile” et que je règle l’attribut “CONF_SWAPSIZE” sur “0”.

En outre, les paramètres “Control-Group” doivent être adaptés dans le fichier “/boot/cmdline.txt” :

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Voir

Maintenant, tous les Raspberry doivent redémarrer une fois et sont prêts pour l’installation de Kubernetes.

x
+
Terminal

$ sudo reboot

Après le redémarrage, j’installe ces paquets sur le serveur 1, le serveur 2 et le serveur 3 :
x
+
Terminal

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
$ sudo apt-get update -q && sudo apt-get install -qy kubeadm

# Serveur 1 uniquement

Le maître Kubenetes peut maintenant être initialisé.

x
+
Terminal

$ sudo kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16

Après une initialisation réussie, j’accepte les paramètres. Je retiens la commande “kubeadm join” affichée pour la connexion des nœuds de travail.
x
+
Terminal

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Maintenant, il faut malheureusement encore faire quelque chose pour le réseau.
x
+
Terminal

$ kubectl apply https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
$ sudo systemctl daemon-reload
$ systemctl restart kubelet

La commande “kubectl get nodes” devrait maintenant afficher le “maître” à l’état “prêt”.

Kubernetes - Ajouter des nœuds

Maintenant, nous avons besoin de la commande “kubeadm join” de l’initialisation de Kubenetes. J’entre cette commande sur “serveur 2” et “serveur 3”.

x
+
Terminal

$ kubeadm join master-ip:port --token r4fddsfjdsjsdfomsfdoi --discovery-token-ca-cert-hash sha256:1adea3bfxfdfddfdfxfdfsdffsfdsdf946da811c27d1807aa

Si j’entre à nouveau la commande “kubectl get nodes” à partir de “Server 1”, ces nœuds m’apparaissent probablement dans l’état “Not Ready”. Ici aussi, il y a le problème de réseau que le maître avait également. J’exécute à nouveau la commande de tout à l’heure, mais cette fois-ci j’ajoute un “f” pour force.
x
+
Terminal

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

Après cela, je vois tous les nœuds prêts à l’emploi.

Petit déploiement de test (serveur 1/maître Kubenetes)

J’écris un petit déploiement de test et je vérifie les fonctions. Je crée un fichier “nginx.yml” avec le contenu suivant :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
 selector:
   matchLabels:
     run: my-nginx
 replicas: 2
 template:
   metadata:
     labels:
       run: my-nginx
   spec:
     containers:
     - name: my-nginx
       image: nginx
       ports:
       - containerPort: 80

Maintenant, je lance le déploiement :

x
+
Terminal

$ kubectl apply -f nginx.yml
$ kubectl rollout status deployment/my-nginx
$ kubectl get deplyments

Génial !

Je crée un service et je peux appeler mon conteneur. Je mets à l’échelle une fois pour 20 “réplicas” :
x
+
Terminal

$ kubectl scale deployment my-nginx --replicas=0; kubectl scale deployment my-nginx --replicas=20

Voir

Nettoyer le déploiement de test

Pour faire le ménage, je supprime à nouveau le déploiement et le service.

x
+
Terminal

$ kubectl delete service example-service
$ kubectl delete deplyments my-nginx

Voir