Одной из важнейших задач администратора является обеспечение обновления системы и всех доступных пакетов до последних версий.
Даже после добавления нод в кластер Kubernetes нам все равно необходимо управлять обновлениями.
В большинстве случаев после получения обновлений (например, обновлений ядра, системного обслуживания или аппаратных изменений) необходимо перезагрузить хост, чтобы изменения были применены.
Для Kubernetes это может быть даже затруднительно, поскольку перед перезагрузкой необходимо убедиться в том, что работающие приложения завершены или перенесены на другие узлы.
Kured (KUbernetes REboot Daemon) – это инструмент, предназначенный для упрощения процесса перезагрузки хостов в кластере Kubernetes.
Он помогает управлять перезагрузкой хостов контролируемым и автоматизированным образом, сводя к минимуму нарушения в работе приложений, работающих на кластере.
Он автоматизирует процесс перезагрузки, выполняя следующие действия:
- Мониторинг состояния хостов: Kured постоянно следит за состоянием хостов в кластере Kubernetes. Он проверяет доступность и состояние здоровья каждого хоста. Также отслеживается наличие файла sentinel перезагрузки, например /var/run/reboot-required, или успешное выполнение команды sentinel.
- Drain: Когда хост нуждается в перезагрузке, Kured запускает процесс “drain” для этого узла. Процесс “drain” изящно завершает работу подов на ноде и обеспечивает миграцию рабочей нагрузки на другие доступные ноды кластера. Это гарантирует отсутствие сбоев в работе приложений, работающих на кластере. Использование блокировки на сервере API позволяет обеспечить одновременную перезагрузку только одного узла.
- Перезагрузка хоста: После осушения узла и миграции всей рабочей нагрузки Kured инициирует перезагрузку узла.
- Восстановление хоста: После перезагрузки узла Kured гарантирует, что хоств будет помечен как доступный и готовый к приему новых подов.
Начало работы
В данном руководстве предполагается, что у вас уже есть запущенный кластер Kubernetes.
После установки вам также потребуется kubectl. Для его установки используйте команды:
Для доступа к кластеру необходимо экспортировать конфигурацию администратора:
##Для RKE2
export PATH=$PATH:/var/lib/rancher/rke2/bin export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
##Для K0s
export KUBECONFIG=/var/lib/k0s/pki/admin.conf
Убедитесь в возможности доступа к кластеру:
#1. Установка kured (Kubernetes Reboot Daemon) на Kubernetes
Kured – это демон Kubernetes, который автоматизирует безопасную и контролируемую перезагрузку хостов на основе показаний системы управления пакетами базовой операционной системы.
Он обеспечивает согласованную перезагрузку нод кластера, не нарушая доступности работающих приложений.
Для его установки скачаем стандартный манифест без блокировки оповещений Prometheus или уведомлений Slack с помощью команд:
latest=$(curl -s https://api.github.com/repos/kubereboot/kured/releases | jq -r '.[0].tag_name') wget https://github.com/kubereboot/kured/releases/download/$latest/kured-$latest-dockerhub.yaml
После загрузки откройте файл для редактирования:
Теперь здесь можно произвести достаточно большое количество настроек.
Доступны следующие флаги:
Kubernetes Reboot Daemon
Usage:
kured [flags]
Flags:
--alert-filter-regexp regexp.Regexp alert names to ignore when checking for active alerts
--alert-firing-only only consider firing alerts when checking for active alerts
--annotate-nodes if set, the annotations 'weave.works/kured-reboot-in-progress' and 'weave.works/kured-most-recent-reboot-needed' will be given to nodes undergoing kured reboots
--blocking-pod-selector stringArray label selector identifying pods whose presence should prevent reboots
--drain-grace-period int time in seconds given to each pod to terminate gracefully, if negative, the default value specified in the pod will be used (default -1)
--drain-timeout duration timeout after which the drain is aborted (default: 0, infinite time)
--ds-name string name of daemonset on which to place lock (default "kured")
--ds-namespace string namespace containing daemonset on which to place lock (default "kube-system")
--end-time string schedule reboot only before this time of day (default "23:59:59")
--force-reboot force a reboot even if the drain fails or times out
-h, --help help for kured
--lock-annotation string annotation in which to record locking node (default "weave.works/kured-node-lock")
--lock-release-delay duration delay lock release for this duration (default: 0, disabled)
--lock-ttl duration expire lock annotation after this duration (default: 0, disabled)
--log-format string use text or json log format (default "text")
--message-template-drain string message template used to notify about a node being drained (default "Draining node %s")
--message-template-reboot string message template used to notify about a node being rebooted (default "Rebooting node %s")
--message-template-uncordon string message template used to notify about a node being successfully uncordoned (default "Node %s rebooted & uncordoned successfully!")
--node-id string node name kured runs on, should be passed down from spec.nodeName via KURED_NODE_ID environment variable
--notify-url string notify URL for reboot notifications (cannot use with --slack-hook-url flags)
--period duration sentinel check period (default 1h0m0s)
--post-reboot-node-labels strings labels to add to nodes after uncordoning
--pre-reboot-node-labels strings labels to add to nodes before cordoning
--prefer-no-schedule-taint string Taint name applied during pending node reboot (to prevent receiving additional pods from other rebooting nodes). Disabled by default. Set e.g. to "weave.works/kured-node-reboot" to enable tainting.
--prometheus-url string Prometheus instance to probe for active alerts
--reboot-command string command to run when a reboot is required (default "/bin/systemctl reboot")
--reboot-days strings schedule reboot on these days (default [su,mo,tu,we,th,fr,sa])
--reboot-delay duration delay reboot for this duration (default: 0, disabled)
--reboot-sentinel string path to file whose existence triggers the reboot command (default "/var/run/reboot-required")
--reboot-sentinel-command string command for which a zero return code will trigger a reboot command
--skip-wait-for-delete-timeout int when seconds is greater than zero, skip waiting for the pods whose deletion timestamp is older than N seconds while draining a node
--slack-channel string slack channel for reboot notifications
--slack-hook-url string slack hook URL for reboot notifications [deprecated in favor of --notify-url]
--slack-username string slack username for reboot notifications (default "kured")
--start-time string schedule reboot only after this time of day (default "0:00")
--time-zone string use this timezone for schedule inputs (default "UTC")
По умолчанию Kured проверяет наличие /var/run/reboot-required каждые 60 минут, однако вы можете переопределить эти значения с помощью параметров -reboot-sentinel и -period.
Для данного демонстрации мы откомментируем и изменим приведенные ниже строки в наборе Kured DaemonSet;
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kured # Must match `--ds-name`
namespace: kube-system # Must match `--ds-namespace`
spec:
.....
command:
- /usr/bin/kured
- --period=10m
- --reboot-sentinel=/var/run/reboot-required
....
Мы настроили Kured на проверку существования /var/run/reboot-required каждые 10 минут.
Запомните, что это используется в целях тестирования.
Вы можете установить желаемое время для своей среды.
После выполнения необходимых настроек можно применить манифест:
Просмотр состояния развертывания:
Имеется 3 пода, каждый из которых работает на выделенном хосте.
Для просмотра хоста используйте команду:
#2. Проверка работы Kured на Kubernetes
Чтобы проверить работоспособность Kured, создадим файл /var/run/reboot-required на одном из хостов вручную:
Теперь проверьте логи Kured:
По истечении заданного времени будет определена предстоящая перезагрузка системы.
Хост будет перезапущен
Вы можете запланировать перезагрузку на желаемое время, внеся дополнительные изменения в YAML.
Например, если вы хотите, чтобы перезагрузки происходили только между 00:00 и 03:00 часами, вы можете сделать следующие настройки:
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kured # Must match `--ds-name`
namespace: kube-system # Must match `--ds-namespace`
spec:
selector:
matchLabels:
name: kured
updateStrategy:
type: RollingUpdate
....
command:
- /usr/bin/kured
.....
- --reboot-days=sun,mon,tue,wed,thu,fri,sat
- --reboot-delay=90s
- --start-time=0:00
- --end-time=02:59:59
- --time-zone=Africa/Nairobi
После внесения изменений примените команду:
Заключение
В этом руководстве мы узнали, как выполнять безопасную и автоматическую перезагрузку хостов в Kubernetes с помощью Kured.
Теперь вы можете настроить Kubernetes на проверку необходимости перезагрузки и упростить управление базовой операционной системой.
см. также:
- ☸️ Запуск Nfs в Kubernetes
- ☸️ Проверка подписанных helm чартов
- ☸️ Vesta: Анализ конфигурации кластеров Docker и Kubernetes и анализ уязвимостей
- ☸️ Защита трафика кластера Kubernetes с помощью сетевых политик подов
- ☸️ Как проверить конфигурацию Consul
- 🐳 Популярные ошибки в конфигурации, которые делают контейнерные приложения уязвимыми для атак