☸️ Выполнение безопасных и автоматических перезагрузок нод Kubernetes с помощью Kured |

☸️ Выполнение безопасных и автоматических перезагрузок нод Kubernetes с помощью Kured

Мануал

Одной из важнейших задач администратора является обеспечение обновления системы и всех доступных пакетов до последних версий.

Даже после добавления нод в кластер Kubernetes нам все равно необходимо управлять обновлениями.

В большинстве случаев после получения обновлений (например, обновлений ядра, системного обслуживания или аппаратных изменений) необходимо перезагрузить хост, чтобы изменения были применены.

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

Kured (KUbernetes REboot Daemon) – это инструмент, предназначенный для упрощения процесса перезагрузки хостов в кластере Kubernetes.

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

Он автоматизирует процесс перезагрузки, выполняя следующие действия:

  • Мониторинг состояния хостов: Kured постоянно следит за состоянием хостов в кластере Kubernetes. Он проверяет доступность и состояние здоровья каждого хоста. Также отслеживается наличие файла sentinel перезагрузки, например /var/run/reboot-required, или успешное выполнение команды sentinel.
  • Drain: Когда хост нуждается в перезагрузке, Kured запускает процесс “drain” для этого узла. Процесс “drain” изящно завершает работу подов на ноде и обеспечивает миграцию рабочей нагрузки на другие доступные ноды кластера. Это гарантирует отсутствие сбоев в работе приложений, работающих на кластере. Использование блокировки на сервере API позволяет обеспечить одновременную перезагрузку только одного узла.
  • Перезагрузка хоста: После осушения узла и миграции всей рабочей нагрузки Kured инициирует перезагрузку узла.
  • Восстановление хоста: После перезагрузки узла Kured гарантирует, что хоств будет помечен как доступный и готовый к приему новых подов.

Начало работы

В данном руководстве предполагается, что у вас уже есть запущенный кластер Kubernetes.

После установки вам также потребуется kubectl. Для его установки используйте команды:

curl -LO “https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl”
chmod +x kubectl
sudo mv kubectl /usr/local/bin

Для доступа к кластеру необходимо экспортировать конфигурацию администратора:

##Для 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

Убедитесь в возможности доступа к кластеру:

kubectl get nodes
NAME                    STATUS   ROLES           AGE   VERSION
demo-compute-1          Ready    <none>          17h   v1.27.2
demo-compute-2          Ready    <none>          17h   v1.27.2
demo-k8s-controlplane   Ready    control-plane   17h   v1.27.2

#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

После загрузки откройте файл для редактирования:

vim 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 минут.

Запомните, что это используется в целях тестирования.

Вы можете установить желаемое время для своей среды.

После выполнения необходимых настроек можно применить манифест:

kubectl apply -f kured-$latest-dockerhub.yaml

Просмотр состояния развертывания:

kubectl get po -n kube-system |grep kured
kured-52lj5                                     1/1     Running            0                69s
kured-8pczr                                     1/1     Running            0                69s
kured-rvh7t                                     1/1     Running            0                69s

Имеется 3 пода, каждый из которых работает на выделенном хосте.

Для просмотра хоста используйте команду:

kubectl get pods -o wide  -n kube-system |grep kured
kured-mhwsg                                            1/1     Running   0             3m27s   10.244.1.3        master  <none>           <none>
kured-p984r                                            1/1     Running   0             3m27s   10.244.2.5        worker1   <none>           <none>
kured-t2tl5                                            1/1     Running   0             3m26s   10.244.0.9        worker2   <none>           <none>

#2. Проверка работы Kured на Kubernetes

Чтобы проверить работоспособность Kured, создадим файл /var/run/reboot-required на одном из хостов вручную:

sudo touch /var/run/reboot-required

Теперь проверьте логи Kured:

kubectl logs -f kured-8pczr -c kured -n kube-system

По истечении заданного времени будет определена предстоящая перезагрузка системы.

Хост будет перезапущен

Вы можете запланировать перезагрузку на желаемое время, внеся дополнительные изменения в 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

После внесения изменений примените команду:

kubectl apply -f kured-$latest-dockerhub.yaml

Заключение

В этом руководстве мы узнали, как выполнять безопасную и автоматическую перезагрузку хостов в Kubernetes с помощью Kured.

Теперь вы можете настроить Kubernetes на проверку необходимости перезагрузки и упростить управление базовой операционной системой.

см. также:

 

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий