Kubernetes: Кордонування проти Дренування

pic

Фото від GuerrillaBuzz на Unsplash

У Kubernetes (та Amazon EKS), дренування (draining) та кордонування (cordoning) використовуються для керування навантаженнями під час обслуговування вузлів або їх оновлення.

Деякі популярні сценарії використання:

  1. Обслуговування вузлів: Оновлення або патчинг базового EC2 екземпляра.
  2. Заміна вузла: Міграція навантажень на новий вузол.
  3. Масштабування кластера: Виведення вузлів з експлуатації під час зменшення масштабу.

Кордонування вузла в 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)

Leave a Reply

Your email address will not be published. Required fields are marked *