Jakie jest właściwe podejście, aby moje zadania Amazon ECS aktualizowały obrazy Dockera, gdy te obrazy zostaną zaktualizowane w odpowiednim rejestrze?
docker
docker-registry
amazon-ecs
aknuds1
źródło
źródło
Odpowiedzi:
Jeśli Twoje zadanie działa w ramach usługi, możesz wymusić nowe wdrożenie. Wymusza to ponowną ocenę definicji zadania i pobranie nowego obrazu kontenera.
źródło
Przy każdym uruchomieniu zadania (zarówno przez
StartTask
iRunTask
API lub który jest uruchamiany automatycznie jako część a Service), Agent ECS będzie przeprowadzićdocker pull
zimage
tobą określić w definicji zadań. Jeśli używasz tej samej nazwy obrazu (łącznie ze znacznikiem) za każdym razem, gdy wysyłasz dane do rejestru, uruchomienie nowego obrazu powinno być możliwe, uruchamiając nowe zadanie. Zwróć uwagę, że jeśli Docker nie może z jakiegokolwiek powodu dotrzeć do rejestru (np. Problemy z siecią lub problemy z uwierzytelnianiem), agent ECS spróbuje użyć buforowanego obrazu; jeśli chcesz uniknąć używania obrazów z pamięci podręcznej podczas aktualizowania obrazu, za każdym razem będziesz chciał wypchnąć inny tag do rejestru i odpowiednio zaktualizować definicję zadania przed uruchomieniem nowego zadania.Aktualizacja: to zachowanie można teraz dostroić za pomocą
ECS_IMAGE_PULL_BEHAVIOR
zmiennej środowiskowej ustawionej na agencie ECS. Szczegółowe informacje można znaleźć w dokumentacji . W chwili pisania tego tekstu obsługiwane są następujące ustawienia:źródło
/var/log/ecs
.Rejestracja nowej definicji zadania i aktualizacja usługi do korzystania z nowej definicji zadania to podejście zalecane przez AWS. Najłatwiej to zrobić:
Ten samouczek zawiera więcej szczegółów i opisuje, w jaki sposób powyższe kroki wpisują się w kompleksowy proces rozwoju produktu.
Pełne ujawnienie: ten samouczek zawiera kontenery z Bitnami i ja pracuję dla Bitnami. Jednak wyrażone tutaj myśli są moimi własnymi, a nie opinią Bitnami.
źródło
Można to zrobić na dwa sposoby.
Najpierw użyj AWS CodeDeploy. Sekcje wdrażania w kolorze niebieskim / zielonym można skonfigurować w definicji usługi ECS. Obejmuje to CodeDeployRoleForECS, inną grupę docelową dla przełącznika i odbiornik testowy (opcjonalnie). AWS ECS utworzy aplikację CodeDeploy i grupę wdrożeniową oraz połączy te zasoby CodeDeploy z Twoim klastrem / usługą ECS oraz ELB / TargetGroups. Następnie możesz użyć CodeDeploy, aby zainicjować wdrożenie, w którym musisz wprowadzić specyfikację AppSpec, która określa użycie zadania / kontenera do zaktualizowania usługi. Tutaj określasz nowe zadanie / kontener. Następnie zobaczysz, że nowe instancje są uruchamiane w nowej grupie docelowej, a stara grupa docelowa jest odłączona od ELB, a wkrótce stare instancje zarejestrowane w starej grupie docelowej zostaną zakończone.
Brzmi to bardzo skomplikowanie. Właściwie, ponieważ / jeśli włączyłeś automatyczne skalowanie w swojej usłudze ECS, prostym sposobem na to jest po prostu wymuszenie nowego wdrożenia za pomocą konsoli lub CLI, jak wskazał dżentelmen:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
W ten sposób możesz nadal używać typu wdrażania „aktualizacja krocząca”, a ECS po prostu uruchomi nowe instancje i opróżni stare bez przestojów usługi, jeśli wszystko jest w porządku. Zła strona polega na tym, że tracisz kontrolę nad wdrożeniem i nie możesz przywrócić poprzedniej wersji, jeśli wystąpi błąd, co spowoduje przerwanie bieżącej usługi. Ale to naprawdę prosta droga.
BTW, nie zapomnij ustawić odpowiednich liczb dla Minimalnego zdrowego procentu i Maksymalnego procentu, na przykład 100 i 200.
źródło
Stworzyłem skrypt do wdrażania zaktualizowanych obrazów Dockera w usłudze przejściowej w ECS, tak aby odpowiednia definicja zadania odnosiła się do bieżących wersji obrazów Dockera. Nie wiem na pewno, czy postępuję zgodnie z najlepszymi praktykami, więc opinie będą mile widziane.
Aby skrypt działał, potrzebna jest wolna instancja ECS lub
deploymentConfiguration.minimumHealthyPercent
wartość, dzięki której ECS może ukraść instancję i wdrożyć zaktualizowaną definicję zadania.Mój algorytm wygląda tak:
Mój kod wklejony poniżej:
deploy-ecs
_common.py
źródło
AWS CodePipeline.
Możesz ustawić ECR jako źródło, a ECS jako cel do wdrożenia.
źródło
Wpadłem na ten sam problem. Po spędzeniu wielu godzin zakończyłem te uproszczone kroki w celu automatycznego wdrożenia zaktualizowanego obrazu:
1. zmiany definicji zadania ECS: Dla lepszego zrozumienia załóżmy, że utworzyłeś definicję zadania z poniższymi szczegółami (uwaga: te liczby zmieniłyby się odpowiednio zgodnie z definicją zadania):
Następnie musisz wprowadzić następujące zmiany:
2. Oznacz swój obraz jako < nazwa-twojego-obrazu>: najnowszy . Najnowszy klucz dba o to, aby zostać pociągniętym przez odpowiednie zadanie ECS.
3. Wciśnij obraz do ECR
4. zastosować rozmieszczenie sił
Uwaga: napisałem wszystkie polecenia, zakładając, że region to us-east-1 . Po prostu zastąp go odpowiednim regionem podczas wdrażania.
źródło
Następujące działały dla mnie na wypadek, gdyby tag obrazu dockera był taki sam:
źródło
Używając AWS cli, wypróbowałem usługę aktualizacji aws ecs, jak zasugerowano powyżej. Nie odebrałem najnowszego dockera z ECR. W końcu ponownie uruchomiłem Playbook Ansible, który utworzył klaster ECS. Wersja definicji zadania jest obciążana po uruchomieniu ecs_taskdefinition. Wtedy wszystko jest w porządku. Zostanie pobrany nowy obraz dockera.
Naprawdę nie jestem pewien, czy zmiana wersji zadania wymusza ponowne wdrożenie, czy też element playbook korzystający z usługi ecs_service powoduje ponowne załadowanie zadania.
Jeśli ktoś jest zainteresowany, uzyskam pozwolenie na opublikowanie oczyszczonej wersji mojego poradnika.
źródło
cóż, próbuję też znaleźć zautomatyzowany sposób na zrobienie tego, to znaczy wypchnij zmiany do ECR, a następnie serwis powinien odebrać najnowszy tag. Tak, możesz to zrobić ręcznie, zatrzymując zadanie usługi z klastra. Nowe zadania ściągną zaktualizowane kontenery ECR.
źródło
Poniższe polecenia działały dla mnie
źródło