Comment déployer l’équilibrage de charge Nginx sur un cluster Kubernetes sur Ubuntu 18.04 LTS

Kubernetes est un système d’orchestration de conteneurs gratuit et open-source qui peut être utilisé pour déployer et gérer des conteneurs. Il a été développé par Google et spécialement conçu pour l’autoscaling et les déploiements automatisés. Kubernetes peut fonctionner sur n’importe quelle infrastructure de cloud et sur du métal nu. Kubernetes te permet de distribuer plusieurs applications sur un cluster de nœuds. Kubernetes est doté d’un riche ensemble de fonctionnalités, notamment l’auto-réparation, l’auto-mise à l’échelle, l’équilibrage des charges, l’exécution par lots, la mise à l’échelle horizontale, la découverte de services, l’orchestration du stockage et bien d’autres encore.

Dans ce tutoriel, nous allons apprendre à configurer l’équilibrage de charge de Nginx avec Kubernetes sur Ubuntu 18.04.

Exigences

  • Deux serveurs avec Ubuntu 18.04 installé.
  • Au moins 2 Go de RAM installés sur chaque serveur.
  • Un mot de passe root est configuré sur les deux serveurs.

Pour commencer

Tout d’abord, tu dois mettre à jour les deux serveurs avec la dernière version stable. Tu peux les mettre à jour en exécutant la commande suivante :

apt-get update -y
apt-get upgrade -y

Une fois les deux serveurs mis à jour, redémarre-les pour appliquer toutes les modifications.

Par défaut, Kuberenetes ne prend pas en charge la mémoire swap et ne fonctionnera pas si le swap est actif. Tu devras donc désactiver la mémoire swap sur les deux serveurs.

Pour désactiver temporairement la mémoire swap, exécute la commande suivante :

swapoff -a

Pour désactiver la mémoire swap de façon permanente, ouvre le fichier /etc/fstab :

nano /etc/fstab

Mets en commentaire la dernière ligne :

# /etc/fstab: static file system information.
#
# use 'blkid' to print the universally unique identifier for a
# device; this may be used with uuid= as a more robust way to name devices
# that works even if disks are added and removed. see fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
# swap was on /dev/sda4 during installation #UUID=65se21r-1d3t-3263-2198-e564c275e156 none swap sw 0 0

Enregistre et ferme le fichier. Ensuite, exécute la commande suivante pour appliquer les changements de configuration :

mount -a

Ensuite, tu devras configurer la résolution des noms d’hôtes sur les deux serveurs. Ainsi, chaque serveur peut communiquer avec l’autre en utilisant le nom d’hôte.

Pour ce faire, ouvre le fichier /etc/hosts en utilisant ton éditeur préféré :

nano /etc/hosts

Ajoute les lignes suivantes :

192.168.0.103 master
192.168.0.100 slave

Enregistre et ferme le fichier lorsque tu as terminé. Ensuite, passe à l’étape suivante.

Installe Docker et Kubernetes

Ensuite, tu devras installer l’outil Docker et Kubernetes, kubelet, kubeadm et kubectl, sur les deux serveurs.

Tout d’abord, installe les paquets requis et ajoute la clé GPG avec la commande suivante :

apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

Ensuite, ajoute le référentiel Docker CE sur les deux serveurs en exécutant la commande suivante :

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Ensuite, mets à jour le référentiel et installe Docker CE avec la commande suivante :

apt-get update -y
apt-get install docker-ce -y

Une fois l’installation terminée, vérifie l’état de Docker CE avec la commande suivante :

systemctl status docker

Tu devrais voir la sortie suivante :

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-07-19 07:05:50 UTC; 1h 24min ago
     Docs: https://docs.docker.com
 Main PID: 3619 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
           ??3619 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.574491681Z" level=warning msg="Your kernel does not support swap memory limit"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575196691Z" level=warning msg="Your kernel does not support cgroup rt period"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575733336Z" level=warning msg="Your kernel does not support cgroup rt runtime"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.582517104Z" level=info msg="Loading containers: start."
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.391255541Z" level=info msg="Default bridge (docker0) is assigned with an IP add
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.681478822Z" level=info msg="Loading containers: done."
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.003776717Z" level=info msg="Docker daemon" commit=0dd43dd graphdriver(s)=overla
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.009892901Z" level=info msg="Daemon has completed initialization"
Jul 19 07:05:50 master systemd[1]: Started Docker Application Container Engine.
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.279284258Z" level=info msg="API listen on /var/run/docker.sock"

Les paquets Kubernetes ne sont pas disponibles dans le référentiel par défaut d’Ubuntu 18.04. Tu dois donc ajouter le référentiel Kubernetes sur les deux serveurs.

Tu peux l’ajouter avec les commandes suivantes :

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | tee /etc/apt/sources.list.d/kubernetes.list

Ensuite, mets à jour le référentiel et installe les paquets Kubernetes avec la commande suivante :

apt-get install kubelet kubeadm kubectl -y

Une fois que tous les paquets sont installés, tu peux passer à la configuration du serveur Master.

Configurer le serveur maître Kubernetes

Tout d’abord, tu dois initialiser ton cluster avec son adresse IP privée sur le serveur Master :

Tu peux le faire avec la commande kubeadm :

kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.0.103

Une fois que le Cluster s’est initialisé avec succès, tu devrais voir la sortie suivante :

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u \
    --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c 

Ensuite, tu devras configurer l’outil kubectl sur ton serveur Maître. Tu peux le faire avec la commande suivante :

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

Ensuite, tu devras déployer une Container Networking Interface (CNI) sur ton serveur. Car le cluster n’a pas de CNI.

Tu peux déployer la CNI sur ton cluster avec la commande suivante :

kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

Tu devrais voir la sortie suivante :

configmap/calico-config created
daemonset.extensions/calico-etcd created
service/calico-etcd created
daemonset.extensions/calico-node created
deployment.extensions/calico-kube-controllers created
deployment.extensions/calico-policy-controller created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
serviceaccount/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

Tu peux maintenant vérifier tes espaces de noms en exécutant la commande suivante :

kubectl get namespaces

Si tout se passe bien, tu devrais voir la sortie suivante :

NAME          STATUS    AGE
default       Active    4h
kube-public   Active    4h
kube-system   Active    4h

Ensuite, vérifie si le nœud maître fonctionne maintenant correctement avec la commande suivante :

kubectl get nodes

Tu devrais voir le résultat suivant :

name          status    roles     age       version
master   Ready     master    12m       v1.15.3

Ajoute l’esclave au cluster Kubernetes

Ensuite, connecte-toi à ton serveur esclave et exécute la commande suivante pour ajouter l’esclave au cluster Kubernetes :

kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c

Ensuite, va sur le serveur maître et vérifie si l’esclave est ajouté à ton cluster Kubernetes avec la commande suivante :

kubectl get nodes

Tu devrais voir la sortie suivante :

name status roles age version
master ready master 25m v1.15.3
slave ready 2m v1.15.3

Une fois que tu as terminé, tu peux passer à l’étape suivante.

Déploie NGINX sur le cluster Kubernetes

Le cluster Kubernetes est maintenant installé, configuré et fonctionne correctement. Il est temps de déployer Nginx sur le cluster Kubernetes.

Va sur le serveur maître et crée un déploiement Nginx avec la commande suivante :

kubectl create deployment nginx --image=nginx

Tu peux maintenant répertorier le déploiement Nginx avec la commande suivante :

kubectl get deployments

Tu devrais voir la sortie suivante :

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           99s

Une fois que le Nginx a été déployé, l’application peut être exposée avec la commande suivante :

kubectl create service nodeport nginx --tcp=80:80

Tu peux maintenant voir une nouvelle adresse Service et ClusterIP attribuée avec la commande suivante :

kubectl get svc

Tu devrais voir le résultat suivant :

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1             443/TCP   15m
nginx        ClusterIP   10.152.183.199           80:32456/TCP    60s

Félicitations ! Tu as déployé avec succès Nginx sur le cluster Kubernetes. Tu peux aussi ajouter facilement un autre nœud au cluster Kubernetes. Pour plus d’informations, consulte la doc officielle de Kubernetes à l’adresse Kubernetes Doc. N’hésite pas à me demander si tu as des questions.

Vous aimerez aussi...