Déploiement du Load-Balancer
Cas d’usage
Dans le cas où l’on a plusieurs K3s Server dans son lab (ici, j’en ai 2), l’API server est actif sur chaque K3s Server. Quand on veut interagir avec son cluster avec l’utilitaire Kubectl, nous devons choisir de requêter sur un K3s Server parmi les 2 disponibles. Ca ne pose pas de problème dès l’instant que ce noeud K3s server choisi est disponible, dans le cas contraire, nous serions dans l’obligation de changer notre configuration (kubeconfig) pour requêter sur l’autre K3s Server encore vivant. Dans de telles circonstances, on ne peut pas dire qu’on soit dans de la haute disponibilité !
Pour résoudre ce problème, en frontal de mes deux K3s Server Tanjiro et Nezuko, je vais déployer un conteneur NGINX configuré en Load-Balancer sur mon NAS Synology qui sert de serveur hôte Docker.
Ce conteneur NGINX se chargera de rediriger mes requêtes kubectl aléatoirement entre les deux API server présent sur Tanjiro et Nezuko.
Dans ma configuration pour kubectl, je n’aurai plus qu’à configurer l’adresse IP virtuelle du Load-Balancer. Résultat, si un de mes K3s Server ne devait plus être disponible, je n’aurai pas à changer manuellement mon kubeconfig, le Load-balancer enverra automatiquement mes requêtes vers l’API Server de noeud encore actif.
Préparation
Fichier docker-compose
Au choix, vous passez la commande docker pour lancer le conteneur, ou bien vous décidez de passer par la commande docker-compose. Personnellement, ce sera mon choix, voici mon fichier docker-compose:
version: "3.9"
load-balancer:
image: "nginx:mainline"
container_name: "k3s-lb"
hostname: "nginx"
restart: "on-failure"
volumes:
- "/volume1/docker/nginx/load-balancing-k3s/conf/nginx.conf:/etc/nginx/nginx.conf"
ports:
- 6443:6443
Quelques explications:
- L’image de base est celle de NGINX avec le tag
mainline - Le conteneur s’appelera
k3s-lbune fois qu’il sera lancé - Le hostname à l’intérieur du conteneur sera
nginx - Le conteneur sera systématiquement redémarré en cas d’échec (
On failure) - La configuration de NGINX dans le conteneur est mappée dans un fichier stocké sur l’hôte Docker
- Le conteneur expose le port TCP/6443 où écoute NGINX écoute également dans le contenu
Fichier de configuration NGINX
Voici maintenant le fichier nginx.conf qui sera utilisé par NGINX dans le conteneur. Comme indiqué plus haut dans le fichier docker-compose. Il sera stocké dans le répertoire /volume1/docker/nginx/load-balancing-k3s/conf/
events {}
stream {
upstream k3s_servers { # <-- On défini un groupe de machines `k3s_servers`
server 192.168.1.51:6443; # <-- Adresse IP du master `Tanjiro`
server 192.168.1.54:6443; # <-- Adresse IP du master `Nezuko`
}
server {
listen 6443; # <-- Le LB écoute sur le port TCP 6443
proxy_pass k3s_servers; # <-- On renvoie les requêtes vers les hosts du `k3s_servers`
}
}
Déploiement
Démarrer la stack
$ cd /volume1/docker/nginx/load-balancing-k3s/
$ sudo docker-compose up -d
Donne le statut du conteneur
$ sudo docker container ls
Arrête et supprime la stack
$ sudo docker-compose down
Voilà, c’est terminé pour cette étape. Dans mon prochain billet, nous commencerons à construire notre cluster K3s, en démarrant par le déploiement du control-plane.