Cet article a pour but l’initiation à l’utilisation d’un gestionnaire de conteneurs. Le public visé est tout développeur souhaitant commencer une carrière en tant que DevOps. Le prérequis est la connaissance de docker, afin de créer les conteneurs qui seront déployés et gérés par notre orchestrateur, pour cela vous avez le lien de mon article qui vous aide à apprendre les commandes nécessaires :

 https://creativetech-fr.devoteam.com/2021/06/30/best-practice-docker-en-5-minutes/

Outils nécessaires : CHOCOLATE, KUBERNETESCLI, MINIKUBE, VIRTUAL BOX

 

KUBERNETES : Présentation et utilité

KUBERNETES est un outil d’orchestration de conteneur et de gestion de cluster. Cela consiste en un ensemble d’outils et de script qui permettent l’automatisation des opérations suivantes :

  • Suivie du bilan de santé : Il faut surveiller l’état d’exécution et de santé des conteneurs, assuré par KUBELET.
  • Scalabilité des conteneurs : Il faut démarrer plusieurs instances en fonction de la charge.
  • Assuré une haute disponibilité :  Si une instance tombe en panne il faut la remplacer.
  • L’équilibrage des charges et routage : Ils sont assurés par KUBE-PROXY, en se basant sur les données (performance processeur, mémoire, réseau) renvoyées par CADVISOR.

Architecture et terminologie

Figure 1. KUBERNETES cluster

POD

C’est un groupe de conteneurs et de volumes (bases de données), démarrés arrêtés et répliqués en groupe, si j’exécute un pod j’exécute les conteneurs. C’est l’entité de base qu’on va répliquer sur les différents nœuds du cluster.

NOEUD

Un nœud est une machine virtuelle ou un ordinateur physique qui sert d’ordinateur subordonné dans un cluster KUBERNETES. Chaque nœud a un KUBELET, qui est un agent pour gérer le nœud et communiquer avec le plan de contrôle KUBERNETES. Le nœud doit également disposer d’outils pour gérer les opérations de conteneur, tels que CONTAINERD ou DOCKER. Un cluster KUBERNETES qui gère le trafic de production doit avoir un minimum de trois nœuds, car si un nœud tombe en panne, un membre ETCD et une instance de plan de contrôle sont perdus et la redondance est compromise. Vous pouvez atténuer ce risque en ajoutant d’autres nœuds de plan de contrôle.

Cluster

KUBERNETES coordonne un cluster hautement disponible d’ordinateurs connectés pour fonctionner comme une seule unité. Les abstractions dans KUBERNETES vous permettent de déployer des applications conteneurisées sur un cluster sans les lier spécifiquement à des machines individuelles. Pour utiliser ce nouveau modèle de déploiement, les applications doivent être empaquetées de manière à les dissocier des hôtes individuels : elles doivent être conteneurisées. Les applications conteneurisées sont plus flexibles et disponibles que dans les modèles de déploiement précédents, où les applications étaient installées directement sur des machines spécifiques sous forme de packages profondément intégrés à l’hôte. KUBERNETES automatise la distribution et la planification des conteneurs d’applications sur un cluster de manière plus efficace. KUBERNETES est une plate-forme open source prête pour la production.

Un cluster KUBERNETES se compose de deux types de ressources :

  • Le plan de contrôle coordonne le cluster
  • Les nœuds sont les travailleurs qui exécutent les applications

a)   Le plan de contrôle :

Le plan de contrôle est responsable de la gestion du cluster. Il coordonne toutes les activités de votre cluster, telles que la planification des applications, la maintenance de l’état souhaité des applications, la mise à l’échelle des applications et le déploiement de nouvelles mises à jour.

Namespaces

Ils divisent un cluster physique en des clusters virtuels. Ils sont destinés à donner à plusieurs équipes, utilisateurs et projets un environnement de travail virtuellement séparé et à empêcher les équipes de se gêner en limitant les objets KUBERNETES auxquels les équipes peuvent voir et accéder. Ils servent à séparer les ressources comme production, développement et test.

Service

Un service dans KUBERNETES est une abstraction qui définit un ensemble logique de PODS et une stratégie permettant d’y accéder. Les services permettent un couplage faible entre les PODS dépendants. L’ensemble des PODS ciblés par un service est généralement déterminé par une étiquette.

Bien que chaque POD possède une adresse IP unique, ces adresses IP ne sont pas exposées en dehors du cluster sans service. Les services permettent à vos applications de recevoir du trafic. Les services peuvent être exposés de différentes manières en spécifiant le type.

Les différents types de service :

  • Cluster-IP :
    Il expose le service sur une IP interne au cluster. Le choix de cette valeur rend le service uniquement accessible à partir du cluster. Il s’agit du type de service par défaut.
  • Node-Port :
    Permet de mapper le port vers un autre port qui est accessible de l’extérieur.
    Expose le service sur l’IP de chaque nœud sur un port statique (le Node-Port). Un service Cluster-IP, vers lequel le service Node-Port est automatiquement créé. Vous pourrez contacter le service Node-Port, depuis l’extérieur du cluster, en demandant <Node-IP> : <Node-Port>.
  • Load Balancer :
    Expose le service en externe à l’aide de l’équilibreur de charge d’un fournisseur de cloud. Les services Node-Port et Cluster-IP, vers lesquels les itinéraires de l’équilibreur de charge externe, sont automatiquement créés.
  • External Name :
    Mappe le service au contenu du champ external Name (par exemple foo.bar.example.com), en renvoyant un enregistrement CNAME avec sa valeur. Aucun proxy d’aucune sorte n’est mis en place.

Installation de KUBERNETES en local avec MINIBUKE

Il y a plusieurs moyens pour créer un cluster KUBERNETES, soit sur les plateformes cloud telles que Azure, AWS, GCP, soit en local avec des outils tels que MINIKUBE.

MINIKUBE est un outil qui fait tourner un cluster KUBERNETES à un nœud unique dans une machine virtuelle sur votre machine.

C’est une machine virtuelle, avec l’essentiel des packages de docker et KUBERNETES, qui nécessite d’avoir installé VIRTUAL BOX, elle contient boot to docker c’est-à-dire il va installer docker en même temps qu’un cluster KUBERNETES local. Bien entendu, en production il faut installer un vrai cluster KUBERNETES.

Avant d’installer MINIKUBE, on a besoin d’installer KUBECTL.

KUBECTL est un outil d’interface de ligne de commande de KUBERNETES, il permet d’exécuter des commandes dans les clusters KUBERNETES. On peut l’utiliser pour déployer des applications, inspecter et gérer les ressources du cluster et consulter les logs…

Installer le gestionnaire application CHOCOLATEY avec POWERSHELL:
  • En utilisant PowerShell, exécutez Get-ExecutionPolicy.

Si ça renvoie Restricted, alors exécutez Set-ExecutionPolicy AllSigned or Set-ExecutionPolicy Bypass -Scope Process.

  • Exécutez la commande suivante :

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1‘))

Installer KUBERNETECLI avec CHOCOLATEY
choco install kubernetes-cli

Vérifier la version de KUBECTL
kubectl version --output=yaml

Vérifier la configuration de KUBECTL

  •  kubectl cluster-info
  •  kubectl cluster-info dump

Installer MINIKUBE

    •  choco install minikube
      OU
    • choco install minikube kubernetes-cli

MINIKUBE est un outil qui fait tourner un cluster KUBERNETES à un nœud unique dans une machine virtuelle sur votre machine. C’est une machine virtuelle avec l’essentiel des packages de docker et KUBERNETES.

Mais en production il faut installer un vrai cluster KUBERNETES.

Installation de Virtual Box

MINIKUBE nécessite d’avoir installé ORACLE VM VIRTUAL BOX, elle contient BOOT TO DOCKER c’est-à-dire qui a docker déjà installé en même temps il va installer un cluster KUBERNETES local.

Démarrer la machine virtuelle

MINIKUBE va démarrer automatiquement VIRTUAL BOX : 
minikube start

Sinon il faut la démarrer manuellement. En utilisant POWERSHELL lancer la commande :minikube start --vm-driver=virtualbox

Répéter s’il y a erreur

Si vous avez le message d’erreur suivant :

This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory

Fermeture en raison de HOST_VIRT_UNAVAILABLE

Essayer la commande suivante : minikube start --vm-driver=virtualbox --no-vtx-check

Lorsqu’on démarre MINIKUBE, il va démarrer tous ces composants ainsi qu’un docker engine

Si vous voulez connecter à la machine, utilisez les identifiants suivants :

    • Login : docker
    • Mot de passe : tcuser

Interface graphique de KUBERNETES

L’interface de KUBERNETES nous permet de visualiser les jobs et les PODS lancés, afin de l’afficher il suffit de lancer la commande suivante (si le navigateur ne s’ouvre pas automatiquement, on peut l’ouvrir manuellement avec l’url affiché par la commande) :

    •  minikube dashboard

 

Arrêter la machine virtuelle –> minikube stop
Supprimer la machine virtuelle –>

  • minikube delete
  •  minikube delete --all –purge

Configurer l’environnement local de docker client

Pour connecter docker client à docker engine fournie par MINIKUBE, il faut changer la variable d’environnement DOCKER_HOST pour qu’elle pointe vers l’adresse IP de la machine virtuelle MINIKUBE.

Au début on a configuré DOCKER_HOST : tcp://192.168.43.22 :2375 IP et le port de l’API REST exposé par docker engine.

Mais si on a besoin d’interagir avec MINIKUBE il faut la changer avec l’adresse IP de notre docker engine sur MINIKUBE, avec la commande minikube docker-env, on affiche les variables d’environnement nécessaires à configurer l’environnement local pour utiliser le docker daemon à l’intérieur de MINIKUBE.

On peut changer la variable d’environnement via l’interface ou avec la ligne de commande de GIT

  • Afficher les valeurs des variables : echo $(minikube docker-env)
  • Changer les valeurs : eval $(minikube docker-env)
  • Afficher la valeur de l’adresse IP : echo $DOCKER_HOST

Déploiement d’un conteneur

Une fois que nous avons un cluster KUBERNETES en cours d’exécution, on peut déployer nos conteneurs dessus.

Lorsque nous déployons des applications sur KUBERNETES, nous indiquons au plan de contrôle de démarrer les conteneurs d’applications. Le plan de contrôle planifie l’exécution des conteneurs sur les nœuds du cluster. Les nœuds communiquent avec le plan de contrôle à l’aide de l’API KUBERNETES, que le plan de contrôle expose. Les utilisateurs finaux peuvent également utiliser l’API KUBERNETES directement pour interagir avec le cluster.

Une fois les instances d’application créées, un contrôleur de déploiement KUBERNETES surveille en permanence ces instances. Si le nœud hébergeant une instance tombe en panne ou il est supprimé, le contrôleur de déploiement remplace l’instance par une instance sur un autre nœud du cluster. Cela fournit un mécanisme d’auto-réparation pour traiter les pannes ou la maintenance de la machine.

Nous pouvons créer et gérer un déploiement en utilisant les commandes à l’aide de KUBECTL qui est l’interface de ligne de commande de KUBERNETES. KUBECTL utilise l’API KUBERNETES pour interagir avec le cluster. 

  • Afficher les images disponibles :

Après avoir construit notre image docker (qui s’appelle hellokubernetes), nous pouvons l’afficher avec la commande suivante :

    •  Docker images

Créer une nouvelle ressource KUBERNETES dans le cluster :

      • La commande : 

Kubectl create deployment nom-deployment --image=nom-image : tag 

Exemple : kubectl create deployment hellokubernetes –image=hellokubernetes:1.0

 

      • Afficher les déploiements :
        • Kubectl get deployments
        • kubectl get deployments --all-namespaces

Ou à l’aide du tableau de bord de KUBENETES

      • Afficher les PODS : Kubectl get pods

On peut tester notre application au sein de son POD, en appelant l’API REST à l’aide de la commande CURL : curl http://localhost:8080/home

On voit bien la réponse de notre API : Welcome to Kubernetes.

Par contre si on veut accéder à l’url via le navigateur, ça sera inaccessible. C’est pour cela qu’il faut exposer le POD.

Gestion d’un service

Exposer le POD à l’aide du service NODPORT :

    • Kubectl expose deployment nom-deployment – -type=NodePort – -port=8080
    • Kubectl expose deployment hellokubernetes –type=NodePort –port=8080

Afficher la configuration du service :

  • Kubectl describe service nom-deployment
  • Kubectl describe service hellokubernetes

Afficher l’adresse IP du service :

  • minikube service nom-deployment
  • minikube service hellokubernetes

Notre application sera accessible via url : http://192.168.59.101:31103/home

Supprimer le service : kubectl delete service nom-deployment

Cela ne supprime pas le POD, mais notre conteneur n’est plus accessible de l’extérieur.

Gestion des pods :

Afficher la configuration et l’état du POD :

    • Kubectl describe pod nom-pod
    • Kubectl describe pod spcloudgatewayms-685d66d9fb-5tfdp

Cela nous permet de consulter les événements pour détecter la présence d’erreurs

Ou à l’aide du tableau de bord en cliquant sur le POD souhaité, à partir de la liste des PODS.

Monté en charge de l’application :

    • Kubectl scale --replicas=nombre-instance deployment nom-deployment
    • Kubectl scale --replicas=3 deployment hellokubernetes

Ou en utilisant l’interface de KUBERNETES, en allant dans le menu « REPLICA SETS », puis cliquez sur les 3 points à droite de notre image et choisir le nombre souhaité.

Nous avons créé trois réplicas de notre POD qui vont pouvoir traiter les demandes des utilisateurs selon leurs disponibilités.

Afficher les logs d’un POD :

    • Kubectl logs nom-pod
    • Kubectl logs nom-pod -c my-container

Arrêter un POD :On ne peut ni arrêter ni mettre en pause un POD, par contre on peut arrêter le job.

Tester le service en local (au niveau du POD) avec l’adresse localhost :8080

winpty Kubectl exec -it nom-du-pod bash
Ou
winpty Kubectl exec -it nom-du-pod sh

Pour exécuter l’outil bash sous windows, il faut ajouter winpty

Supprimer un déploiement :

kubectl delete deployment nom

Créer un espace de nom :
Kubectl create namespace name_ns

Kubectl create namespace spring-micro-service

Afficher les espaces de nom : Kubectl get namespaces

Navigation entre les espaces de nom :

kubectl config set-context --current --namespace=spring-micro-service

On remarque que le nouvel espace de nom est vide et si on retourne sur l’espace default, on retrouve bien nos PODS.

Afficher les PODS d’un espace de nom : kubectl get pod -n my-namespace

Afficher les nœuds : Kubectl get nodes

 

Conclusion

KUBERNETES nous facilite la gestion des conteneurs sur plusieurs hôtes. Dans cet article nous avons appris comment déployer les conteneurs à l’aide de lignes de commandes. Par contre pour automatiser cette tâche, notamment assurer la disponibilité et la montée en charge, il faut déclarer à l’aide d’un fichier YAML, comment nous souhaitons que le conteneur soit déployé, et KUBERNETES s’en charge en appliquant la configuration fournie dans le fichier.

Partager
Faire suivre