Quelle est la bonne approche pour que mes tâches Amazon ECS mettent à jour leurs images Docker, une fois que lesdites images ont été mises à jour dans le registre correspondant?
docker
docker-registry
amazon-ecs
aknuds1
la source
la source
Réponses:
Si votre tâche s'exécute sous un service, vous pouvez forcer un nouveau déploiement. Cela force la réévaluation de la définition de tâche et l'extraction de la nouvelle image de conteneur.
la source
Chaque fois que vous démarrez une tâche (via les appels d'API
StartTask
etRunTask
ou qui est lancée automatiquement dans le cadre d'un service), l'agent ECS exécutera l'unedocker pull
des opérations queimage
vous spécifiez dans votre définition de tâche. Si vous utilisez le même nom d'image (y compris la balise) chaque fois que vous poussez dans votre registre, vous devriez pouvoir exécuter la nouvelle image en exécutant une nouvelle tâche. Notez que si Docker ne peut pas accéder au registre pour une raison quelconque (par exemple, des problèmes de réseau ou des problèmes d'authentification), l'agent ECS tentera d'utiliser une image mise en cache; si vous souhaitez éviter que les images mises en cache soient utilisées lorsque vous mettez à jour votre image, vous voudrez pousser une balise différente dans votre registre à chaque fois et mettre à jour votre définition de tâche en conséquence avant d'exécuter la nouvelle tâche.Mise à jour: ce comportement peut désormais être réglé via la
ECS_IMAGE_PULL_BEHAVIOR
variable d'environnement définie sur l'agent ECS. Consultez la documentation pour plus de détails. Au moment de la rédaction de cet article, les paramètres suivants sont pris en charge:la source
/var/log/ecs
.L'enregistrement d'une nouvelle définition de tâche et la mise à jour du service pour utiliser la nouvelle définition de tâche est l'approche recommandée par AWS. La façon la plus simple de procéder est de:
Ce didacticiel est plus détaillé et décrit comment les étapes ci-dessus s'intègrent dans un processus de développement de produit de bout en bout.
Divulgation complète: Ce tutoriel présente des conteneurs de Bitnami et je travaille pour Bitnami. Cependant, les pensées exprimées ici sont les miennes et non l'opinion de Bitnami.
la source
Il y a deux façons de faire ça.
Tout d'abord, utilisez AWS CodeDeploy. Vous pouvez configurer des sections de déploiement bleu / vert dans la définition de service ECS. Cela inclut un CodeDeployRoleForECS, un autre TargetGroup pour le commutateur et un écouteur de test (facultatif). AWS ECS créera l'application CodeDeploy et le groupe de déploiement et liera ces ressources CodeDeploy avec votre cluster / service ECS et vos ELB / TargetGroups pour vous. Ensuite, vous pouvez utiliser CodeDeploy pour lancer un déploiement, dans lequel vous devez entrer un AppSpec qui spécifie l'utilisation de quelle tâche / conteneur pour mettre à jour quel service. C'est ici que vous spécifiez votre nouvelle tâche / conteneur. Ensuite, vous verrez que de nouvelles instances sont lancées dans le nouveau TargetGroup et que l'ancien TargetGroup est déconnecté de l'ELB, et bientôt les anciennes instances enregistrées dans l'ancien TargetGroup seront arrêtées.
Cela semble très compliqué. En fait, depuis / si vous avez activé la mise à l'échelle automatique sur votre service ECS, un moyen simple de le faire est de simplement forcer un nouveau déploiement à l'aide de la console ou du cli, comme un gentleman l'a souligné ici:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
De cette façon, vous pouvez toujours utiliser le type de déploiement «mise à jour progressive», et ECS lancera simplement de nouvelles instances et vidangera les anciennes sans temps d'arrêt de votre service si tout va bien. Le mauvais côté est que vous perdez un contrôle précis sur le déploiement et que vous ne pouvez pas revenir à la version précédente en cas d'erreur, ce qui interrompra le service en cours. Mais c'est une manière vraiment simple de procéder.
BTW, n'oubliez pas de définir des nombres appropriés pour le pourcentage sain minimum et le pourcentage maximum, comme 100 et 200.
la source
J'ai créé un script pour déployer des images Docker mises à jour sur un service de préparation sur ECS, de sorte que la définition de tâche correspondante se réfère aux versions actuelles des images Docker. Je ne sais pas avec certitude si je suis les meilleures pratiques, donc vos commentaires seraient les bienvenus.
Pour que le script fonctionne, vous avez besoin d'une instance ECS de rechange ou d'une
deploymentConfiguration.minimumHealthyPercent
valeur afin qu'ECS puisse voler une instance sur laquelle déployer la définition de tâche mise à jour.Mon algorithme est comme ceci:
Mon code collé ci-dessous:
deploy-ecs
_common.py
la source
AWS CodePipeline.
Vous pouvez définir ECR comme source et ECS comme cible de déploiement.
la source
Ran dans le même problème. Après avoir passé des heures, nous avons conclu ces étapes simplifiées pour le déploiement automatisé de l'image mise à jour:
Changements de la définition de tâche ECS: pour une meilleure compréhension, supposons que vous ayez créé une définition de tâche avec les détails ci-dessous (note: ces nombres changeraient en conséquence selon votre définition de tâche):
Ensuite, vous devez apporter les modifications suivantes:
2.Tag votre image < votre image nom>: le dernier . La dernière clé s'occupe d'être tirée par la tâche ECS respective.
3.Pousser l'image vers ECR
4. appliquer le déploiement de force
Remarque: j'ai écrit toutes les commandes en supposant que la région est us-east-1 . Remplacez-le simplement par votre région respective lors de la mise en œuvre.
la source
La suite a fonctionné pour moi au cas où la balise d'image du docker serait la même:
la source
En utilisant AWS cli, j'ai essayé aws ecs update-service comme suggéré ci-dessus. N'a pas récupéré le dernier docker d'ECR. En fin de compte, j'ai réexécuté mon playbook Ansible qui a créé le cluster ECS. La version de la définition de tâche est modifiée lors de l'exécution de ecs_taskdefinition. Alors tout va bien. La nouvelle image du docker est récupérée.
Je ne sais vraiment pas si le changement de version de la tâche force le redéploiement ou si le playbook utilisant ecs_service provoque le rechargement de la tâche.
Si quelqu'un est intéressé, j'obtiendrai l'autorisation de publier une version nettoyée de mon playbook.
la source
Eh bien, j'essaie également de trouver un moyen automatisé de le faire, c'est-à-dire pousser les modifications apportées à ECR, puis la dernière balise devrait être récupérée par le service. Vous pouvez le faire manuellement en arrêtant la tâche de votre service à partir de votre cluster. Les nouvelles tâches extrairont les conteneurs ECR mis à jour.
la source
Les commandes suivantes ont fonctionné pour moi
la source