Перевод нод k3s в maintenance режим
Эта инструкция описывает последовательность действий для безопасного вывода ноды Kubernetes из эксплуатации с целью обновления, перезагрузки или проведения технического обслуживания. Цель процедуры — исключить либо свести к минимуму влияние на работоспособность приложений за счет корректного переноса рабочей нагрузки на другие ноды кластера.
В ходе выполнения процедуры используются следующие команды:
-
Cordon — помечает ноду как недоступную для планировщика (scheduler), предотвращая размещение на ней новых подов.
-
Drain — корректно освобождает ноду, завершая работающие на ней поды и перезапуская их на других доступных нодах кластера.
1. Перевод ноды в maintenance mode
-
Получите список всех нод и определите имя ноды, для которой требуется провести техническое обслуживание.
kubectl get nodeВ результате будет выведен список нод. В примере далее используется нода
ift04-agent03:NAME STATUS ROLES AGE VERSION ift04-agent01 Ready <none> 13d v1.32.3+k3s1 ift04-agent02 Ready <none> 13d v1.32.3+k3s1 ift04-agent03 Ready <none> 13d v1.32.3+k3s1 ift04-lb01 Ready <none> 13d v1.32.3+k3s1 ift04-lb02 Ready <none> 13d v1.32.3+k3s1 ift04-server01 Ready control-plane,etcd,master 13d v1.32.3+k3s1 ift04-server02 Ready control-plane,etcd,master 13d v1.32.3+k3s1 ift04-server03 Ready control-plane,etcd,master 13d v1.32.3+k3s1 -
Пометьте ноду как недоступную для планировщика (Cordon):
kubectl cordon ift04-agent03 -
Проверьте статус ноды:
kubectl get nodeОжидаемый результат — статус Ready,SchedulingDisabled:
ift04-agent03 Ready,SchedulingDisabled <none> 13d v1.32.3+k3s1 -
Освободите ноды от подов (Drain). Для этого выполните корректное выселение подов с ноды:
kubectl drain ift04-agent03 --ignore-daemonsets --delete-emptydir-data --force
+ Описание флагов команды:
+
* --ignore-daemonsets — обязательный флаг. Игнорирует поды, управляемые DaemonSet, которые не могут быть удалены стандартным drain.
* --delete-emptydir-data — подтверждает удаление данных из томов emptyDir.
* --force — позволяет удалить поды, не управляемые контроллерами.
Команда drain выполняется некоторое время, так как Kubernetes ожидает корректного завершения приложений (отправляется сигнал SIGTERM). После успешного завершения команды можно приступать к техническому обслуживанию ноды.
|
Для контроля количества и состояния подов используйте команду:
kubectl get pods --all-namespaces -o wide | grep ift04-agent03
2. Особенности работы с Pod Disruption Budget (PDB)
Во время выполнения drain могут появляться сообщения следующего вида:
evicting pod longhorn-system/instance-manager-8d67a70794045e17b23e8127df2cb927
error when evicting pods/"instance-manager-8d67a70794045e17b23e8127df2cb927" -n "longhorn-system" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
Pod Disruption Budget (PDB) — механизм Kubernetes, предназначенный для поддержания высокой доступности приложений во время плановых операций (обслуживание нод, обновления и т.д.). PDB определяет минимальное количество реплик подов, которые должны оставаться доступными.
В данном примере удаление пода невозможно, так как в PDB задано значение minAvailable: 1, то есть должна всегда оставаться хотя бы одна рабочая реплика.
Для решения проблемы:
-
Временно измените значение
minAvailableна0. -
После выселения пода верните значение обратно на
1.
kubectl -n longhorn-system edit pdb instance-manager-90c139d0386a23c4e6878abc8458385a