Применение обновлений безопасности и ядра для узлов Linux в Службе Azure Kubernetes (AKS)

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

Процесс обновления узлов Windows Server до актуального состояния имеет некоторые отличия. Узлы Windows Server не получают ежедневных обновлений. Вместо этого выполняется обновление AKS, которое развертывает новые узлы с помощью последнего образа системы и новейших исправлений. Для кластеров AKS, использующих узлы Windows Server, см. статью Обновление пула узлов в AKS.

В этой статье показано, как применить средство с открытым кодом kured (KUbernetes REboot Daemon — управляющая программа Kubernetes для перезагрузки) для отслеживания узлов, которые нужно перезагрузить, и автоматической корректировки расписания для перезагрузки выполняемых pod и процесса перезагрузки узлов.

Примечание

Kured — это проект с открытым кодом в Cloud Native Computing Foundation. Направляйте вопросы и сообщения о проблемах в GitHub kured. Дополнительную поддержку можно найти в канале #kured на CNCF Slack.

Подготовка к работе

Необходимо установить и настроить Azure CLI версии 2.0.59 или более поздней. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Основные сведения об обновлении узла AKS

В кластере AKS узлы Kubernetes выполняются на виртуальных машинах Azure. Эти виртуальные машины под управлением Linux используют образ Ubuntu или Azure Linux, а ОС настроена на автоматическое проверка обновления каждый день. Если доступны обновления для системы безопасности или ядра, они автоматически скачиваются и устанавливаются.

Процесс обновления и перезагрузка узла AKS с помощью kured

Чтобы завершить установку некоторых обновлений системы безопасности, например обновлений ядра, нужно перезагрузить узел. На узле Linux, который нужно перезагрузить, создается файл с именем /var/run/reboot-required. При этом перезагрузка не выполняется автоматически.

Вы можете использовать собственные рабочие процессы и системы для обработки запросов на перезагрузку узла или оркестрировать этот процесс с помощью kured. Для использования kured развертывается DaemonSet, который выполняет pod на каждом узле Linux в кластере. Эти группы pod, которые запускает DaemonSet, проверяют наличие файла /var/run/reboot-required и при его обнаружении запускают перезагрузку узла.

Обновления образов узлов

Автоматическое обновление применяет обновления к ОС узлов Linux, но образ, используемый для создания узлов для кластера, не изменяется. Если в кластер добавляется новый узел Linux, для его создания используется исходный образ. Этот новый узел получает все обновления системы безопасности и ядра, доступные во время автоматического проверка каждый день, но остается без исправления до завершения всех проверок и перезапусков.

В качестве альтернативы с помощью обновления образа узла можно проверить наличие образов узла, используемых кластером, и обновить их. Дополнительные сведения об обновлении образа узла см. в статье обновление образа узла Служба Azure Kubernetes (AKS).

Обновления узлов

В AKS есть еще один процесс, который позволяет обновить кластер. Обычно обновление подразумевает переход на новую версию Kubernetes, а не просто обновления безопасности для узла. При обновлении AKS выполняются следующие действия:

  • развертывание нового узла со всеми последними обновлениями безопасности и новой версией Kubernetes;
  • блокировка старого узла и остановка процессов на нем;
  • назначение выполнения pod на новом узле;
  • удаление старого узла.

При обработке события обновления нельзя сохранить старую версию Kubernetes. Необходимо указать более новую версию Kubernetes. Чтобы перейти на последнюю версию Kubernetes, вы можете обновить кластер AKS.

Развертывание kured в кластере AKS

Чтобы развернуть DaemonSet kured, установите следующий официальный чарт Kured Helm. При этом создается роль, а также роль кластера, привязки и учетная запись службы, а затем с помощью kured будет развернут DaemonSet.

# Add the Kured Helm repository
helm repo add kubereboot https://kubereboot.github.io/charts/

# Update your local Helm chart repository cache
helm repo update

# Create a dedicated namespace where you would like to deploy kured into
kubectl create namespace kured

# Install kured in that namespace with Helm 3 (only on Linux nodes, kured is not working on Windows nodes)
helm install my-release kubereboot/kured --namespace kured --set controller.nodeSelector."kubernetes\.io/os"=linux

Вы также можете настроить дополнительные параметры для kured, например интеграцию с Prometheus или Slack. Дополнительные сведения о параметрах конфигурации см. на диаграмме Kured Helm.

Обновление узлов кластера

По умолчанию узлы Linux в службе AKS проверяют наличие обновлений каждый вечер. Если вы не хотите ждать, обновление можно запустить вручную и убедиться, что kured выполняется правильно. Сначала установите подключение по SSH к одному из узлов AKS. Создав SSH-подключение к узлу Linux, проверьте наличие обновлений и примените их следующим образом.

sudo apt-get update && sudo apt-get upgrade -y

Если эти обновления требуют перезагрузки узла, создается файл /var/run/reboot-required. По умолчанию Kured каждые 60 минут проверяет наличие узлов, которые требуют перезагрузки.

Мониторинг и проверка процесса перезагрузки

Если одна из реплик DaemonSet определит, что узлу требуется перезагрузка, к этому узлу применяется блокировка через API Kubernetes. Эта блокировка предотвращает планирование дополнительных модулей pod на узле. Также блокировка гарантирует, что за один раз перезагружается только один узел. После применения блокировки на этом узле постепенно завершается выполнение всех групп pod, а затем узел перезагружается.

Состояние узлов можно отслеживать с помощью команды kubectl get nodes. В следующем примере выходных данных показан узел с состоянием SchedulingDisabled, который готовится к процессу перезагрузки:

NAME                       STATUS                     ROLES     AGE       VERSION
aks-nodepool1-28993262-0   Ready,SchedulingDisabled   agent     1h        v1.11.7

После обновления вы можете проверить состояние узлов с помощью команды kubectl get nodes с параметром --output wide. Эти выходные данные позволяют увидеть разницу в KERNEL-VERSION базовых узлов, как показано в следующем примере выходных данных. На предыдущем шаге узел aks-nodepool1-28993262-0 был обновлен, и теперь для него отображается версия ядра 4.15.0-1039-azure. Для узла aks-nodepool1-28993262-1, который еще не был обновлен, отображается версия ядра 4.15.0-1037-azure.

NAME                       STATUS    ROLES     AGE       VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-nodepool1-28993262-0   Ready     agent     1h        v1.11.7   10.240.0.4    <none>        Ubuntu 16.04.6 LTS   4.15.0-1039-azure   docker://3.0.4
aks-nodepool1-28993262-1   Ready     agent     1h        v1.11.7   10.240.0.5    <none>        Ubuntu 16.04.6 LTS   4.15.0-1037-azure   docker://3.0.4

Дальнейшие действия

В этой статье описано использование kured для автоматической перезагрузки узлов Linux при применении обновлений безопасности. Чтобы перейти на последнюю версию Kubernetes, вы можете обновить кластер AKS.

Для кластеров AKS, использующих узлы Windows Server, см. статью Обновление пула узлов в AKS.