Deployment
Rôle
Son rôle est de maintenir opérationnel un nombre de pods (replica) en respectant une spécification. Il permet de mettre à jour les images et la scalabilité du nombre d’instances du pod. Le deployment s’occupe de la création des ReplicaSet, de la mise à jour et du rollback et délègue l’auto-réparation et le scaling au ReplicaSet.
Structure
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
securityContext: {}
Différences par rapport à un pod
Contrairement à un pod créé sans déploiement, si on demande à kubernetes de tuer un pod, comme le deploiement veut respecter sa specification, il va automatiquement demander une recréation d’un nouveau pod.
Le déploiement va créer un replicaset qui portera les pods. À chaque changement de specification, le déploiement créera un nouveau replicaset.
Nommage
Le nom des pods et des replicaset n’est pas choisi au hasard et on peut facilement relier les uns aux autres grâce à leur nom.
Si Deployment porte le nom mondeployment
alors ses Replicaset portent le nom mondeployment-HASHREPLICASET
et les pods d’un replicaset portent le nom mondeployment-HASHREPLICASET-HASHPOD
Stratégie de mise à jour
On peut définir de manière fine la façon dont un déploiement va se mettre à jour.
Par défaut, on sera en RollingUpdate
type recreate
Tous les pods seront tués avant de recréer de nouveau pod.
type RollingUpdate
Le RollingUpdate s’appuie sur deux paramètres maxUnavailable
et maxSurge
.
maxUnavailable
: exprimée en valeur absolue ou en pourcentage, donne le nombre de pods qui pourront être indisponibles,
par default la valeur est de 25%.
Par exemple, lorsque cette valeur est fixée à 30 %,
l’ancien ReplicaSet peut être réduit à 70 % des pods souhaités dès le début de la mise à jour.
Une fois que les nouveaux pods sont prêts, l’ancien ReplicaSet peut être réduit davantage, puis le nouveau ReplicaSet peut être mis à l’échelle, de sorte que le nombre total de pods disponibles à tout moment pendant la mise à jour représente au moins 70 % des pods souhaités.
maxSurge
: exprimée en valeur absolue ou en pourcentage, donne le nombre de pods qui pourront être créés en plus du nombre souhaité.
par default la valeur est de 25%.
Par exemple, lorsque cette valeur est définie sur 30%, le nouveau ReplicaSet peut être mis à l’échelle immédiatement au démarrage de la mise à jour continue, de sorte que le nombre total d’anciens et de nouveaux pods ne dépasse pas 130% des pods souhaités.
Une fois que les anciens pods ont été détruits, le nouveau ReplicaSet peut être augmenté davantage, garantissant que le nombre total de pods en cours d’exécution à tout moment pendant la mise à jour est au maximum de 130% des pods souhaités.
Commandes utiles
Pour créer rapidement un déploiement via une commande :
kubectl create deploy nginx --image nginx
deployment.apps/nginx created
Pour updater rapidement une image dans un déploiement :
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 --record
Pour changer le nombre de pod rapidement dans un déploiement :
kubectl scale deployment/nginx-deployment --replicas=10
Pour voir l’évolution d’un déploiement :
kubectl describe deployment/nginx-deployment
kubectl rollout history deployment/nginx-deployment
Pour revenir en arrière d’un déploiement :
kubectl rollout undo deployment/nginx-deployment
Pour revenir en arrière d’un déploiement vers une révision particulière :
kubectl rollout undo deployment/nginx-deployment --to-revision=2
Exercices
- Créer un déploiement à partir de l’image
nginx
avec un replica de 1 - Upgrader via
kubectl edit ...
le nombre de replica à 2 - Changer l’image pour l’image
nginx:stable-alpine
sans passer paredit
mais parset image
- Consulter la description du déploiement
- Consulter l’historique des révisions et faire un rollout vers la première revision.
(noter l’influence de l’option
--record
en faisant les actions avec ou sans cette option)