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>
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.
Nous allons ici juste déployer de simples pods. Pour rappel des pods sont des lots de conteneurs.
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
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.
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.
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 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.
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
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: