kubernetes v1.32 – Защита ресурсов хоста с помощью systemReserved и kubeReserved

Вопрос или проблема

Окружение:

  • ОС: Ubuntu 24.04.1
  • Характеристики: vCPU=4 память=12GiB
  • K8s: v1.32.0-1.1

Цель:

  • обеспечить защиту хоста K8s от исчерпания ресурсов (ЦПУ и память)
  • обеспечить компонентам K8s достаточное количество ресурсов (ЦПУ, память, временное хранилище)

Проблема:

После инициализации узла control-plane на узле активирован триггер memoryPressure, и непонятно, почему.

На узле доступно около 10+ GiB памяти.
Только базовые статические контейнеры управления K8s (API, менеджер контроллера, планировщик, прокси, etcd). Нет других рабочих нагрузок, так как это создание нового кластера с только первым созданным узлом.

Описание узла:

Имя:               cdak8ctr001
Роли:              control-plane
Метки:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=cdak8ctr001
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/control-plane=
                    node.kubernetes.io/exclude-from-external-load-balancers=
Аннотации:         kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/containerd/containerd.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
Время создания:    Вск, 12 Янв 2025 19:11:34 +0000
Метки группировки: node-role.kubernetes.io/control-plane:NoSchedule
                    node.kubernetes.io/memory-pressure:NoSchedule
                    node.kubernetes.io/not-ready:NoSchedule
Недоступен:        false
Аренда:
  Идентификатор держателя:  cdak8ctr001
  Время получения:     <unset>
  Время обновления:    Вск, 12 Янв 2025 19:27:18 +0000
Условия:
  Тип             Статус  Последнее время проверки                Последнее изменение                   Причина                         Сообщение
  ----             ------  -----------------                 ------------------                ------                         -------
  Нагрузка памяти   True    Вск, 12 Янв 2025 19:25:05 +0000   Вск, 12 Янв 2025 19:11:39 +0000   KubeletHasInsufficientMemory   kubelet имеет недостаточно доступной памяти
  Нагрузка диска   False   Вск, 12 Янв 2025 19:25:05 +0000   Вск, 12 Янв 2025 19:11:32 +0000   KubeletHasNoDiskPressure       kubelet не имеет давления на диск
  Нагрузка PID      False   Вск, 12 Янв 2025 19:25:05 +0000   Вск, 12 Янв 2025 19:11:32 +0000   KubeletHasSufficientPID        kubelet имеет достаточное количество PID
  Готовность       False   Вск, 12 Янв 2025 19:25:05 +0000   Вск, 12 Янв 2025 19:11:32 +0000   KubeletNotReady                сеть контейнерного времени выполнения не готова: NetworkReady=false причина:NetworkPluginNotReady сообщение:сетевая плагин возвращает ошибку: cni плагин не инициализирован
Адреса:
  Внутренний IP:  192.168.10.71
  Имя хоста:    cdak8ctr001
Производительность:
  cpu:                4
  ephemeral-storage:  50770432Ki
  hugepages-2Mi:      0
  memory:             12248456Ki
  pods:               110
Распределяемый ресурс:
  cpu:                2500m
  ephemeral-storage:  47241992563
  hugepages-2Mi:      0
  memory:             10470792Ki
  pods:               110
Информация о системе:
  ID машины:                 4739b562ffd04253a19e8bdfc8ee3b11
  UUID системы:              6f273842-b3e5-f1d7-3519-4980a8fa03c4
  ID загрузки системы:       d1e3a1d2-1e63-451f-ae19-9283c10c4196
  Версия ядра:               6.8.0-51-generic
  Образ ОС:                  Ubuntu 24.04.1 LTS
  Операционная система:      linux
  Архитектура:               amd64
  Versия среды контейнеров:  containerd://1.7.12
  Версия kubelet:            v1.32.0
  Версия kube-прокси:        v1.32.0
ПодCIDR:                      172.16.4.0/24
ПодCIDRs:                     172.16.4.0/24
Запущенные поды: (всего 5)
  Пространство имен           Имя                                   Запросы ЦПУ  Лимиты ЦПУ  Запросы памяти  Лимиты памяти  Возраст
  ---------                   ----                                   ------------  ----------  ---------------  -------------  ---
  kube-система                 etcd-cdak8ctr001                       100m (4%)     0 (0%)      100Mi (0%)       0 (0%)         15m
  kube-система                 kube-apiserver-cdak8ctr001             250m (10%)    0 (0%)      0 (0%)           0 (0%)         15m
  kube-система                 kube-controller-manager-cdak8ctr001    200m (8%)     0 (0%)      0 (0%)           0 (0%)         15m
  kube-система                 kube-прокси-dfpbj                      0 (0%)        0 (0%)      0 (0%)           0 (0%)         15m
  kube-система                 kube-планировщик-cdak8ctr001           100m (4%)     0 (0%)      0 (0%)           0 (0%)         15m
Распределенные ресурсы:
  (Общие лимиты могут превышать 100 процентов, т.е. превышены.)
  Ресурс           Запросы    Лимиты
  --------           --------    ------
  cpu                650m (26%)  0 (0%)
  память             100Mi (0%)  0 (0%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
События:
  Тип     Причина                        Возраст                От              Сообщение
  ----     ------                        ----                ----             -------
  Нормально Начало                      15m                 kube-прокси
  Нормально Начало                      15m                 kubelet          Запуск kubelet.
  Предупреждение Неверная емкость диска  15m                 kubelet          Неверная емкость 0 на файловой системе изображений
  Нормально Ограничения узла установлены 15m                 kubelet          Обновлены лимиты на в системном зарезервированном cgroup /system.slice
  Нормально Ограничения узла установлены 15m                 kubelet          Обновлено Общее распределяемое количество узла
  Нормально Ограничения узла установлены 15m                 kubelet          Обновлены лимиты на kube зарезервированном cgroup /kubepods.slice
  Нормально Узел имеет недостаточную память  15m (x2 за последние 15m)   kubelet          Статус узла cdak8ctr001 теперь: Узел имеет недостаточную память
  Нормально Узел не имеет дискового давления 15m                 kubelet          Статус узла cdak8ctr001 теперь: Узел не имеет дискового давления
  Нормально Узел имеет достаточный PID    15m                 kubelet          Статус узла cdak8ctr001 теперь: Узел имеет достаточный PID
  Нормально Узел зарегистрирован          15m                 node-controller  Событие узла cdak8ctr001: Узел cdak8ctr001 зарегистрирован в Контроллере
  Предупреждение Порог высвобождения достигнут 34s (x91 за последние 15m)  kubelet          Попытка освободить память

Конфигурация Kubelet:

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
#
# Защита хоста K8s от исчерпания ресурсов и возможной паники ядра
# общие ресурсы хоста - (systemReserved + kubeReserved) = распределяемые ресурсы
systemReserved:                             # Зарезервированные ресурсы для процессов ОС
  cpu: "1000m"
  memory: "1024Mi"
  ephemeral-storage: "1Gi"
systemReservedCgroup: "/system.slice"       # группа процессов для ОС (systemd-cgtop --recursive=true)
kubeReserved:                               # Зарезервированные ресурсы для компонентов системы K8s
  cpu: "500m"
  memory: "512Mi"
  ephemeral-storage: "1Gi"
kubeReservedCgroup: "/kubepods.slice"       # группа для процессов компонентов K8s (systemd-cgtop --recursive=true)
enforceNodeAllocatable:                     # Обеспечение соблюдения распределяемых на узле
  - "system-reserved"
  - "kube-reserved"
  - "pods"
evictionPressureTransitionPeriod: "120s"    # Подождите X время перед сменой состояния давления
evictionSoft:                               # Попытка вытеснения подов, как только их комбинированный период будет достигнут
  memory.available: "350Mi"                 # Если 

top:

top - 19:41:41 up  1:26,  6 пользователей,  средняя загрузка: 0,20, 0,29, 0,32
Задачи: 296 всего, 1 работающий, 295 спящих, 0 остановленных, 0 зомби
%ЦПУ: 3.8 us, 4.3 sy, 0.0 ni, 91.3 id, 0.5 wa, 0.0 hi, 0.1 si, 0.0 st
Память: 11961.4 всего, 10526.1 свободно, 917.8 занято, 773.4 кэш буфер
Swap: 0.0 всего, 0.0 свободно, 0.0 занято. 11043.6 доступная память

cgtop:

CGroup                                                                                                 Задачи   %ЦПУ   Память  Вход/s Выход/s
/                                                                                                      427   20.7   955.9M       0Б    53.5K
kubepods.slice                                                                                         46   11.7   511.3M       0Б    53.5K
kubepods.slice/kubepods-burstable.slice                                                                39   11.7   444.9M       0Б    53.5K
kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod498cc749c2c8c4a654b8c10c35d868be.slice   11    5.1   227.7M        -        -
system.slice                                                                                           127    3.4   843.2M        -        -

Ссылки:

Ответ или решение

Введение в управление ресурсами узлов Kubernetes версии 1.32, особенно настройки для защиты хостов через параметры systemReserved и kubeReserved, решает проблемы истощения ресурсов, которые могут привести к нестабильности кластера. Данная ситуация особенно актуальна в вашей среде: Ubuntu 24.04.1 с 4 vCPU и 12 GiB оперативной памяти, где возникла непредвиденная активация триггера memoryPressure сразу после инициализации узла управления.

Теория

Цель резервирования ресурсов: systemReserved и kubeReserved предназначены для обеспечения достаточных ресурсов операционной системы и компонентов Kubernetes соответственно. Это помогает предотвратить ситуации, когда нехватка ресурсов может нарушить стабильность работы кластера.

  • systemReserved: резервы для системных процессов ОС. В вашем конфиге это 1000m CPU, 1024Mi памяти и 1Gi диск.
  • kubeReserved: резервы для компонентов Kubernetes (таких как kube-apiserver, kube-scheduler). Вы задали 500m CPU, 512Mi памяти и 1Gi диск.

Эти параметры снижают риск остающихся нереализованными критических системных и кластерных процессов, однако сама корректировка может привести к неожиданным последствиям.

Пример

Ваши текущее конфигурации показывают значительное количество свободной памяти (более 10 GiB), но, тем не менее, триджер memoryPressure остается активным. Узел сообщает условие недостаточности памяти, несмотря на достаточный физический объем.

Конфигурация kubelet демонстрирует, что для параметров evictionHard задано значение memory.available в 200Mi, что может спровоцировать преждевременные эвакуации, даже при наличии физически свободной памяти, поскольку некоторые участки памяти могут быть зарезервированы в рамках системных cgroup.

Применение

  • Анализ cgroup: Просмотр содержимого и использование памяти для cgroups может дать представление о том, какие процессы используют больше всего ресурсов и могут вызвать давление на память.

  • Настройка evictionSoft и evictionHard: Подумайте над увеличением значений порогов, которые могут быть слишком агрессивными для вашего оборудования. Это предотвратит ошибочные срабатывания механизма эвакуации.

  • Проверка лимитов и запросов: Убедитесь, что задаваемые лимиты и запросы (например, для компонентов контроллера и апи-сервера) соотносятся с доступным объемом памяти и не приводят к возникновению конфликтных ситуаций.

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

Оцените материал
Добавить комментарий

Капча загружается...