На цій сторінці показано, як оновити запущений Deployment до нової версії за допомогою поетапного оновлення. Поетапне оновлення поступово замінює старі Podʼи новими, тому ваш застосунок залишається доступним протягом усього процесу.
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Вам потрібен наявний Deployment. Якщо у вас його немає, створіть Deployment nginx зі сторінки Запуск застосунку без збереження стану за допомогою Deployment:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
Перевірте, що Deployment запускає два Podʼи:
kubectl get deployment nginx-deployment
Вивід подібний до такого:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 10s
Будь-яка зміна в полі .spec.template Deployment запускає поетапне оновлення. Kubernetes створює нові Podʼи з оновленою конфігурацією й поступово завершує старі Podʼи.
kubectl applyВи можете запустити поетапне оновлення, відредагувавши маніфест Deployment і застосувавши зміну. Цей підхід добре працює, якщо ви зберігаєте маніфести в системі контролю версій.
Експортуйте поточний Deployment у локальний файл:
kubectl get deployment nginx-deployment -o yaml > /tmp/nginx-deployment.yaml
Відредагуйте /tmp/nginx-deployment.yaml і змініть .spec.template.spec.containers[0].image з nginx:1.14.2 на nginx:1.16.1.
Перед застосуванням порівняйте свої локальні зміни зі станом кластера:
kubectl diff -f /tmp/nginx-deployment.yaml
Вивід подібний до такого:
diff -u -N /tmp/LIVE/apps.v1.Deployment.default.nginx-deployment /tmp/MERGED/apps.v1.Deployment.default.nginx-deployment
--- /tmp/LIVE/apps.v1.Deployment...
+++ /tmp/MERGED/apps.v1.Deployment...
@@ -29,7 +29,7 @@
containers:
- - image: nginx:1.14.2
+ - image: nginx:1.16.1
name: nginx
Застосуйте оновлений маніфест:
kubectl apply -f /tmp/nginx-deployment.yaml
Щоб оновити образ контейнера без редагування файлу маніфесту, використовуйте kubectl set image:
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
Вивід подібний до такого:
deployment.apps/nginx-deployment image updated
Перевірте, що образ було оновлено:
kubectl get deployment nginx-deployment -o jsonpath='{.spec.template.spec.containers[0].image}'
Вивід подібний до такого:
nginx:1.16.1
Використовуйте kubectl rollout status, щоб стежити за перебігом поетапного оновлення:
kubectl rollout status deployment/nginx-deployment
Вивід подібний до такого:
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
Після завершення розгортання перевірте Deployment:
kubectl get deployment nginx-deployment
Вивід подібний до такого:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 2m
Ви можете призупинити розгортання, щоб перевірити часткове оновлення або обʼєднати кілька змін в одне розгортання.
kubectl rollout pause deployment/nginx-deployment
Вивід подібний до такого:
deployment.apps/nginx-deployment paused
Поки розгортання призупинено, ви можете вносити додаткові зміни. Ці зміни не запускають нове розгортання, доки ви його не відновите:
kubectl set image deployment/nginx-deployment nginx=nginx:1.17.0
kubectl rollout resume deployment/nginx-deployment
Вивід подібний до такого:
deployment.apps/nginx-deployment resumed
Перевірте, що розгортання завершується:
kubectl rollout status deployment/nginx-deployment
Deployments підтримують два типи стратегій оновлення:
Для стратегії RollingUpdate ці параметри контролюють, як Kubernetes виконує оновлення:
| Параметр | Що контролює | Стандартно | Приклад |
|---|---|---|---|
maxUnavailable | Максимальна кількість Podʼів, які можуть бути недоступні під час оновлення | 25% | 1 або 25% |
maxSurge | Максимальна кількість додаткових Podʼів, які можуть бути створені під час оновлення | 25% | 1 або 25% |
maxUnavailable та maxSurge приймають абсолютне число або відсоток. Kubernetes обчислює відсотки від бажаної кількості реплік, округлюючи вниз для maxUnavailable та округлюючи вгору для maxSurge.Для налаштування цих параметрів використовуйте kubectl patch:
kubectl patch deployment nginx-deployment -p \
'{"spec":{"strategy":{"rollingUpdate":{"maxUnavailable":"25%","maxSurge":"25%"}}}}'
Ви також можете задати ці поля в маніфесті Deployment у .spec.strategy.rollingUpdate. Докладні приклади дивіться в розділах max unavailable і max surge документації з концепцій Deployment.
Якщо розгортання не просувається протягом часу, вказаного в .spec.progressDeadlineSeconds (стандартно: 600 секунд), Kubernetes позначає стан Deployment Progressing як False. Перевірити цей стан можна, описавши Deployment:
kubectl describe deployment nginx-deployment
Шукайте стан Progressing у розділі Conditions виводу. Розгортання, що застрягло, зазвичай вказує на те, що нові Podʼи не можуть запуститися. Розділ Events у виводі може допомогти діагностувати проблему.
Якщо нова версія спричиняє проблеми, ви можете відкотитися до попередньої ревізії.
kubectl rollout history deployment/nginx-deployment
Вивід подібний до такого:
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
CHANGE-CAUSE показує значення анотації kubernetes.io/change-cause на момент кожної ревізії. Ця анотація не встановлюється автоматично, але якщо ви використовуєте автоматизоване рішення для керування Deployments, ваш інструмент може записувати в цю анотацію певний текст.kubectl rollout undo deployment/nginx-deployment
Вивід подібний до такого:
deployment.apps/nginx-deployment rolled back
kubectl rollout undo deployment/nginx-deployment --to-revision=1
Перевірте, що відкочування завершується:
kubectl rollout status deployment/nginx-deployment
.spec.revisionHistoryLimit у маніфесті Deployment. Значення 0 повністю вимикає відкочування.Видаліть Deployment:
kubectl delete deployment nginx-deployment