Kubernetes

Présentation

Kubernetes (ou K8S) est une plateforme d’automatisation rendu open-source par Google. Elle permet, à travers Docker, de gérer des grappes de containers (appelés ‘pods’), de les rendre flexibles et ‘scalables’.

Contexte

Durant ma fin d’alternance chez Naitways, on a mis en place et testé Kubernetes en interne, puis on a commencé à l’utiliser en production.

L’atout principal de cet outil est une forte réduction des coûts de maintenance et un temps de déploiement réduit. Notamment car le CaaS consomme beaucoup moins de ressources en CPU/RAM qu’une VM classique.

Projet

Le projet consistait à migrer un site web tournant sous apache/mysql/php vers notre infrastructure Kubernetes, en ajoutant d’autres services, comme un nextcloud ou un phpmyadmin.

Kubernetes se basant sur Docker, la première étape était de trouver des images docker capablent de convenir au besoin. Ici nous avons déjà un dépôt local contenant des images personnalisés apache/php ainsi que mysql.

Une fois les images récupérées, en se basant sur les Dockerfile initiaux on a pu générer les fichiers YAML nécessaires pour créer l’infrastructure sous K8S.

La syntaxe d’un fichier YAML pour K8S ressemble à ceci :

K8S YAML

Pour déployer un environnement sous K8S, il suffit simplement de charger un yaml de ce type via la ligne de commande ou l’interface.

Il s’agit uniquement du déploiement de l’image apache/php (que l’on peut voir dans le kind). Il existe d’autres types comme le Service permettant de définir les ports exposés, ou l’Ingress qui joue le rôle de reverse-proxy.

Chaque client est disposé dans un ‘namespace’ qui représente un environnement isolé dans lequel on peut faire communiquer des pods entre eux. Par exemple on va mettre le pod webserver avec le pod database dans le même namespace, afin que le serveur web puisse accéder aux ressources de la base de données.

La ligne ‘replicas: 2’ permet nativemement de faire du load-balancing en dupliquant les containers.
Une autre fonctionnalité de Kubernetes propose de faire du « auto-scaling ». En spécifiant un nombre de répliquas minimum et maximum, Kubernetes va alors déployer des containers en fonction de l’utilisation des ressources CPU, de manière à se mettre à l’échelle automatiquement.

Les labels sont très importants car ils nous permettent d’identifier les containers et de les lier aux autres. Cela permet également à K8S via un reverse proxy (Ingress) de rediriger les flux, en fonction des domaines matchés dans les labels.

La partie volume permet d’avoir un contenu persistent (identique à Docker), le code du site / configuration d’un service ou une base de données par exemple. Alors que le reste des fichiers d’un container est éphémère, il est amené à être supprimé à chaque redémarrage du service.

Lorsque que l’environnement était fonctionnel, on a pu importer les codes sources du site ainsi que la base de données dans les pods respectifs.

De cette manière, le déploiement d’un environnement web se fait en réalisant des fichiers YAML, qui peuvent par la suite être versionnés, et réutilisés en production-ready.

Compétences liées

Kubernetes
Docker
GNU/Linux

Retour aux réalisations