Table des matières

Kubernetes - Workloads/Controllers

La méthode la plus pratique pour déployer des objets dans Kubernetes comme des pods par exemples est d'utiliser un fichier de manifeste YAML. C'est dans ce fichier que l'on indique toutes les instructions à traiter par Kubernetes.

Une fois le fichier manifeste créé, il suffit à chaque fois de lancer la commande :

kubectl apply -f <mon_fichier.yml>

Les pods

Définition

C'est l'unité de fonctionnement la plus petite sous Kubernetes pour faire fonctionner les conteneurs. Un pod peut être constitué d'un ou plusieurs conteneur qui partagent la même IP.

Mise en pratique

Nous allons ici juste déployer de simples pods. Pour rappel des pods sont des lots de conteneurs.

Déploiement d'un premier pod avec un conteneur

Créer un fichier manifeste yaml :

vim create-pod.yml

Insérer le contenu suivant :

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

Explication :

Nous allons déployer le pod :

kubectl apply -f create-pod.yml

Résultat attendu:

pod/nginx created

Nous allons lister les pods ainsi :

kubectl get pods

Résultat attendu :

NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          6m4s

Pour obtenir des informations sur notre pod lancé :

kubectl describe pods nginx

Pour supprimer le pod :

kubectl delete pods nginx

Déploiement d'un pod avec 2 conteneurs

Ci-dessous l'exemple de fichier yaml pour déployer un pod avec 2 Debian (un avec le port 80 exposé et l'autre avec le port 3306) :

apiVersion: v1
kind: Pod
metadata:
  name: mydebs
spec:
  containers:
  - name: mydeb-web
    image: debian:latest
    command: ["sleep"]
    args: ["infinity"]
    ports:
    - containerPort: 80
  - name: mydeb-bdd
    image: debian:latest
    command: ["sleep"]
    args: ["infinity"]
    ports:
    - containerPort: 3306

Explications complémentaires :

Dans le cas présent, les conteneurs seront exécuté avec la commande sleep infinity. C'est pour maintenir le conteneur en fonctionnement.

Le ReplicaSet

Définition

Un ReplicaSet aide à gérer le trafic en faisant évoluer votre application pour avoir plusieurs instances du même pod. Cela permet de réduire le trafic vers une instance particulière et contribue également à équilibrer la charge du trafic entre chacune de ces instances.

Mise en pratique

Ci-dessous un exemple de manifeste Yaml pour lancer un ReplicaSet composé de 2 Debian avec 2 réplicas :

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mydeploy01
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-bdd-app
  template:
    metadata:
      labels:
        app: web-bdd-app
    spec:
      containers:
      - name: mydeb-web
        image: debian:latest
        command: ["sleep"]
        args: ["infinity"]
        ports:
        - containerPort: 80
      - name: mydeb-bdd
        image: debian:latest
        command: ["sleep"]
        args: ["infinity"]
        ports:
        - containerPort: 3306

Quelques explications :

Au final, nous aurons déployé 2 pods identique contenant chacun 2 conteneurs.

Pour supprimer un ReplicaSet et donc arrêter les Pods et ses conteneurs :

kubectl delete replicaset mydeploy01

Le Deployment

Definition

Le contrôleur Deployment offre la même possibilité de mise à l'échelle qu'un ReplicaSet, mais en complément offre les possibilités suivantes :

Du fait que le Deployment proposent plus le possibilité en terme de gestion, il est plus utilisé. Le ReplicaSet n'est à utiliser que si l'on souhaite un contrôle manuelle de la mise à jour de l'application. ReplicaSet sera utilisé préproduction, alors que Deployment sera utilisé pour la production.

Mise en pratique

Ci-dessous un exemple de manifeste Yaml pour lancer un Deployment composé de 2 Debian avec 2 réplicas :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeploy01
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-bdd-app
  template:
    metadata:
      labels:
        app: web-bdd-app
    spec:
      containers:
      - name: mydeb-web
        image: debian:latest
        command: ["sleep"]
        args: ["infinity"]
        ports:
        - containerPort: 80
      - name: mydeb-bdd
        image: debian:latest
        command: ["sleep"]
        args: ["infinity"]
        ports:
        - containerPort: 3306

On retrouve dans ce fichier YAML exactement les mêmes définitions que pour un ReplicaSet.

Pour supprimer un déploiement et donc arrêter les Pods et ses conteneurs :

kubectl delete deployment mydeploy01

Le StatefulSet

Définition

StatefulSet est le contrôleur qui gère le déploiement et la mise à l'échelle d'un ensemble de pods Stateful. Un pod Stateful dans Kubernetes est un pod qui nécessite un stockage persistant et une identité réseau stable pour conserver son état à tout moment, même pendant les redémarrages ou la replanification du pod. Ces pods sont couramment utilisés pour les applications telles que les bases de données ou les systèmes de fichiers distribués, car ceux-ci nécessitent une identité stable et un stockage persistant pour maintenir la cohérence des données.

Un StatefulSet aide à gérer ces pods en offrant certaines caractéristiques uniques clés:

Le DaemonSet

Les Jobs et les CronJobs