Mettre à jour le conteneur Docker sans interruption

17

Disons que j'ai un conteneur Docker avec un serveur Web (comme Apache 2). Maintenant, je veux mettre à jour le système d'exploitation en dessous. Cette réponse SF indique que la meilleure façon est de reconstruire l'image de base et mon image Apache. Mais le déploiement de l'image signifie un temps d'arrêt car je dois supprimer l'ancien conteneur avant de pouvoir en créer un nouveau, il n'y a donc qu'un seul conteneur qui se lie au port 80/443.

Mais comment puis-je déployer cette mise à jour sans aucun temps d'arrêt? Dois-je utiliser un équilibreur de charge et utiliser la communication entre conteneurs? Et comment mettre à jour l'équilibreur de charge?

das_j
la source

Réponses:

18

Le scénario cible idéal

Oui, vous devez utiliser un équilibreur de charge et mettre à jour une instance à la fois. Je ne sais pas où intervient la communication entre conteneurs.

À titre d'exemple, imaginez que vous disposez d'un équilibreur de charge qui dessert votre site A. Les utilisateurs ne s'y connectent qu'en tant que et le connaissent uniquement en tant que «A». L'équilibreur de charge sait qu'il existe deux ou plusieurs backends (B, C, etc.), et qu'il s'agisse de VM ou de conteneurs, peu importe.

Ensuite, vous souhaitez mettre à niveau les backends, qui dans ce cas sont des instances Apache.

  1. supprimer B des backends éligibles pour l'équilibreur de charge afin qu'il n'accepte plus de trafic.
  2. attendez que les demandes en direct soient traitées et que les connexions existantes soient fermées.
  3. mettre à jour le conteneur ou la machine virtuelle sous-jacente qui dessert B
  4. redémarrez B, attendez qu'il se charge et commencez à travailler
  5. testez B pour vous assurer qu'il répond correctement aux nouvelles demandes
  6. ajoutez B au pool d'arrière-plan de l'équilibreur de charge pour réactiver le trafic

Ensuite, faites le même processus pour C, D, etc.

Notez qu'il y a une demande ouverte de mises à niveau sur place des conteneurs Docker , à partir de novembre 2013, mais il ne semble pas avoir beaucoup de progrès, donc la solution ci-dessus est ce que vous devez faire dans l'intervalle.

Que faire pour un site en ligne existant

Vraisemblablement, vous posez cette question parce que vous exécutez déjà un site en direct dans ce modèle et que vous souhaitez le mettre à niveau sans temps d'arrêt. Donc, nous devons atteindre l'état cible idéal ci-dessus, mais progressivement.

Supposons que:

  • vous avez un nom DNS pointant vers votre conteneur
  • votre conteneur fonctionne sur une adresse IP
  • vos utilisateurs ne connaissent pas l'adresse IP du conteneur et elle n'est codée en dur nulle part

Si ces hypothèses sont fausses, vous devez d'abord les corriger de manière à ce qu'elles soient correctes.

Ensuite, suivez ces étapes:

  1. créer un équilibreur de charge sur une nouvelle adresse IP et le pointer vers le conteneur existant comme seul backend
  2. changer le DNS pour pointer vers l'équilibreur de charge plutôt que l'IP du conteneur directement
  3. ajouter un backend Apache identique avec la même configuration de conteneur VM +
  4. vous avez maintenant un équilibreur de charge avec deux backends B et C, alors suivez les instructions de la section "scénario cible idéal" pour les mettre à niveau une par une

Comment mettre à jour un équilibreur de charge

La manière simple (hébergée)

L'option la plus simple consiste à ne pas exécuter votre propre équilibreur. Par exemple, si vous utilisez une plateforme cloud qui fournit l'équilibrage de charge en tant que service, envisagez de l'utiliser, puis la maintenance et la mise à jour de l'équilibreur de charge ne sont pas un problème.

La voie manuelle

Si vous exécutez votre propre équilibreur de charge, l'ajout d'une autre couche d'indirection (c'est-à-dire DNS) vous aidera. Supposons ce qui suit:

  • que nous avons un nom d'hôte se résolvant à l'IP de notre équilibreur de charge A que nous aimerions mettre à jour
  • notre équilibreur de charge dispose d'un pool backend de P1, P2, etc.

Nous procédons comme suit:

  • créer un nouvel équilibreur de charge B avec la nouvelle version du logiciel
  • ajouter toutes les instances de pool de backend P1, P2, etc. à notre nouvel équilibreur de charge B en tant que backends
  • ajouter l'adresse IP de B à la résolution DNS avec A

    • maintenant, nous utilisons efficacement DNS comme équilibreur de charge
    • si les entrées pour A et B ne sont pas pondérées, elles sont effectivement de 50 à 50
    • regardez maintenant pour voir comment B fonctionne, s'il y a des erreurs, etc.
    • si quelque chose ne va pas avec B, annulez comme suit:

      1. supprimer B de la configuration DNS
      2. attendre que l'entrée B du DNS disparaisse (c'est-à-dire attendre l' expiration du TTL )
      3. baisser B
  • supposons que vous avez fait le test de «rodage» pour B et que tout va bien
  • mettre à jour progressivement la priorité et le poids de B dans DNS
  • supprimer complètement A du DNS
  • attendez que DNS TTL expire; A ne devrait plus recevoir de demandes
  • refuser A

et tu as fini.

Détails, diagrammes et outillage

Voir ces articles et outils qui peuvent vous aider à automatiser le processus, mais l'idée générale est la même:

Le moral

"Tous les problèmes de l'informatique peuvent être résolus par un autre niveau d'indirection, à l'exception bien sûr du problème des trop nombreuses indirections." - David Wheeler

Misha Brukman
la source
Mais lorsque l'équilibreur de charge se trouve également dans un conteneur (lors de l'utilisation de CoreOS), comment mettre à jour ce conteneur?
das_j
@das_j J'ai modifié la réponse pour ajouter également un guide pour la mise à jour d'un équilibreur de charge. Astuce: il s'agit d'un autre niveau d'indirection. :-)
Misha Brukman
1
Dans l'ensemble, cela ressemble à la façon dont on mettrait également à jour les serveurs physiques et les équilibreurs de charge physiques.
Stefan Lasiewski
@StefanLasiewski vous avez absolument raison et j'ai supprimé la note "conteneurs" dans l'une des rubriques. Pour un utilisateur externe, qu'une application ou un équilibreur de charge s'exécute sur du métal nu, un conteneur ou une machine virtuelle, est largement invisible.
Misha Brukman