Jakie podejście jest zalecane do aktualizacji kontenera usługi działającej w Amazon ECS?
Dokumentacja AWS mówi: „Jeśli zaktualizowałeś obraz Docker swojej aplikacji, możesz utworzyć nową definicję zadania z tym obrazem i wdrożyć go do usługi, jedno zadanie na raz”. To prawie wszystko, co jest obecnie dostępne w dokumentacji (13 kwietnia 2015 r.).
Czy zrozumiałem poprawnie, że jedynym sposobem na aktualizację mojego kontenera aplikacji w Amazon ECS jest utworzenie nowego zadania, a następnie zatrzymanie starego zadania i rozpoczęcie nowego?
Z powodzeniem używam tagu „najnowsze” w Core OS i Fleetctl. Ma to tę zaletę, że nie trzeba zmieniać znacznika obrazu Docker dla nowych aktualizacji, ponieważ przeładowanie usługi zobaczy nowe zmiany i zaktualizuje kontener (przy użyciu tego samego znacznika „najnowsze”).
Jakie metody zastosowałeś do zaktualizowania usługi za pomocą zaktualizowanego obrazu dokera w Amazon ECS?
źródło
Odpowiedzi:
Nie jestem pewien, czy to pytanie jest uważane za porzucone - natknąłem się na to podczas rozwiązywania problemu i dodawania rozwiązania, gdy zostało już rozwiązane.
Aby zaktualizować usługę o nowy kontener, musisz:
Jeśli zadanie serwisowe nie jest zaktualizowane do najnowszej wersji, sprawdź zakładkę „zdarzenia” pod kątem błędów. Na przykład może ECS nie mógł uruchomić nowej wersji usługi: masz tylko jedną instancję ec2 w klastrze, a port aplikacji jest już używany na hoście. W takim przypadku ustaw „minimalne zdrowie / maksymalne zdrowie” na „0%, 100%” - w ten sposób ECS wybierze zabicie starego kontenera przed wdrożeniem nowego. Dzieje się tak również w ciągu kilku minut - nie spiesz się, jeśli nie widzisz natychmiastowej informacji zwrotnej.
Poniżej znajduje się przykładowy skrypt wdrażania do aktualizacji kontenera we wstępnie skonfigurowanym klastrze i usłudze. Uwaga: nie ma potrzeby określania wersji, jeśli chodzi o „użyj najnowszej z rodziny”.
źródło
set "min health/max health" limits to "0%, 100%"
są złote. Dziękuję bardzo!min
, aby0%
po zmianie definicji zadanie wykorzystuje swoich usług, jesteś w istocie dając mu pełną władzę obalić wszystkie zadania w tym samym czasie dla tej instalacji.Aby zaktualizować aplikację, zaktualizuj definicję zadania, a następnie zaktualizuj usługę. Zobacz http://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html
źródło
Używam części ze skryptu wdrażania ecs z moimi ulepszeniami (pobiera obrazy z każdego opisu kontenera i zastępuje jego część tagową $ TAG_PURE): https://gist.github.com/Forever-Young/e939d9cc41bc7a105cdcf8cd7ab9d714
źródło
Po przesłaniu nowego obrazu Docker, nawet jeśli ma on taki sam tag, jak używany przez Zadanie, należy skopiować najnowsze zadanie, a następnie skonfigurować Usługę do korzystania z tego nowego Zadania. Opcjonalnie można po prostu mieć 2 zduplikowane zadania i skonfigurować Usługę tak, aby przełączała się między nimi przy każdej aktualizacji obrazu Docker.
Zasadniczo, aby spowodować utworzenie nowego kontenera Dockera przez ECS, aktualizacja Usługi musi go uruchomić, a jedynym sposobem na wywołanie Usługi jest jego aktualizacja w pewien sposób - na przykład poprzez nakazanie mu użycia inny numer zadania.
Pamiętaj, że istniejące działające kontenery mogą nie zostać automatycznie zatrzymane tylko dlatego, że usługa została zaktualizowana - może być konieczne zajrzenie do listy zadań i zatrzymanie ich ręcznie.
źródło
tag
Podejście, które działa dla mnie jest podobne do powyższego. Po utworzeniu usługi i zadania oraz rozpoczęciu wszystkiego edytuj grupę automatycznego skalowania i upewnij się, że min , maks i żądane są ustawione na 1 .
Grupa może być domyślna; jeśli nie masz pewności, możesz do niego przejść, wybierając kartę Instancje ECS w klastrze, a następnie z rozwijanego menu Działania wybierz Zasoby klastra i kliknij łącze w dolnej części okna dialogowego, które zostanie otwarte.
Gdy wszystko będzie gotowe , za każdym razem, gdy chcesz wdrożyć zaktualizowany obraz kontenera, przejdź do obszaru Zadanie klastra i Zatrzymaj zadanie . Dostaniesz ostrzeżenie, ale pod warunkiem skonfigurowania automatycznego skalowania usługa zacznie działać ponownie z najnowszym push.
Nie ma potrzeby tworzenia nowych wersji usługi ani zadania.
Pamiętaj, że usługa / zadanie aktualizują się w dowolnym miejscu, od razu do około minuty. Jeśli desperacko czekasz, możesz po prostu ręcznie uruchomić nowe zadanie. Usługa nie będzie jej właścicielem, więc nie jest idealna, ale w razie śmierci nadal będzie działać na nową.
źródło
Wiem, że to stary wątek, ale rozwiązanie jest o wiele łatwiejsze niż większość odpowiedzi tutaj.
Jak zaktualizować działający kontener w dwóch krokach:
Poniżej założono, że masz usługę uruchamiającą zadanie, które odwołuje się do oznaczonego kontenera
latest
(lub dowolnego innego statycznego tagu, który nie zmienia się między aktualizacjami kontenera).Jeśli naszym celem jest udostępnienie nowej wersji w środowisku naturalnym, tak naprawdę nie musimy polegać na naszych usługach (i twierdzę, że nie powinniśmy na tym polegać). Jeśli zabijesz swoje zadanie, usługa rozpozna, że nie ma
Desired Count
uruchomionych zadań, i po prostu uruchom nowe. Spowoduje to ponowne pobranie kontenera w oparciu o ten sam tag.Usługi ECS są siecią bezpieczeństwa HA, a nie zamiennikiem twojego rurociągu CD / CI.
Premia: jeśli celem jest, aby usługa rozpoznała, że nowy kontener został wypchnięty (niezależnie od tagów), musimy rozważyć konsekwencje tego. Czy naprawdę chcemy dla nas podstawowej usługi kontrolującej nasz proces wdrażania? Prawdopodobnie nie. Idealnie, będziesz przepychać swoje kontenery różnymi tagami (w zależności od wersji lub czegoś podobnego). W tym przypadku barierą we wdrożeniu jest to, że usługa musi zostać powiadomiona o czymś nowym - znowu jest to sieć bezpieczeństwa dla usługi i nic więcej.
Jak wdrożyć nowe tagi w trzech krokach:
container:tag
do repozytoriumtag
minimum healthy
ustawiłeś0%
tak, jak sugerują inne odpowiedzi, dajesz AWS pełne uprawnienia do zabicia całej usługi w celu wdrożenia nowej definicji zadania. Jeśli wolisz wdrażanie stopniowe / stopniowe, ustaw minimum na coś>0%
.minimum healthy
się100%
i swojemaximum healthy
do czegoś>100%
, aby umożliwić usługa wdrożyć nowe zadania przed zabijanie starych (minimalizacja wpływu na użytkowników).Od tego momentu usługa automatycznie rozpozna, że określono nowe zadanie, i będzie pracować nad jego wdrożeniem na podstawie skonfigurowanych
minimum
/maximum
zdrowych progów.źródło