Перейти к основному содержанию

Kubernetes — ввод ноды в режим обслуживания

kubernetes k8s

В процессе администрирования кластера Kubernetes у системных администраторов часто возникают задачи по обслуживанию нод кластера. Иногда нужно выключить физическую ноду для технического обслуживания или апгрейда. Если нода виртуальная, то может понадобиться выключение для апгрейда системных ресурсов.

Краткая инструкция по вводу ноды в режим обслуживания и выводу из него.

Kubernetes — проект с открытым исходным кодом для оркестрации кластера контейнеров Linux. Kubernetes управляет и запускает контейнеры Docker на большом количестве хостов, а так же обеспечивает совместное размещение и репликацию большого количества контейнеров.

Имеем кластер из тридцати с лишним серверов.

kubectl get node

k8s

Ноду test-kube-worker01 планируется отключить и добавить немного памяти и процессоров. Нам нужно будет ввести ноду в режим обслуживания, выключить, добавить ресурсов, включить и вывести из режима обслуживания.

При этом мы хотим корректно завершить работу подов на выбранной ноде.

Ввод ноды в режим обслуживания

Выполняю команду:

kubectl drain --ignore-daemonsets --delete-local-data test-kube-worker01
  • kubectl drain — данная команда переводит ноду в режим обслуживания. Поды на указанной ноде корректно завершают работу, или киляются по таймауту, если они так и не успели выключиться. Не все поды завершают работу по умолчанию. Все поды, запущенные на выбранном узле, будут поставлены в состояние "Terminating" и перенесены на другие доступные узлы в кластере. Replication Controllers, ReplicaSets и Deployments, управляющие переносимыми подами, будут создавать новые поды на других узлах для поддержания желаемого количества запущенных подов.
  • ignore-daemonsets — этот параметр нужен для того, чтобы игнорировать поды, созданные через DaemonSets. DaemonSets-поды должны работать на каждом узле, например, для мониторинга или сетевых служб.
  • delete-local-data (deprecated) — удаляет поды, использующие EmptyDir (локальные данные будут удалены)

Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.

k8s

Все поды, кроме созданных через DaemonSets, корректно завершили работу на выбранной ноде и будут подняты на какой-то другой.

kubectl get node

k8s

У ноды появился статус SchedulingDisabled. Значит, новые поды на ноде запускаться не будут.

k8s

У ноды 12 CPU и 24 ГБ RAM.

k8s

Список подов, которые остались на ноде. Они нам не помешают. Выключаем ноду, добавляем в неё CPU и память, включаем снова.

kubectl get node

k8s

Статус выключенной ноды: NotReady,SchedulingDisabled.

Спокойно добавляем CPU и память, включаем ноду.

kubectl get node

k8s

Дожидаемся, когда статус ноды сменится на Ready,SchedulingDisabled.

k8s

Ресурсов стало больше: 16 CPU и 40 ГБ RAM.

Вывод ноды из режима обслуживания

Выводим ноду из режима обслуживания.

kubectl uncordon test-kube-worker01

k8s

kubectl get node

k8s

Статус ноды Ready.

Примечания

Можно отслеживать количество подов на ноде командой:

kubectl get pods -o wide --all-namespaces | grep <имя_узла>

Посмотреть статус ноды:

kubectl get node | grep <имя_узла>

Запретить создавать новые поды на ноде, при этом старые поды не удалять:

kubectl cordon <имя_узла>

С помощью cordon можно предотвратить размещение планировщиком новых подов на хосте, при этом не оказывая влияние на существующие поды. Это полезно в качестве подготовительного шага перед перезагрузкой узла или другим обслуживанием. Статус ноды при этом Ready,SchedulingDisabled.

Теги

 

Похожие материалы

Production Kubernetes

Josh Rosso, Rich Lander, Alex Brand, John Harris
Хотя многие организации уже используют Kubernetes, в производственной среде этот инструмент встречается редко. И ещё реже с ним работают в больших масштабах. Многие организации, недавно внедрившие эту систему, по-прежнему испытывают трудности с выдерживанием реальных рабочих нагрузок.

Теги