Виконання поступового оновлення

Виконання поетапного оновлення застосунку (rolling update) за допомогою kubectl.

Мета

  • Виконати розгортання з оновленням за допомогою kubectl.

Оновлення застосунку

Користувачі очікують, що застосунки будуть доступні цілодобово, і очікується, що розробники розгортатимуть нові версії кілька разів на день. У Kubernetes це робиться за допомогою розгортань з поступовим оновленням. Поступове оновлення (rolling update) дозволяє виконати оновлення Deployment без перерви в роботі застосунку. Це досягається поетапною заміною поточних Podʼів новими. Нові Podʼи призначаються вузлам з вільними ресурсами, а Kubernetes чекає, доки ці нові Podʼи не почнуть працювати, перш ніж вилучити старі Podʼи.

У попередньому розділі ми масштабували наш застосунок для запуску кількох екземплярів. Це є вимогою для виконання оновлень без впливу на доступність застосунку. Стандартно максимальна кількість Podʼів, які можуть бути недоступні під час оновлення, та максимальна кількість нових Podʼів, які можуть бути створені, дорівнює одному. Обидві опції можуть бути налаштовані як у вигляді точної кількості, так і у відсотках (від усіх Podʼів). У Kubernetes оновлення мають версії, і будь-яке оновлення Deployment може бути повернуте до попередньої (стабільної) версії.

Зміст:

  • Оновлення застосунку

Поступові оновлення дозволяють виконувати оновлення Deployment без зупинки роботи застосунку за допомогою поетапного оновлення екземплярів Podʼів.


Огляд поступового оновлення


Аналогічно масштабуванню застосунку, якщо Deployment є публічно доступним, Service буде балансувати трафік лише на доступні Podʼи під час оновлення. Доступний Pod — це екземпляр, який доступний користувачам застосунку.

Поступові оновлення дозволяють виконувати наступні дії:

  • Просування застосунку з одного середовища в інше (за допомогою оновлень образів контейнерів)
  • Відкат до попередніх версій
  • Неперервна інтеграція та постійна доставка застосунків без перерви в роботі

Якщо Deployment публічно доступний, Service буде балансувати трафік лише на доступні Podʼи під час оновлення.


У наступному інтерактивному практикумі ми оновимо наш застосунок до нової версії та виконаємо відкат.


Оновлення версії застосунку

Для виведення списку Deploymentʼів виконайте команду get deployments: kubectl get deployments

Для виведення списку запущених Podʼів виконайте команду get pods:

kubectl get pods

Для перегляду поточної версії образу застосунку виконайте команду describe pods та шукайте поле Image:

kubectl describe pods

Для оновлення образу застосунку до версії 2 використовуйте команду set image, за якою йде назва Deployment та нова версія образу:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=docker.io/jocatalin/kubernetes-bootcamp:v2

Команда повідомляє Deployment про використання іншого образу для вашого застосунку та запускає поступове оновлення. Перевірте стан нових Podʼів та перегляньте той, що відключається, використовуючи команду get pods:

kubectl get pods

Перевірка оновлення

Спочатку перевірте, чи Service працює, бо ви могли його видалити його на попередньому кроці, виконайте kubectl describe services/kubernetes-bootcamp. Якщо його немає, створіть його знов:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

Створіть змінну середовища з іменем NODE_PORT зі значенням призначеного порту вузла:

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo "NODE_PORT=$NODE_PORT"

Потім виконайте curl з зовнішньою IP-адресою та портом:

curl http://"$(minikube ip):$NODE_PORT"

Кожен раз, коли ви виконуєте команду curl, ви попадете на різні Podʼи. Зверніть увагу, що всі Podʼи зараз працюють на останній версії (v2).

Ви також можете підтвердити оновлення, використовуючи команду rollout status:

kubectl rollout status deployments/kubernetes-bootcamp

Для перегляду поточної версії образу застосунку виконайте команду describe pods:

kubectl describe pods

У полі Image перевірите, що ви використовуєте останню версію образу (v2).

Відкат оновлення

Виконаймо ще одне оновлення та спробуємо розгорнути образ з теґом v10:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

Використовуйте get deployments, щоб переглянути стан розгортання:

kubectl get deployments

Зверніть увагу, що вивід не вказує бажану кількість доступних Podʼів. Використайте команду get pods, щоб вивести список всіх Podʼів:

kubectl get pods

Зверніть увагу, що деякі Podʼи мають статус ImagePullBackOff.

Щоб отримати більше відомостей про проблему, використовуйте команду describe pods:

kubectl describe pods

У розділі Events виводу для проблемних Podʼів, зверніть увагу, що версії образу v10 немає в репозиторії.

Щоб відкотити розгортання до попередньої робочої версії, використовуйте команду rollout undo:

kubectl rollout undo deployments/kubernetes-bootcamp

Команда rollout undo повертає розгортання до попередньо відомого стану (v2 образу). Оновлення мають версії, і ви можете повернутися до будь-якого раніше відомого стану розгортання.

Використайте команду get pods, щоб знову вивести список Podʼів:

kubectl get pods

Чотири Podʼи працюють. Щоб перевірити образ, розгорнутий на цих Podʼах, використайте команду describe pods:

kubectl describe pods

Розгортання знову використовує стабільну версію застосунку (v2). Відкат був успішним.

Не забудьте очистити свій локальний кластер

kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp

Змінено June 20, 2024 at 12:44 PM PST: Sync changest from andygol/k8s-website (36d05bc8a1)