Informacje zawarte w tym dokumencie mogą być już nieaktualne
Ten dokument po raz ostatni został zmodyfikowany wcześniej niż wskazuje na to data publikacji jego wersji referencyjnej. To oznacza, że może być już nieaktualny. Jeśli znasz angielski, zajrzyj do oryginalnej, aktualizowanej na bieżąco, wersji dokumentacji: Performing a Rolling Update
Aktualizacje Rolling Update
Cele
Wykonaj aktualizację Rolling Update używając kubectl.
Aktualizowanie aplikacji
Użytkownicy oczekują, że aplikacje są dostępne non-stop, a deweloperzy chcieliby móc wprowadzać nowe wersje nawet kilka razy dziennie. W Kubernetesie jest to możliwe dzięki mechanizmowi płynnych aktualizacji (rolling updates). Rolling updates pozwala prowadzić aktualizację w ramach Deploymentu bez przerw w jego działaniu. Odbywa się to dzięki krokowemu zastępowaniu kolejnych Podów. Nowe Pody uruchamiane są na Węzłach, które posiadają wystarczające zasoby, a Kubernetes czeka, aż uruchomią się nowe Pody, zanim usunie stare.
W poprzednim module wyskalowaliśmy aplikację aby była uruchomiona na wielu instancjach. To niezbędny wymóg, aby móc prowadzić aktualizacje bez wpływu na dostępność aplikacji. Domyślnie, maksymalna liczba Podów, które mogą być niedostępne w trakcie aktualizacji oraz Podów, które mogą być tworzone, wynosi jeden. Obydwie opcje mogą być zdefiniowane w wartościach bezwzględnych lub procentowych (ogólnej liczby Podów). W Kubernetesie, każda aktualizacja ma nadany numer wersji i każdy Deployment może być wycofany do wersji poprzedniej (stabilnej).
Ogólnie o Rolling updates
Podobnie, jak w przypadku skalowania aplikacji, jeśli Deployment jest udostępniony publicznie, Serwis będzie kierował ruch tylko do Podów, które są dostępne w trakcie aktualizacji. Dostępny Pod to taki, którego instancja jest dostępna dla użytkowników aplikacji.
Płynne aktualizacje pozwalają na:
- Promocję aplikacji z jednego środowiska do innego (poprzez aktualizację obrazu kontenera)
- Wycofywanie się do poprzedniej wersji
- Continuous Integration oraz Continuous Delivery aplikacji bez przerw w jej działaniu
W ramach tego interaktywnego samouczka zaktualizujemy aplikację do nowej wersji, a następnie wycofamy tę aktualizację.
Zaktualizuj wersję aplikacji
Aby wyświetlić listę swoich Deploymentów, uruchom komendę get deployments:
kubectl get deployments
Aby wyświetlić listę uruchomionych Podów, użyj komendy get pods:
kubectl get pods
Aby zobaczyć bieżącą wersję obrazu aplikacji,
uruchom komendę describe pods i poszukaj pola Image:
kubectl describe pods
Aby zaktualizować obraz aplikacji do wersji 2, użyj komendy
set image, podając nazwę Deploymentu oraz nową wersję obrazu:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=docker.io/jocatalin/kubernetes-bootcamp:v2
Polecenie zainicjowało rolling update Deploymentu, aktualizując obraz
aplikacji. Sprawdź status nowych Podów i zobacz, jak
postępuje wyłączanie poprzednich wersji używając polecenia get pods:
kubectl get pods
Zweryfikuj aktualizację
Najpierw sprawdź, czy usługa działa, ponieważ mogłeś ją usunąć w
poprzednim kroku samouczka, uruchom
describe services/kubernetes-bootcamp. Jeśli jej brakuje, możesz ją ponownie utworzyć za pomocą:
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
Utwórz zmienną środowiskową o nazwie NODE_PORT,
która będzie miała wartość przypisanego portu Węzła:
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo "NODE_PORT=$NODE_PORT"
Następnie wykonaj polecenie curl na udostępniony adres IP i port:
curl http://"$(minikube ip):$NODE_PORT"
Z każdym uruchomieniem polecenia curl, trafisz na inny Pod. Zwróć
uwagę, że obecnie wszystkie Pody działają na najnowszej wersji (v2).
Możesz również potwierdzić aktualizację, uruchamiając komendę rollout status:
kubectl rollout status deployments/kubernetes-bootcamp
Aby wyświetlić bieżącą wersję obrazu aplikacji, uruchom komendę describe pods:
kubectl describe pods
W polu Image sprawdź, czy
używasz najnowszej wersji obrazu (v2).
Cofnięcie aktualizacji
Wykonajmy kolejną aktualizację i spróbujmy wdrożyć obraz oznaczony tagiem v10:
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
Użyj get deployments, aby zobaczyć status Deploymentu:
kubectl get deployments
Zauważ, że w jest za mało Podów działających poprawnie.
Uruchom komendę get pods, aby wyświetlić listę wszystkich Podów:
kubectl get pods
Zauważ, że niektóre z podów mają status ImagePullBackOff.
Aby uzyskać więcej informacji na temat problemu, uruchom komendę describe pods:
kubectl describe pods
W sekcji Events dla podów, zauważ, że
wersja obrazu v10 nie istniała w repozytorium.
Aby wycofać wdrożenie do ostatniej
działającej wersji, użyj komendy rollout undo:
kubectl rollout undo deployments/kubernetes-bootcamp
Polecenie rollout undo przywraca Deployment do poprzedniego znanego
stanu (v2 obrazu). Aktualizacje są wersjonowane i
można je cofać do dowolnego wcześniej znanego stanu Deploymentu.
Użyj polecenia get pods, aby ponownie wyświetlić listę Podów:
kubectl get pods
Aby sprawdzić obraz wdrożony na działających Podach, użyj polecenia describe pods:
kubectl describe pods
Deployment ponownie używa stabilnej wersji
aplikacji (v2). Wycofanie zakończyło się pomyślnie.
Pamiętaj o oczyszczeniu lokalnego klastra.
kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp
Co dalej?
- Dowiedz się więcej o Deploymentach.