8.3. Utiliser des stratégies de déploiement
Un site deployment strategy est un moyen de modifier ou de mettre à niveau une application. L'objectif est d'effectuer le changement sans interruption de service, de manière à ce que l'utilisateur remarque à peine les améliorations.
Comme l'utilisateur final accède généralement à l'application par une route gérée par un routeur, la stratégie de déploiement peut se concentrer sur les caractéristiques de l'objet DeploymentConfig
ou sur les caractéristiques de routage. Les stratégies axées sur le déploiement ont un impact sur toutes les routes qui utilisent l'application. Les stratégies qui utilisent les fonctions de routage ciblent des routes individuelles.
De nombreuses stratégies de déploiement sont prises en charge par l'objet DeploymentConfig
, et certaines stratégies supplémentaires sont prises en charge par les fonctionnalités du routeur. Les stratégies de déploiement sont abordées dans cette section.
Choosing a deployment strategy
Lors du choix d'une stratégie de déploiement, il convient de tenir compte des éléments suivants :
- Les connexions de longue durée doivent être gérées avec élégance.
- Les conversions de bases de données peuvent être complexes et doivent être effectuées et reconduites en même temps que l'application.
- Si l'application est un hybride de microservices et de composants traditionnels, un temps d'arrêt peut être nécessaire pour effectuer la transition.
- Vous devez disposer de l'infrastructure nécessaire.
- Si vous disposez d'un environnement de test non isolé, vous pouvez casser à la fois les nouvelles et les anciennes versions.
Une stratégie de déploiement utilise des contrôles de disponibilité pour déterminer si un nouveau module est prêt à être utilisé. Si un contrôle de disponibilité échoue, l'objet DeploymentConfig
tente à nouveau d'exécuter le module jusqu'à ce qu'il s'arrête. Le délai d'attente par défaut est de 10m
, une valeur définie dans TimeoutSeconds
dans dc.spec.strategy.*params
.
8.3.1. Stratégie de roulement
Un déploiement continu remplace lentement les instances de la version précédente d'une application par des instances de la nouvelle version de l'application. La stratégie de déploiement continu est la stratégie de déploiement par défaut utilisée si aucune stratégie n'est spécifiée sur un objet DeploymentConfig
.
Un déploiement continu attend généralement que les nouveaux pods deviennent ready
par le biais d'un contrôle de disponibilité avant de réduire les anciens composants. En cas de problème important, le déploiement continu peut être interrompu.
When to use a rolling deployment:
- Lorsque vous souhaitez éviter toute interruption de service lors de la mise à jour d'une application.
- Lorsque votre application permet l'exécution simultanée d'un ancien et d'un nouveau code.
Un déploiement continu signifie que vous avez à la fois d'anciennes et de nouvelles versions de votre code qui tournent en même temps. Cela nécessite généralement que votre application gère la compatibilité N-1.
Exemple de définition d'une stratégie de roulement
strategy: type: Rolling rollingParams: updatePeriodSeconds: 1 1 intervalSeconds: 1 2 timeoutSeconds: 120 3 maxSurge: "20%" 4 maxUnavailable: "10%" 5 pre: {} 6 post: {}
- 1
- Le temps d'attente entre les mises à jour individuelles des pods. Si elle n'est pas spécifiée, la valeur par défaut est
1
. - 2
- Le temps d'attente entre l'interrogation de l'état de déploiement après la mise à jour. Si elle n'est pas spécifiée, la valeur par défaut est
1
. - 3
- Le temps d'attente d'un événement de mise à l'échelle avant d'abandonner. Facultatif ; la valeur par défaut est
600
. Ici, giving up signifie un retour automatique au déploiement complet précédent. - 4
maxSurge
est facultatif et prend par défaut la valeur25%
s'il n'est pas spécifié. Voir les informations sous la procédure suivante.- 5
maxUnavailable
est facultatif et prend par défaut la valeur25%
s'il n'est pas spécifié. Voir les informations sous la procédure suivante.- 6
pre
etpost
sont tous deux des crochets de cycle de vie.
La stratégie de roulement :
-
Exécute n'importe quel crochet de cycle de vie de
pre
. - Augmente la capacité du nouveau contrôleur de réplication en fonction du nombre de poussées.
- Réduit l'ancien contrôleur de réplication en fonction du nombre maximum d'indisponibilités.
- Répéter cette mise à l'échelle jusqu'à ce que le nouveau contrôleur de réplication ait atteint le nombre de répliques souhaité et que l'ancien contrôleur de réplication ait été mis à l'échelle.
-
Exécute n'importe quel crochet de cycle de vie de
post
.
Lors de la réduction d'échelle, la stratégie de roulement attend que les modules soient prêts pour décider si la poursuite de la mise à l'échelle affecterait la disponibilité. Si les modules mis à l'échelle ne sont jamais prêts, le processus de déploiement finira par s'interrompre et entraînera un échec du déploiement.
Le paramètre maxUnavailable
est le nombre maximum de modules qui peuvent être indisponibles pendant la mise à jour. Le paramètre maxSurge
est le nombre maximum de modules qui peuvent être planifiés en plus du nombre initial de modules. Les deux paramètres peuvent être définis en pourcentage (par exemple, 10%
) ou en valeur absolue (par exemple, 2
). La valeur par défaut est 25%
.
Ces paramètres permettent d'ajuster le déploiement en termes de disponibilité et de rapidité. Ces paramètres permettent d'ajuster le déploiement en fonction de la disponibilité et de la vitesse :
-
maxUnavailable*=0
etmaxSurge*=20%
garantit le maintien de la pleine capacité pendant la mise à jour et l'augmentation rapide de la capacité. -
maxUnavailable*=10%
etmaxSurge*=0
effectue une mise à jour sans utiliser de capacité supplémentaire (mise à jour sur place). -
maxUnavailable*=10%
etmaxSurge*=10%
évolue rapidement avec un risque de perte de capacité.
En règle générale, si vous souhaitez des déploiements rapides, utilisez maxSurge
. Si vous devez tenir compte d'un quota de ressources et que vous pouvez accepter une indisponibilité partielle, utilisez maxUnavailable
.
8.3.1.1. Déploiement de Canary
Tous les déploiements roulants dans OpenShift Container Platform sont canary deployments; une nouvelle version (le canari) est testée avant que toutes les anciennes instances ne soient remplacées. Si la vérification de l'état de préparation ne réussit pas, l'instance canari est supprimée et l'objet DeploymentConfig
est automatiquement reconduit.
Le contrôle de l'état de préparation fait partie du code de l'application et peut être aussi sophistiqué que nécessaire pour garantir que la nouvelle instance est prête à être utilisée. Si vous devez mettre en œuvre des contrôles plus complexes de l'application (tels que l'envoi de charges de travail d'utilisateurs réels à la nouvelle instance), envisagez de mettre en œuvre un déploiement personnalisé ou d'utiliser une stratégie de déploiement "bleu-vert".
8.3.1.2. Création d'un déploiement continu
Les déploiements continus sont le type de déploiement par défaut dans OpenShift Container Platform. Vous pouvez créer un déploiement continu à l'aide de la CLI.
Procédure
Créez une application basée sur les exemples d'images de déploiement trouvées sur Quay.io:
$ oc new-app quay.io/openshifttest/deployment-example:latest
Si le routeur est installé, rendez l'application disponible via une route ou utilisez directement l'IP du service.
$ oc expose svc/deployment-example
-
Accédez à l'application à l'adresse
deployment-example.<project>.<router_domain>
pour vérifier que vous voyez l'imagev1
. Faire évoluer l'objet
DeploymentConfig
jusqu'à trois répliques :$ oc scale dc/deployment-example --replicas=3
Déclencher automatiquement un nouveau déploiement en étiquetant une nouvelle version de l'exemple avec l'étiquette
latest
:$ oc tag deployment-example:v2 deployment-example:latest
-
Dans votre navigateur, actualisez la page jusqu'à ce que vous voyiez l'image
v2
. Lorsque vous utilisez la CLI, la commande suivante montre combien de pods sont sur la version 1 et combien sont sur la version 2. Dans la console web, les pods sont progressivement ajoutés à la version 2 et retirés de la version 1 :
$ oc describe dc deployment-example
Au cours du processus de déploiement, le nouveau contrôleur de réplication est mis à l'échelle de façon incrémentielle. Une fois que les nouveaux pods sont marqués comme ready
(en passant leur contrôle de préparation), le processus de déploiement se poursuit.
Si les pods ne sont pas prêts, le processus est interrompu et le déploiement revient à sa version précédente.
8.3.1.3. Démarrer un déploiement continu à l'aide de la perspective du développeur
Conditions préalables
- Assurez-vous que vous êtes dans la perspective Developer de la console web.
- Assurez-vous que vous avez créé une application à l'aide de la vue Add et que vous la voyez déployée dans la vue Topology.
Procédure
Pour lancer un déploiement continu afin de mettre à niveau une application :
- Dans la vue Topology de la perspective Developer, cliquez sur le nœud d'application pour voir l'onglet Overview dans le panneau latéral. Notez que la stratégie Update Strategy est définie sur la stratégie par défaut Rolling.
Dans le menu déroulant Actions, sélectionnez Start Rollout pour lancer une mise à jour continue. Le déploiement continu démarre la nouvelle version de l'application et met fin à l'ancienne.
Figure 8.1. Mise à jour en continu
8.3.2. Recréer une stratégie
La stratégie recréer a un comportement de déploiement de base et prend en charge les crochets de cycle de vie pour injecter du code dans le processus de déploiement.
Exemple de définition de la stratégie de recréation
strategy: type: Recreate recreateParams: 1 pre: {} 2 mid: {} post: {}
La stratégie de recréation :
-
Exécute n'importe quel crochet de cycle de vie de
pre
. - Ramène le déploiement précédent à zéro.
-
Exécute n'importe quel crochet de cycle de vie de
mid
. - Augmentation de la taille du nouveau déploiement.
-
Exécute n'importe quel crochet de cycle de vie de
post
.
Lors de la mise à l'échelle, si le nombre de répliques du déploiement est supérieur à un, la première réplique du déploiement est validée avant la mise à l'échelle complète du déploiement. Si la validation de la première réplique échoue, le déploiement est considéré comme un échec.
When to use a recreate deployment:
- Lorsque vous devez exécuter des migrations ou d'autres transformations de données avant que votre nouveau code ne démarre.
- Lorsque vous ne souhaitez pas que des versions anciennes et nouvelles du code de votre application soient exécutées en même temps.
- Lorsque vous souhaitez utiliser un volume RWO, qui n'est pas pris en charge pour être partagé entre plusieurs répliques.
Un déploiement par recréation entraîne des temps d'arrêt car, pendant une brève période, aucune instance de votre application ne s'exécute. Cependant, l'ancien et le nouveau code ne s'exécutent pas en même temps.
8.3.3. Démarrer un déploiement recréé à l'aide de la perspective du développeur
Vous pouvez changer la stratégie de déploiement de la mise à jour continue par défaut à une mise à jour de recréation en utilisant la perspective Developer dans la console web.
Conditions préalables
- Assurez-vous que vous êtes dans la perspective Developer de la console web.
- Assurez-vous que vous avez créé une application à l'aide de la vue Add et que vous la voyez déployée dans la vue Topology.
Procédure
Pour passer à une stratégie de mise à jour par recréation et pour mettre à niveau une application :
- Dans le menu déroulant Actions, sélectionnez Edit Deployment Config pour voir les détails de la configuration du déploiement de l'application.
-
Dans l'éditeur YAML, remplacez
spec.strategy.type
parRecreate
et cliquez sur Save. - Dans la vue Topology, sélectionnez le nœud pour afficher l'onglet Overview dans le panneau latéral. Le site Update Strategy est désormais défini sur Recreate.
Utilisez le menu déroulant Actions pour sélectionner Start Rollout afin de lancer une mise à jour à l'aide de la stratégie de recréation. La stratégie recréer met d'abord fin aux pods de l'ancienne version de l'application, puis lance les pods de la nouvelle version.
Figure 8.2. Recréer la mise à jour
8.3.4. Stratégie personnalisée
La stratégie personnalisée vous permet de fournir votre propre comportement de déploiement.
Exemple de définition d'une stratégie personnalisée
strategy: type: Custom customParams: image: organization/strategy command: [ "command", "arg1" ] environment: - name: ENV_1 value: VALUE_1
Dans l'exemple ci-dessus, l'image du conteneur organization/strategy
fournit le comportement de déploiement. Le tableau facultatif command
remplace toute directive CMD
spécifiée dans l'image Dockerfile
. Les variables d'environnement facultatives fournies sont ajoutées à l'environnement d'exécution du processus de stratégie.
En outre, OpenShift Container Platform fournit les variables d'environnement suivantes au processus de déploiement :
Variable d'environnement | Description |
---|---|
| Le nom du nouveau déploiement, un contrôleur de réplication. |
| L'espace de noms du nouveau déploiement. |
Le nombre de répliques du nouveau déploiement sera initialement égal à zéro. La responsabilité de la stratégie est de rendre le nouveau déploiement actif en utilisant la logique qui répond le mieux aux besoins de l'utilisateur.
Vous pouvez également utiliser l'objet customParams
pour injecter la logique de déploiement personnalisée dans les stratégies de déploiement existantes. Fournir une logique de script shell personnalisée et appeler le binaire openshift-deploy
. Les utilisateurs ne doivent pas fournir leur image de conteneur de déploiement personnalisé ; dans ce cas, l'image de déploiement par défaut d'OpenShift Container Platform est utilisée à la place :
strategy: type: Rolling customParams: command: - /bin/sh - -c - | set -e openshift-deploy --until=50% echo Halfway there openshift-deploy echo Complete
Il en résulte le déploiement suivant :
Started deployment #2 --> Scaling up custom-deployment-2 from 0 to 2, scaling down custom-deployment-1 from 2 to 0 (keep 2 pods available, don't exceed 3 pods) Scaling custom-deployment-2 up to 1 --> Reached 50% (currently 50%) Halfway there --> Scaling up custom-deployment-2 from 1 to 2, scaling down custom-deployment-1 from 2 to 0 (keep 2 pods available, don't exceed 3 pods) Scaling custom-deployment-1 down to 1 Scaling custom-deployment-2 up to 2 Scaling custom-deployment-1 down to 0 --> Success Complete
Si le processus de stratégie de déploiement personnalisé nécessite un accès à l'API OpenShift Container Platform ou à l'API Kubernetes, le conteneur qui exécute la stratégie peut utiliser le jeton de compte de service disponible dans le conteneur pour l'authentification.
8.3.5. Crochets du cycle de vie
Les stratégies rolling et recreate prennent en charge lifecycle hooks, ou crochets de déploiement, qui permettent d'injecter un comportement dans le processus de déploiement à des points prédéfinis de la stratégie :
Exemple pre
crochet de cycle de vie
pre:
failurePolicy: Abort
execNewPod: {} 1
- 1
execNewPod
est un crochet de cycle de vie basé sur les pods.
Chaque crochet a un failure policy, qui définit l'action que la stratégie doit entreprendre en cas d'échec du crochet :
| Le processus de déploiement sera considéré comme un échec si le crochet échoue. |
| L'exécution du crochet doit être répétée jusqu'à ce qu'elle réussisse. |
| Tout échec du crochet doit être ignoré et le déploiement doit se poursuivre. |
Les crochets ont un champ spécifique au type qui décrit comment exécuter le crochet. Actuellement, les crochets basés sur les pods sont le seul type de crochet pris en charge, spécifié par le champ execNewPod
.
Crochet de cycle de vie basé sur les pods
Les crochets de cycle de vie basés sur les pods exécutent le code du crochet dans un nouveau pod dérivé du modèle dans un objet DeploymentConfig
.
L'exemple de déploiement simplifié suivant utilise la stratégie de roulement. Les déclencheurs et d'autres détails mineurs sont omis par souci de concision :
kind: DeploymentConfig apiVersion: apps.openshift.io/v1 metadata: name: frontend spec: template: metadata: labels: name: frontend spec: containers: - name: helloworld image: openshift/origin-ruby-sample replicas: 5 selector: name: frontend strategy: type: Rolling rollingParams: pre: failurePolicy: Abort execNewPod: containerName: helloworld 1 command: [ "/usr/bin/command", "arg1", "arg2" ] 2 env: 3 - name: CUSTOM_VAR1 value: custom_value1 volumes: - data 4
- 1
- Le nom
helloworld
fait référence àspec.template.spec.containers[0].name
. - 2
- Ce site
command
remplace tout siteENTRYPOINT
défini par l'imageopenshift/origin-ruby-sample
. - 3
env
est un ensemble optionnel de variables d'environnement pour le conteneur de crochets.- 4
volumes
est un ensemble facultatif de références de volume pour le conteneur de crochets.
Dans cet exemple, le hook pre
sera exécuté dans un nouveau pod utilisant l'image openshift/origin-ruby-sample
du conteneur helloworld
. Le pod de crochet a les propriétés suivantes :
-
La commande de crochet est
/usr/bin/command arg1 arg2
. -
Le conteneur de crochets possède la variable d'environnement
CUSTOM_VAR1=custom_value1
. -
La politique d'échec du crochet est
Abort
, ce qui signifie que le processus de déploiement échoue si le crochet échoue. -
Le module de crochet hérite du volume
data
du module d'objetDeploymentConfig
.
8.3.5.1. Mise en place de crochets de cycle de vie
Vous pouvez définir des crochets de cycle de vie, ou crochets de déploiement, pour un déploiement à l'aide de l'interface utilisateur.
Procédure
Utilisez la commande
oc set deployment-hook
pour définir le type de crochet que vous souhaitez :--pre
,--mid
, ou--post
. Par exemple, pour définir un crochet de pré-déploiement :$ oc set deployment-hook dc/frontend \ --pre -c helloworld -e CUSTOM_VAR1=custom_value1 \ --volumes data --failure-policy=abort -- /usr/bin/command arg1 arg2