Вопрос или проблема
Окружение:
- ОС: 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 - -
Ссылки:
- https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-MemoryReservation
- https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable
- https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/
- https://github.com/kubernetes/design-proposals-archive/blob/main/node/node-allocatable.md#recommended-cgroups-setup
Ответ или решение
Введение в управление ресурсами узлов 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.