44 votes

Déploiements continus Kubernetes et migrations de bases de données

Lors du traitement d'un rouleau à jour avec les migrations de base de données, comment ne kubernetes gérer cela?

Pour un exemple - j'ai une application est mise à jour à partir de l'app-v1 app-v2, qui comprend une étape de la migration de modifier une table existante. Donc, ce serait dire qu'il m'oblige à exécuter quelque chose comme db:migrate pour une application rails, une fois déployé.

Lorsqu'un roulement de déploiement se déroule sur 3 jeu de réplicas. Il va déployer à partir d'un troupeau à l'autre. Permettant potentiellement des Gousses qui n'ont pas la nouvelle version de l'application à la pause.

Bien que ce scénario n'est pas quelque chose qui arrive très souvent. C'est tout à fait possible qu'il le ferait. Je voudrais savoir au sujet de la meilleure/les approches recommandées pour ce scénario.

29voto

mbuechmann Points 3490

Une façon de prévenir une ancienne version de rupture est de diviser une migration en plusieurs étapes.

E. g. vous souhaitez renommer une colonne dans la base de données. Renommer la colonne directement de casser les anciennes versions de l'application. Ce peut être divisée en plusieurs étapes:

  • Ajouter un db migration qui insère une nouvelle colonne
  • Modifier l'application de sorte que toutes les écritures aller à l'ancienne et la nouvelle colonne
  • L'exécution d'une tâche que les copies de toutes les valeurs de l'ancienne à la nouvelle colonne
  • Modifier l'application qu'il lit à partir de la nouvelle colonne
  • Ajouter une migration de supprimer l'ancienne colonne

C'est malheureusement tout à fait sans tracas, mais empêche d'avoir un temps d'arrêt avec une page de maintenance en place.

8voto

tselvan Points 401

Kubernetes n'intègre PAS nativement poignée de mises à jour régulières avec db migrations. C'est spécifique à l'application, de sorte que le développeur de l'application auront à gérer. Vous pourriez avoir à faire les mêmes choses que vous feriez dans un non-k8s réglage.

De toute façon, la façon dont je voudrais faire c'est:

  • À l'échelle de votre répliques de 1.
  • Mise à jour de l'image.
  • À l'échelle de votre répliques à 3.

Ce n'est pas infaillible, mais n'implique pas de changement de code. Il y a une petite fenêtre entre la db:migrate étape et le serveur d'écoute où une demande est transmise à l'ancienne réplique (qui prendra fin dès que la nouvelle réplique est prêt). Cette demande peut ou ne peut pas échouer, selon que le bloc de code est directement liée à la modification du schéma.

Si je n'ai pas beaucoup de soins sur les temps d'arrêt, alors, je voudrais juste utiliser le recréer la stratégie.

5voto

Denis V Points 868

J'ai été la résolution de cette question récemment, et ici, c'est ma façon:

  • L'utilisation de déploiement des annotations pour stocker les commandes normalement, vous devez exécuter avant ou après le déploiement.
  • Créer un script qui va être en mesure de lire votre déploiement par nom, puis de créer un emploi pour exécuter les commandes spécifiées dans le déploiement des annotations.
  • Lorsque l'on pousse une image à un panneau de registre ajouter un webhook qui appellera votre script indiqué dans le point précédent.
  • Pour éviter les problèmes avec un incompatible DB structure:
    • Ne pas modifier la db colonnes dans une rétrospective de façon incompatible.
    • Ne pas retirer le solde non utilisé des colonnes immédiatement dans votre migrations. Vous pouvez le faire dans la prochaine version. De cette façon, vous avez un seul le script de migration qui vous sera exécuté avant le déploiement.

P. S. Pour être en mesure de travailler avec Kubernetes dans votre script, vous pouvez faire connaissance avec ces liens: Kubernetes API, Kubernetes API Aperçu, Accéder à des Clusters à l'Aide de la Kubernetes API, les Bibliothèques clientes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X