liksi logo

Kubernetes 101

Sébastien Brousse - Publié le 20/05/2019
Kubernetes 101

Qu’est-ce que Kubernetes ?

Kubernetes est un système d’orchestration de conteneur open source. Il permet de gérer les applications conteneurisées sur un ensemble de serveurs et prend en charge le déploiement, la supervision et le passage à l’échelle.

Créé à l’origine par Google, il a été donné en mars 2016 à la Cloud Native Computing Foundation (CNCF). Kubernetes, ou «k8s» pour les intimes, apporte une abstraction d’une infrastructure pour gérer des systèmes d’information distribués en permettant aux utilisateurs de déclarer un état souhaité de l’ensemble des éléments constituant ses applications.

Par exemple, un utilisateur peut décrire qu’il souhaite le déploiement de 3 instances de son application SpringBoot et d’un LoadBalancer répartissant la charge entre celles-ci, le tout exposé au travers d’un même nom de domaine sécurisé en SSL. Quelque chose de standard qui nécessite généralement de nombreuses opérations et ressources différentes, mais que Kubernetes se chargera de mettre en place sur simple demande.

Pourquoi utiliser Kubernetes ?

Vous déployez déjà des conteneurs en production à l’aide de scripts ou même d’Infrastructure as Code mais vous souhaitez aller plus loin dans la gestion de la configuration ?
Essayez Kubernetes.

Les évolutions de votre architecture micro services demandent énormément de tests et vous peinez à suivre les délais pour monter des environnements pour tester tout ça de manière satisfaisante sans pour autant plomber votre budget Cloud ?
Essayez Kubernetes.

Les développeurs vous demandent sans cesse la mise en place de nouvelles stacks ou middlewares mais il est hors de question de mettre ça en production sans une analyse poussée de l’impact sur l’existant, du monitoring et de la sécurité ?
Essayez Kubernetes.

Vous avez toujours ce dossier marqué «RGPD» sur votre bureau et vous ne savez pas par quel bout commencer ?
Bon ok, ça, Kubernetes n’y peut rien.

Kubernetes, c’est en quelque sorte ce qu’on pourrait attendre d’une infrastructure virtualisée moderne.

Le système vous propose pêle-mêle :

  • Déploiement sans arrêt de service
  • Tolérance aux pannes
  • Haute disponibilité
  • Montée en charge
  • Auto-résilience
  • Gestion des secrets
  • Répartition de charge
  • Service Discovery
  • Supervision

Et encore pleins d’autres choses.

Concepts clés de Kubernetes

Pod

Un Pod est un groupe d’un ou plusieurs conteneurs qui représentent un ensemble cohérent. Kubernetes planifiera tous les conteneurs d’un Pod sur le même serveur, avec le même espace de nom réseau, afin qu’ils aient tous la même adresse IP et puissent accéder les uns aux autres à l’aide de localhost.

Les conteneurs d’un Pod peuvent non seulement partager les mêmes interfaces réseau, mais également des volumes. C’est l’unité logique la plus fine que l’on manipule dans Kubernetes (i.e. on ne manipule pas directement les conteneurs).

Voici un exemple de définition d’un Pod permettant de lancer un serveur Nginx.

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    name: nginx-pod
spec:
  containers:
    - name: nginx
      image: nginx:1.15
      ports:
        - containerPort: 80

Deployment

Le Deployment est une ressource de plus haut niveau que le Pod et apporte les fonctionnalités de montée en charge ou de mise à jour progressives (Rolling Update) des Pods. Kubernetes s’assurera que le nombre de Pods spécifié est bien en cours d’exécution et, dans le cas d’un rolling update, remplacera les instances des Pods une par une en s’assurant que les nouvelles s’exécutent bien avant de remplacer les prochaines, permettant ainsi des mises à jour d’applications sans interruption de service.

Les Deployments incluent un template pour spécifier les Pods qu’ils vont créer et répliquer. Il n’est donc pas nécessaire de définir les Pods séparément. Kubernetes créera automatiquement le nombre requis de Pods à partir du template du Deployment.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.15
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
            - containerPort: 443

Service

Un Service fournit un équilibrage de charge à un Deployment. Dans un Deployment, chaque Pod se voit attribuer une adresse IP unique et lorsqu’un nouveau Pod est remplacé, le nouveau Pod reçoit généralement une nouvelle adresse IP. En déclarant un Service, nous pouvons fournir un point d’entrée unique pour tous les Pods d’un déploiement. Ce point d’entrée unique (nom d’hôte et adresse IP) reste valable au fur et à mesure que les Pods vont et viennent.

Les Services et les Deployments peuvent être créés dans n’importe quel ordre.

Kubernetes se charge de relier tout seul les ressources entre elles quand elles sont disponibles, ce qui permet de ne pas s’embêter avec des procédures de déploiement ordonnées qui seraient sources d’erreur ou nécessiteraient d’orchestrer à la main tout ça.

Ok, là vous vous dites : “on déclare ce qu’on veut et ça finit par fonctionner tout seul, ça a l’air trop magique pour être vrai, c’est quoi le truc ?”

La réponse à cette question nécessite une petite digression.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

De l’importance d’être maniaque

Service

Vous avez d’irrépressibles pulsions à étiqueter le moindre bocal de votre cuisine ? Vous avez une étiqueteuse que vous avez doté de la douce mention “Etiqueteuse” ?

Kubernetes est fait pour vous !

Kubernetes propose l’utilisation d’un système de labels sous la forme de champs clé/valeur dans les métadonnées de chacune des ressources. Cela permet de catégoriser et trier vos ressources à la manière des balises dans AWS ou GCP. Ce qui pourrait paraître une bonne pratique digne d’un conseil de Marie Kondo, se révèle en fait la base de l’ensemble des fonctionnalités de Kubernetes.

En effet, c’est aussi le mécanisme qui permet à Kubernetes de localiser et d’énumérer les ressources dynamiquement. Les Deployment peuvent ainsi s’assurer du fonctionnement du bon nombre réplicas souhaités et les Services peuvent répartir le trafic entre les Pods quels que soient leur nombre, car ils portent les mêmes labels.

Il existe de nombreuses autres ressources dans Kubernetes pour gérer le stockage, l’isolation, la sécurité ou encore l’auto-résilience du cluster, mais il faut bien en garder pour les prochains articles !

That’s all folks !

Derniers articles