Was ist der richtige Ansatz, um meine Amazon ECS- Aufgaben dazu zu bringen, ihre Docker-Images zu aktualisieren, nachdem diese Images in der entsprechenden Registrierung aktualisiert wurden?
docker
docker-registry
amazon-ecs
aknuds1
quelle
quelle
Antworten:
Wenn Ihre Aufgabe unter einem Dienst ausgeführt wird, können Sie eine neue Bereitstellung erzwingen. Dadurch wird die Aufgabendefinition neu bewertet und das neue Container-Image abgerufen.
quelle
Jedes Mal, wenn Sie eine Aufgabe starten (entweder über die
StartTask
undRunTask
API-Aufrufe oder automatisch als Teil eines Dienstes gestartet), führt der ECS-Agent einedocker pull
derimage
in Ihrer Aufgabendefinition angegebenen Aufgaben aus. Wenn Sie bei jedem Push in Ihre Registrierung denselben Image-Namen (einschließlich Tag) verwenden, sollte das neue Image durch Ausführen einer neuen Aufgabe ausgeführt werden können. Beachten Sie, dass der ECS-Agent versucht, ein zwischengespeichertes Image zu verwenden, wenn Docker aus irgendeinem Grund nicht auf die Registrierung zugreifen kann (z. B. Netzwerkprobleme oder Authentifizierungsprobleme). Wenn Sie vermeiden möchten, dass zwischengespeicherte Bilder beim Aktualisieren Ihres Bildes verwendet werden, sollten Sie jedes Mal ein anderes Tag in Ihre Registrierung verschieben und Ihre Aufgabendefinition entsprechend aktualisieren, bevor Sie die neue Aufgabe ausführen.Update: Dieses Verhalten kann jetzt über die
ECS_IMAGE_PULL_BEHAVIOR
auf dem ECS-Agenten festgelegte Umgebungsvariable optimiert werden. Einzelheiten finden Sie in der Dokumentation . Zum Zeitpunkt des Schreibens werden die folgenden Einstellungen unterstützt:quelle
/var/log/ecs
.Das Registrieren einer neuen Aufgabendefinition und das Aktualisieren des Dienstes zur Verwendung der neuen Aufgabendefinition ist der von AWS empfohlene Ansatz. Der einfachste Weg, dies zu tun, ist:
Dieses Tutorial enthält weitere Details und beschreibt, wie die oben genannten Schritte in einen durchgängigen Produktentwicklungsprozess passen.
Vollständige Offenlegung: Dieses Tutorial enthält Container von Bitnami und ich arbeite für Bitnami. Die hier geäußerten Gedanken sind jedoch meine eigenen und nicht die Meinung von Bitnami.
quelle
Es gibt zwei Möglichkeiten, dies zu tun.
Verwenden Sie zunächst AWS CodeDeploy. Sie können Blau / Grün-Bereitstellungsabschnitte in der ECS-Dienstdefinition konfigurieren. Dies umfasst eine CodeDeployRoleForECS, eine weitere TargetGroup für den Switch und einen Test-Listener (optional). AWS ECS erstellt eine CodeDeploy-Anwendung und eine Bereitstellungsgruppe und verknüpft diese CodeDeploy-Ressourcen für Sie mit Ihrem ECS-Cluster / Service und Ihren ELB / TargetGroups. Anschließend können Sie mit CodeDeploy eine Bereitstellung initiieren, in der Sie eine AppSpec eingeben müssen, die angibt, mit welcher Aufgabe / welchem Container welcher Dienst aktualisiert werden soll. Hier geben Sie Ihre neue Aufgabe / Ihren neuen Container an. Dann werden Sie sehen, dass neue Instanzen in der neuen Zielgruppe hochgefahren werden und die alte Zielgruppe von der ELB getrennt wird und bald die alten Instanzen, die bei der alten Zielgruppe registriert sind, beendet werden.
Das klingt sehr kompliziert. Da / wenn Sie die automatische Skalierung für Ihren ECS-Dienst aktiviert haben, besteht eine einfache Möglichkeit darin, einfach eine neue Bereitstellung mithilfe von Konsole oder CLI zu erzwingen, wie ein Gentleman hier ausgeführt hat:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
Auf diese Weise können Sie weiterhin den Bereitstellungstyp "Rollendes Update" verwenden, und ECS startet einfach neue Instanzen und entleert die alten ohne Ausfallzeiten Ihres Dienstes, wenn alles in Ordnung ist. Die schlechte Seite ist, dass Sie die Kontrolle über die Bereitstellung verlieren und bei einem Fehler nicht zur vorherigen Version zurückkehren können, wodurch der laufende Dienst unterbrochen wird. Aber das ist ein wirklich einfacher Weg.
Übrigens, vergessen Sie nicht, die richtigen Zahlen für Minimum Healthy Percent und Maximum Prozent wie 100 und 200 festzulegen.
quelle
Ich habe ein Skript zum Bereitstellen aktualisierter Docker-Images für einen Staging-Dienst in ECS erstellt, sodass sich die entsprechende Aufgabendefinition auf die aktuellen Versionen der Docker-Images bezieht. Ich weiß nicht genau, ob ich Best Practices befolge, daher wäre Feedback willkommen.
Damit das Skript funktioniert, benötigen Sie entweder eine Ersatz-ECS-Instanz oder einen
deploymentConfiguration.minimumHealthyPercent
Wert, damit ECS eine Instanz stehlen kann, für die die aktualisierte Aufgabendefinition bereitgestellt werden soll.Mein Algorithmus ist wie folgt:
Mein Code wurde unten eingefügt:
deploy-ecs
_common.py
quelle
AWS CodePipeline.
Sie können ECR als Quelle und ECS als Ziel für die Bereitstellung festlegen.
quelle
Folgendes hat bei mir funktioniert, falls das Docker-Image-Tag identisch ist:
quelle
Bin auf dasselbe Problem gestoßen. Nachdem Sie Stunden verbracht haben, haben Sie diese vereinfachten Schritte für die automatisierte Bereitstellung eines aktualisierten Images abgeschlossen:
1. Änderungen der ECS-Aufgabendefinition: Nehmen wir zum besseren Verständnis an, Sie haben eine Aufgabendefinition mit den folgenden Details erstellt (Hinweis: Diese Zahlen würden sich entsprechend Ihrer Aufgabendefinition entsprechend ändern):
Dann müssen Sie folgende Änderungen vornehmen:
2.Taggen Sie Ihr Bild als < Ihr- Bildname >: spätestens . Der neueste Schlüssel sorgt dafür, dass er von der jeweiligen ECS-Aufgabe gezogen wird.
3.Push auf das Bild zu ECR
4. Anwendung erzwingen
Hinweis: Ich habe alle Befehle geschrieben, wobei davon ausgegangen wird, dass die Region us-east-1 ist . Ersetzen Sie es einfach während der Implementierung durch Ihre jeweilige Region.
quelle
Mit AWS cli habe ich aws ecs update-service wie oben vorgeschlagen ausprobiert. Habe nicht den neuesten Docker von ECR abgeholt. Am Ende führe ich mein Ansible-Playbook erneut aus, mit dem der ECS-Cluster erstellt wurde. Die Version der Aufgabendefinition wird beim Ausführen von ecs_taskdefinition gestoßen. Dann ist alles gut. Das neue Docker-Image wird aufgenommen.
Ehrlich gesagt nicht sicher, ob die Änderung der Aufgabenversion die erneute Bereitstellung erzwingt oder ob das Playbook, das den ecs_service verwendet, das Neuladen der Aufgabe bewirkt.
Wenn jemand interessiert ist, erhalte ich die Erlaubnis, eine bereinigte Version meines Spielbuchs zu veröffentlichen.
quelle
Nun, ich versuche auch, einen automatisierten Weg zu finden, das heißt, die Änderungen an ECR voranzutreiben und dann sollte das neueste Tag vom Service abgeholt werden. Richtig, Sie können dies manuell tun, indem Sie die Aufgabe für Ihren Dienst in Ihrem Cluster stoppen. Neue Aufgaben ziehen die aktualisierten ECR-Container.
quelle
Die folgenden Befehle haben bei mir funktioniert
quelle