Фото від GuerrillaBuzz на Unsplash
У Kubernetes (та Amazon EKS), дренування (draining) та кордонування (cordoning) використовуються для керування навантаженнями під час обслуговування вузлів або їх оновлення.
Деякі популярні сценарії використання:
- Обслуговування вузлів: Оновлення або патчинг базового EC2 екземпляра.
- Заміна вузла: Міграція навантажень на новий вузол.
- Масштабування кластера: Виведення вузлів з експлуатації під час зменшення масштабу.
Кордонування вузла в EKS
Кордонування вузла позначає його як нескладувальний (unschedulable), що запобігає призначенню нових подів на цей вузол. Існуючі поди продовжують працювати.
Команда для кордонування вузла:
kubectl cordon
Приклад:
kubectl cordon ip-192-168-0-123.ec2.internal
Вивід може виглядати так: node/ip-192–168–0–123.ec2.internal cordoned
Ефект:
- Нові поди не плануються на цей вузол.
- Існуючі поди залишаються незмінними.
Дренування вузла в EKS
Дренування вузла виселяє всі поди, що не належать до DaemonSet з нього, забезпечуючи безпечну міграцію навантажень на інші вузли перед обслуговуванням.
Команда для дренування вузла:
kubectl drain --ignore-daemonsets --delete-emptydir-data
Параметри:
--ignore-daemonsets
: Поди, керовані DaemonSet, не виселяються.--delete-emptydir-data
: Видаляє поди з томамиemptyDir
(тимчасове сховище).
Приклад:
kubectl drain ip-192-168-0-123.ec2.internal --ignore-daemonsets --delete-emptydir-data
Вивід може виглядати так: node/ip-192–168–0–123.ec2.internal drained
Ефект:
- Виселяються всі поди, що не належать до DaemonSet.
- Вузол позначається як нескладувальний.
- Поди DaemonSet залишаються працювати на вузлі.
Обробка помилок
Деякі популярні сценарії обробки помилок та можливі рішення:
Помилка 1: Під час дренування поди застрягли:
- Використовуйте
--force
та--grace-period=0
, щоб примусово виселити поди:
kubectl drain --ignore-daemonsets --delete-emptydir-data --force --grace-period=0
Помилка 2: Поди DaemonSet на вузлі:
- Поди DaemonSet ігноруються за замовчуванням з параметром
--ignore-daemonsets
.
Помилка 3: Нескладувальні поди:
- Переконайтеся, що в кластері достатньо ресурсів для перенесення виселених подів.
Загальні команди kubectl
# Крок 1: Переглянути всі вузли, щоб знайти вузол для обслуговування
kubectl get nodes
# Крок 2: Кордонувати вузол, щоб не дозволити планування нових подів
NODE_NAME="ip-192-168-0-123.ec2.internal" # Замість цього вкажіть ім'я вашого вузла
kubectl cordon $NODE_NAME
echo "Node $NODE_NAME cordoned."
# Крок 3: Перевірити, чи вузол кордонується
kubectl get nodes | grep $NODE_NAME
# Крок 4: Дренувати вузол, щоб виселити всі поди, що не належать до DaemonSet
kubectl drain $NODE_NAME --ignore-daemonsets --delete-emptydir-data
echo "Node $NODE_NAME drained."
# Крок 5: Перевірити, що всі поди виселені з вузла
kubectl get pods --all-namespaces --field-selector spec.nodeName=$NODE_NAME
# Необхідно: Описати вузол, щоб підтвердити taints і статус нескладувальності
kubectl describe node $NODE_NAME
# Крок 6: Виконати обслуговування на вузлі (ручний крок)
# Крок 7: Розкордонувати вузол після обслуговування, щоб дозволити планування
kubectl uncordon $NODE_NAME
echo "Node $NODE_NAME uncordoned."
# Крок 8: Спостерігати за статусом вузла і подів для підтвердження
kubectl get nodes -w # Спостерігати за статусом вузла
kubectl get pods --all-namespaces -o wide | grep $NODE_NAME # Моніторити перерозподіл подів
Перекладено з: [Kubernetes Cordon vs Draining](https://medium.com/@reach2shristi.81/kubernetes-cordon-vs-draining-d1f88e565a59)