Quel type d'approche est recommandé pour mettre à jour le conteneur d'un service qui s'exécute dans Amazon ECS?
La documentation AWS indique: "Si vous avez mis à jour l'image Docker de votre application, vous pouvez créer une nouvelle définition de tâche avec cette image et la déployer sur votre service, tâche par tâche." C'est à peu près tout ce qui est actuellement disponible dans la documentation (13 avril 2015).
Ai-je bien compris que le seul moyen de mettre à jour mon conteneur d'applications dans Amazon ECS est de créer une nouvelle tâche, puis d'arrêter l'ancienne tâche et de démarrer la nouvelle tâche?
J'ai utilisé avec succès une balise "dernière" avec Core OS & Fleetctl. Cela présente l'avantage de ne pas avoir besoin de changer la balise de l'image Docker pour les nouvelles mises à jour, car le rechargement du service verra les nouvelles modifications et mettra à jour le conteneur (en utilisant la même balise "latest").
Quel type d'approches que vous avez utilisé pour mettre à jour votre service avec une image de menu fixe mise à jour dans Amazon ECS?
la source
Réponses:
Je ne sais pas si cela est considéré comme une question abandonnée - je suis tombé sur cette question tout en résolvant mon problème et en ajoutant maintenant ma solution maintenant qu'elle est résolue.
Pour mettre à jour le service avec un nouveau conteneur, vous devez:
Si la tâche de service n'est pas mise à jour à la dernière version, vérifiez les erreurs dans l'onglet "événements". Par exemple, peut-être qu'ECS n'a pas pu démarrer une nouvelle version de votre service: vous n'avez qu'une seule instance ec2 dans le cluster et le port d'application est déjà utilisé sur l'hôte. Dans ce cas, définissez les limites "santé minimale / santé maximale" sur "0%, 100%". De cette façon, ECS choisira de supprimer l'ancien conteneur avant de déployer le nouveau. Cela se produit également en quelques minutes - ne vous précipitez pas si vous ne voyez pas de retour immédiat.
Vous trouverez ci-dessous un exemple de script de déploiement pour mettre à jour un conteneur dans un cluster et un service préconfigurés. Notez qu'il n'est pas nécessaire de spécifier les versions si vous voulez simplement dire "utiliser les dernières de la famille".
la source
set "min health/max health" limits to "0%, 100%"
sont dorés. Merci beaucoup!min
sur0%
, lorsque vous modifiez la définition de la tâche déployée par votre service, vous lui donnez essentiellement le droit de supprimer toutes les tâches simultanément pour ce déploiement.Pour mettre à jour votre application, mettez à jour la définition de la tâche, puis mettez à jour le service. Voir http://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html
la source
J'utilise une partie du script ecs-deploy avec mes améliorations (il prend des images de chaque description de conteneur et remplace sa partie balise par $ TAG_PURE): https://gist.github.com/Forever-Young/e939d9cc41bc7a105cdcf8cd7f9ab9d714
la source
Après avoir chargé une nouvelle image Docker, même si elle a la même balise que celle utilisée par une tâche, il faut copier la dernière tâche, puis configurer le service pour utiliser cette nouvelle tâche. Facultativement, vous pouvez simplement avoir 2 tâches en double et configurer le service pour les permuter entre elles à chaque mise à jour de l'image Docker.
Fondamentalement, pour que ECS crée un nouveau conteneur Docker, une mise à jour du service doit le déclencher, et le seul moyen de le déclencher est de le mettre à jour d’une manière ou d’une autre, comme en lui disant d’utiliser un numéro de tâche différent.
Notez que les conteneurs en cours d’exécution ne peuvent pas s’arrêter automatiquement simplement parce que le service a été mis à jour. Vous devrez peut-être consulter votre liste de tâches et les arrêter manuellement.
la source
tag
L'approche qui fonctionne pour moi est semblable à la précédente. Après avoir créé votre service et des tâches, et commencer tout va, modifier le groupe Auto-échelle et assurer min , max et souhaité sont fixés à 1 .
Le groupe peut être celui par défaut; si vous n'êtes pas sûr, vous pouvez y accéder en sélectionnant l' onglet Instances ECS de votre cluster, puis dans le menu déroulant Actions , choisissez Ressources du cluster et cliquez sur le lien situé au bas de la boîte de dialogue qui s'ouvre.
Lorsque tout est en place, chaque fois que vous souhaitez déployer une image de conteneur mise à jour, accédez à la zone Tâche du cluster et arrêtez la tâche . Vous recevrez un avertissement, mais à condition que la mise à l'échelle automatique soit configurée, le service le relancera avec le dernier envoi.
Pas besoin de créer de nouvelles versions du service ou de la tâche.
Notez que le service / la tâche se met à jour de façon instantanée, instantanément ou à une minute près. Si vous attendez désespérément, vous pouvez simplement exécuter manuellement une nouvelle tâche. Le service ne le possédera pas, il n'est donc pas idéal, mais il en créera un nouveau s'il meurt.
la source
Je sais que c'est un vieux fil, mais la solution est beaucoup plus facile que la plupart des réponses ne le prétendent.
Comment mettre à jour le conteneur en cours d'exécution en deux étapes:
Ce qui suit suppose que vous avez un service exécutant une tâche qui référence un conteneur étiqueté
latest
(ou toute autre balise statique qui ne change pas entre les mises à jour du conteneur).Si l'objectif est que nous ayons une nouvelle construction dans la nature, nous n'avons pas vraiment besoin de compter sur notre service (et je dirais même que nous ne devrions pas compter sur lui). Si vous supprimez votre tâche, le service reconnaîtra que les
Desired Count
tâches ne sont pas en cours d'exécution et en crée simplement une nouvelle. Cela déclenchera une nouvelle extraction de votre conteneur, basée sur la même balise.Les services ECS constituent un filet de sécurité HA et ne remplacent pas votre pipeline CD / CI.
Bonus: si l'objectif est de faire reconnaître à un service qu'un nouveau conteneur a été poussé (indépendamment des balises), nous devons en examiner les implications. Voulons-nous vraiment un service de base contrôlant notre pipeline de déploiement pour nous? Probablement pas. Idéalement, vous allez pousser vos conteneurs avec différentes balises (en fonction des versions des versions ou de quelque chose). Dans ce cas, l'obstacle au déploiement réside dans le fait que le service doit être averti de quelque chose de nouveau - encore une fois, c'est un filet de sécurité pour le service et rien de plus.
Comment déployer de nouvelles balises en trois étapes:
container:tag
dans le référentieltag
minimum healthy
défini sur0%
comme le suggèrent d'autres réponses, vous accordez à AWS tous les droits nécessaires pour supprimer l'ensemble de votre service afin de déployer la nouvelle définition de tâche. Si vous préférez un déploiement progressif / progressif, définissez votre minimum à quelque chose>0%
.minimum healthy
à100%
et votremaximum healthy
à quelque chose>100%
pour permettre à votre service pour déployer les nouvelles tâches avant de tuer les anciens (réduisant au minimum l'impact sur les utilisateurs).À partir de ce moment, votre service reconnaîtra automatiquement que vous avez spécifié une nouvelle tâche et déploiera cette tâche en fonction des seuils
minimum
/maximum
santé que vous avez configurés.la source