Techso EN

Kubernetes (k8s) ou comment passer la barre en mode automatique

DEV, Technologie

Qu’est-ce que Kubernetes?

Kubernetes (souvent écrit k8s) est un orchestrateur de container open-source créé par Google en 2014 mais est maintenu par la Cloud Native Computer Foundation (CNCF) qui est l’association de Linux et Google. Le mot Kubernetes vient du grec et signifie « Pilote », « Gouverneur » d’où le gouvernail présent au centre de leur logo!

Par orchestrateur de container on entend un système qui va automatiser le déploiement, scaling et gestion de container.

Fun fact : le repository est situé sur Github et est le second repository avec le plus d’auteurs de la plateforme après le kernel Linux.

Mais encore?

Pour illustrer l’intérêt de Kubernetes, prenons un cas concret. Disons que vous gérez un site web, la version actuellement en production est la 1.0.0, et on vous a demandé de déployer la version 1.1.0, normalement vous devriez:

  1. Vous connecter au serveur
  2. Lever la page de maintenance (redirection de l’url sur un autre serveur ou une page statique au sein du même serveur)
  3. Couper l’application actuellement en production
  4. Démarrer la nouvelle version de l’application (après l’avoir téléchargée)
  5. Attendre et tester que la nouvelle version soit prête pour les clients
  6. Abaisser la page de maintenance

Et en cas de problème (par exemple: service qui crash en boucle, exception levée dans un certain cas, etc.), vous devez refaire toute la procédure dans l’autre sens. Cette technique traditionnelle crée beaucoup de downtime et donc du mécontentement client.

Maintenant, voyons comment cela fonctionnerait avec Kubernetes:

  1. La nouvelle version de l’application est containérisée (c’est-à-dire mise dans un container)
  2. On indique à Kubernetes qu’une nouvelle version de l’application est disponible
  3. C’est tout!

Kubernetes va démarrer un pod contenant la nouvelle version de l’application, ce pod ne sera pas accessible au client tant que k8s ne le considèrera pas healthy c’est-à-dire prêt pour le client. À partir de ce moment, le trafic va être progressivement rediriger vers le nouveau pod. Au moindre problème durant cette phase comme, par exemple, l’application qui crash, des requêtes qui ne sont pas adressées, etc. Kubernetes va automatiquement rediriger le trafic vers l’ancienne version de l’application qui est stable et redémarrer le pod pour réessayer la migration. Ainsi on réduit considérablement, voire supprime la période de downtime. (Et oui, pas de page de maintenance, mais aussi…pas de mise en production de soir 😁).

Ok, mais k8s fonctionne sur un serveur non?

On parle ici d’un cluster, qui est un ensemble de machines (virtuelles ou pas) qui sont appelées node. K8s va gérer ces nodes via ce que l’on appelle le control-plane qui va répartir les applications sur les différentes machines afin d’éviter une trop grande charge sur une même node (machine). Bien configuré, un cluster pourra également demander à obtenir de nouvelles nodes si le besoin se fait ressentir.

Les avantages de Kubernetes

Sécurité

Un cluster est divisé en namespaces, tous les objets de k8s (application à déployer, infrastructure virtuelle, secret, …). Un pod (et donc une instance d’une application) par défaut n’est pas accessible à l’extérieur de son namespace et donc n’est pas accessible non plus à l’extérieur du cluster, c’est vous qui avez le contrôle complet sur ce qui est disponible et accessible.

Au sein d’un cluster vous avez contrôle sur le réseau et pouvez créer des network-policy qui vont permettre de dire qui a le droit d’intéragir avec qui, qui a le droit de sortir du cluster pour aller sur internet et comment (quel site, quel port, etc.).

Gestion de la charge

Une seule instance d’une application est souvent insuffisante pour supporter une grande quantité d’utilisateurs, Kubernetes peut gérer le nombre d’instance d’une même application en fonction de son utilisation. Pour être précis, k8s observe l’utilisation du CPU comme indicateur, nous pouvons lui indiquer de démarrer de nouvelles instances lorsque l’utilisation du CPU des instances existantes dépassent x%.

Dans le cas où la charge est composée de requêtes HTTP, k8s offre différents algorithmes de load-balancing pour répartir les requêtes entre toutes les instances.

Gestion des configurations

Bien souvent, une application pour fonctionner a besoin d’un fichier de configuration qui possède souvent des valeurs sensibles nommées secret. K8s offre deux objets les configmaps et les secrets, ces deux types d’objets peuvent être injectés dans un pod pour être accessibles par le code. Ainsi vous pouvez changer de configuration on-the-fly, demander à Kubernetes de redémarrer le pod et vos nouvelles configurations seront appliquées.

Routing

Comme dit plus haut, chaque pod au sein d’un cluster est bloqué dans son namespace et n’est pas accessible de l’extérieur du namespace ou bien du cluster. Pour accéder à un pod il faut, soit l’appeler directement avec son IP interne au cluster (ce qui est complexe vu que l’IP n’est pas statique et que l’on peut avoir plusieurs pods pour une même application) ou passer par un service. Le service possède un IP dynamique ET une adresse interne (gérée par le DNS présent dans le cluster), grâce à cette adresse, nous pouvons rendre accessible toutes les instances d’une application via une seule url. K8s nous permet après de configurer qui a accès à ce service, s’il est disponible depuis l’extérieur du cluster, etc.

Ouvert et hautement configurable

K8s est open-source pour commencer ce qui permet d’aller comprendre les mécaniques internes du système au besoin et assure une grande communauté pour autant vous aider à résoudre un problème que pour corriger un bug. Ensuite, il a été conçu pour être extrêmement versatile et configurable, nous n’avons qu’explorer la surface de Kubernetes, sans parler de l’ensemble des services externes que l’on peut rajouter comme, par exemple, des règles de réseau (istio et calico par exemple) pour autoriser seulement certains types de requêtes.

Pour aller plus loin…

Vous pouvez consulter Katacoda qui offre un cours gratuit pour découvrir K8s.

Petit lexique

Container: unité logicielle qui contient le code, mais également toutes les dépendances nécessaires à son bon fonctionnement. Complètement indépendant de la machine sur lequel il est démarré cela permet d’avoir toujours le même comportement du code quel que soit le matériel sur lequel il fonctionne. C’est également beaucoup plus léger qu’une machine virtuelle (VM) puisqu’il ne simule pas de matériel et n’embarque pas une version complète d’un système d’exploitation.

Downtime: période pendant laquelle une application n’est pas disponible pour les clients. La maintenance ainsi que les crashs du service font partie du downtime. Cette métrique est directement reliée à la disponibilité.

Pod: objet (unité logicielle) de Kubernetes qui administre un ensemble de container représentant une instance d’une application.

Node: machine virtuelle ou physique qui fait partie d’un cluster.

Cluster: ensemble de node administrer par Kubernetes.

Namespace: espace nommé au sein d’un cluster dans lequel on va pouvoir déployer des applications, de l’infrastructure virtuelle, etc.

Load-balancer: objet de Kubernetes qui distribue le traffic entrant sur les pods associés, selon un round-robin. Un load balanceur est un type de service.

Service: objet de Kubernetes qui permet d’avoir une url (http interne par défaut) pour attendre un ensemble de pods.

Site officiel de Kubernetes