Rechercher

8.3. Utiliser des stratégies de déploiement

download PDF

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 valeur 25% 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 valeur 25% s'il n'est pas spécifié. Voir les informations sous la procédure suivante.
6
pre et post sont tous deux des crochets de cycle de vie.

La stratégie de roulement :

  1. Exécute n'importe quel crochet de cycle de vie de pre.
  2. Augmente la capacité du nouveau contrôleur de réplication en fonction du nombre de poussées.
  3. Réduit l'ancien contrôleur de réplication en fonction du nombre maximum d'indisponibilités.
  4. 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.
  5. Exécute n'importe quel crochet de cycle de vie de post.
Important

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 et maxSurge*=20% garantit le maintien de la pleine capacité pendant la mise à jour et l'augmentation rapide de la capacité.
  • maxUnavailable*=10% et maxSurge*=0 effectue une mise à jour sans utiliser de capacité supplémentaire (mise à jour sur place).
  • maxUnavailable*=10% et maxSurge*=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

  1. 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
  2. Si le routeur est installé, rendez l'application disponible via une route ou utilisez directement l'IP du service.

    $ oc expose svc/deployment-example
  3. Accédez à l'application à l'adresse deployment-example.<project>.<router_domain> pour vérifier que vous voyez l'image v1.
  4. Faire évoluer l'objet DeploymentConfig jusqu'à trois répliques :

    $ oc scale dc/deployment-example --replicas=3
  5. 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
  6. Dans votre navigateur, actualisez la page jusqu'à ce que vous voyiez l'image v2.
  7. 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 :

  1. 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.
  2. 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

    odc rolling update

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: {}

1
recreateParams sont facultatifs.
2
pre, mid et post sont des crochets de cycle de vie.

La stratégie de recréation :

  1. Exécute n'importe quel crochet de cycle de vie de pre.
  2. Ramène le déploiement précédent à zéro.
  3. Exécute n'importe quel crochet de cycle de vie de mid.
  4. Augmentation de la taille du nouveau déploiement.
  5. Exécute n'importe quel crochet de cycle de vie de post.
Important

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 :

  1. 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.
  2. Dans l'éditeur YAML, remplacez spec.strategy.type par Recreate et cliquez sur Save.
  3. 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.
  4. 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

    odc recreate update

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'environnementDescription

OPENSHIFT_DEPLOYMENT_NAME

Le nom du nouveau déploiement, un contrôleur de réplication.

OPENSHIFT_DEPLOYMENT_NAMESPACE

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 :

Abort

Le processus de déploiement sera considéré comme un échec si le crochet échoue.

Retry

L'exécution du crochet doit être répétée jusqu'à ce qu'elle réussisse.

Ignore

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 site ENTRYPOINT défini par l'image openshift/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'objet DeploymentConfig.

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

  1. 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
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.