Mettre à jour le conteneur d'un service dans Amazon ECS

Quel type d'approche est recommandé pour la mise à jour du conteneur d'un service qui fonctionne 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 dans votre service, une tâche à la fois". C'est à peu près tout ce qui est actuellement disponible dans la documentation actuellement (13 avril 2015).

Est-ce que j'ai bien compris que la seule façon de mettre à jour mon conteneur d'application dans Amazon ECS consiste à créer une nouvelle tâche, puis arrêter l'ancienne tâche et commencer la nouvelle tâche?

J'ai utilisé avec succès une balise "dernière" avec Core OS & Fleetctl. Cela a l'avantage de ne pas avoir besoin de changer la balise de l'image Docker pour de nouvelles mises à jour, car le rechargement du service affichera de nouvelles modifications et mettra à jour le conteneur (en utilisant la même label "dernière").

Quel type d'approches vous avez-vous utilisé pour mettre à jour votre service avec une image docker mise à jour dans Amazon ECS?

5 Solutions collect form web for “Mettre à jour le conteneur d'un service dans Amazon ECS”

Je ne sais pas si cela est considéré comme une question abandonnée – trébuché sur ce problème tout en résolvant mon problème et maintenant en ajoutant ma solution maintenant qu'il est résolu.

Pour mettre à jour le service avec un nouveau conteneur, vous devez:

  1. download un nouveau conteneur dans un repository;
  2. triggersr la mise à jour de la définition des tâches
  3. triggersr la mise à jour du conteneur
  4. important: assurez-vous que les règles de service permettent de lancer une nouvelle version de la tâche.

Si la tâche de service n'est pas mise à jour pour la dernière version, vérifiez l'onglet "events" pour les erreurs. Par exemple, peut-être que ECS n'a pas pu démarrer la nouvelle version de votre service: vous n'avez qu'une 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é minime / santé maximale" à "0%, 100%" – de cette façon, ECS choisira de supprimer un ancien conteneur avant de déployer un nouveau. Cela se produit également pendant quelques minutes, ne vous précipitez pas si vous ne voyez pas de commentaires immédiats.

Voici un exemple de script de deployment pour mettre à jour le conteneur dans un cluster et un service préconfiguré. Notez qu'il n'est pas nécessaire de spécifier des versions si vous voulez simplement dire «utiliser le dernier de la famille».

awsRegion=us-east-1 containerName=.. containerRepository=.. taskDefinitionFile=... taskDefinitionName=... serviceName=... echo 'build docker image...' docker build -t $containerName . echo 'upload docker image...' docker tag $containerName:latest $containerRepository:$containerName docker push $containerRepository:$containerName echo 'update task definition...' aws ecs register-task-definition --cli-input-json file://$taskDefinitionFile --region $awsRegion > /dev/null echo 'update our service with that last task..' aws ecs update-service --service $serviceName --task-definition $taskDefinitionName --region $awsRegion > /dev/null 

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

Après avoir téléchargé une nouvelle image Docker, même si elle a la même label que celle utilisée par une tâche, il faut copyr la dernière tâche, puis configurer le service pour utiliser cette nouvelle tâche. En option, on pourrait simplement avoir 2 tâches en double et configurer le Service pour échanger entre elles chaque fois que l'image Docker est mise à jour.

Fondamentalement, afin de créer un nouveau conteneur Docker par ECS, une mise à jour du service doit le triggersr, et la seule façon de faire triggersr le service est de le mettre à jour d'une façon ou d'une autre, comme en le disant d'utiliser un Numéro de tâche différent.

Notez que les conteneurs existants ne peuvent pas s'arrêter automatiquement simplement parce que le Service a été mis à jour – vous devrez peut-être consulter votre list de tâches et les arrêter manuellement.

L'approche qui fonctionne pour moi est semblable à ce qui précède. Après avoir créé votre service et votre tâche, et tout commencez, modifiez le groupe Auto-Scaling et assurez-vous que min , max et souhaité sont définis sur 1 .

Le groupe peut être par défaut; si vous n'êtes pas sûr, vous pouvez y accéder en sélectionnant l'onglet ECS Instances dans votre cluster, puis dans le drop down menu Actions , choisissez Ressources de cluster et click le lien près du bas de la boîte de dialog 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 de tâches du cluster et arrête la tâche . Vous obtiendrez un avertissement, mais si la mise à l'échelle automatique est configurée, le service commencera à fonctionner avec la dernière pression.

Pas besoin de créer de nouvelles versions du service ou de la tâche.

Notez que le service / la tâche se mettent à jour eux-mêmes d'une minute à l'autre dans un timeout d'environ une minute. Si vous attendez désespérément, vous pouvez simplement exécuter New Task manuellement. Le service ne le possédera pas, donc ce n'est pas idéal, mais il en fera encore un nouveau s'il décède.

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 de tag par $ TAG_PURE): https://gist.github.com/Forever-Young/e939d9cc41bc7a105cdcf8cd7ab9d714

 # based on ecs-deploy script TASK_DEFINITION_NAME=$(aws ecs describe-services --services $SERVICE --cluster $CLUSTER | jq -r .services[0].taskDefinition) TASK_DEFINITION=$(aws ecs describe-task-definition --task-def "$TASK_DEFINITION_NAME" | jq '.taskDefinition') NEW_CONTAINER_DEFINITIONS=$(echo "$TASK_DEFINITION" | jq --arg NEW_TAG $TAG_PURE 'def replace_tag: if . | test("[a-zA-Z0-9.]+/[a-zA-Z0-9]+:[a-zA-Z0-9]+") then sub("(?<s>[a-zA-Z0-9.]+/[a-zA-Z0-9]+:)[a-zA-Z0-9]+"; "\(.s)" + $NEW_TAG) else . end ; .containerDefinitions | [.[] | .+{image: .image | replace_tag}]') TASK_DEFINITION=$(echo "$TASK_DEFINITION" | jq ".+{containerDefinitions: $NEW_CONTAINER_DEFINITIONS}") # Default JQ filter for new task definition NEW_DEF_JQ_FILTER="family: .family, volumes: .volumes, containerDefinitions: .containerDefinitions" # Some options in task definition should only be included in new definition if present in # current definition. If found in current definition, append to JQ filter. CONDITIONAL_OPTIONS=(networkMode taskRoleArn) for i in "${CONDITIONAL_OPTIONS[@]}"; do re=".*${i}.*" if [[ "$TASK_DEFINITION" =~ $re ]]; then NEW_DEF_JQ_FILTER="${NEW_DEF_JQ_FILTER}, ${i}: .${i}" fi done # Build new DEF with jq filter NEW_DEF=$(echo $TASK_DEFINITION | jq "{${NEW_DEF_JQ_FILTER}}") NEW_TASKDEF=`aws ecs register-task-definition --cli-input-json "$NEW_DEF" | jq -r .taskDefinition.taskDefinitionArn` echo "New task definition registered, $NEW_TASKDEF" aws ecs update-service --cluster $CLUSTER --service $SERVICE --task-definition "$NEW_TASKDEF" > /dev/null echo "Service updated" 
  • Comment exécuter les mises à jour Xenserver 6.5 Free Edition
  • À la mise à jour de yum? Ou pas?
  • YUM installe un logiciel obsolète
  • Développement Web avec SVN
  • Comment append 50 alias à une zone DNS existante dans Windows Server DNS?
  • Web-based apt-get / aptitude frontend
  • la mise à niveau de Windows 7 à Windows 10 a provoqué une panne de disque
  • CentOS 5.8 mise à jour de CentOS 5.7
  • Réinitialisation rpm fedora
  • Différence entre la mise à jour yum et l'utilisation de rpm pour installer les mises à jour
  • Migration Fedora Core 6
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.