Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Защита узлов — это функция, включаемая по желанию, для пулов узлов Linux, которая защищает стабильность узлов, когда рабочие нагрузки создают нагрузку на узлы по ЦП, памяти или диску. При включении защиты узлов в кластере AKS изменяется то, как каждый узел резервирует ресурсы и обеспечивает соблюдение ограничений ресурсов для компонентов Kubernetes и служб хоста, а также то, как kubelet вытесняет поды при нехватке ресурсов.
В этой статье объясняется, какие изменения вносит усиление защиты узлов, сравниваются усиленные параметры по умолчанию со стандартными параметрами AKS, а также показывается, как включить, проверить, настроить и отключить эту функцию.
Important
Предварительные версии функций AKS доступны на условиях самообслуживания и по выбору пользователя. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:
Преимущества укрепления безопасности узлов
На загруженных узлах или узлах с пиковыми нагрузками рабочие нагрузки могут использовать ресурсы, необходимые kubelet, среде выполнения контейнера и службам узла. В этом случае узлы могут не отвечать, сообщать о состоянии NotReady или внезапно завершать pod. Усиление защиты узлов снижает эти риски следующими способами:
-
Принудительное резервирование: По умолчанию AKS использует значения kube-reserved только для вычисления того, какой объем ресурсов планировщик может выделить подам. С помощью Node Hardening kubelet также применяет ресурсы, зарезервированные для kube, и системные ресурсы с помощью групп управления Linux (cgroups). Kubelet и containerd работают в выделенной
kubereserved.slicecgroup, поэтому они сохраняют зарезервированную долю CPU и память, даже если поды полностью загружают узел. -
Выделенная емкость для служб хоста: Укрепление узла добавляет зарезервированное системой выделение для служб операционной системы узла, которые выполняются на хосте
system.slice. - Больший запас памяти: Порог жесткого вытеснения для доступной памяти зависит от объема памяти узла, поэтому kubelet вытесняет поды, прежде чем на узле останется критически мало памяти.
- Корректное вытеснение: Мягкие пороги вытеснения позволяют kubelet корректно вытеснять поды с периодом отсрочки завершения, когда остается мало памяти или места на диске. Жесткое выселение, которое немедленно завершает pod'ы, а затем выступает в качестве последнего средства.
- Резервирования, масштабируемые с плотностью pod’ов: Вычисление памяти, зарезервированной для kube, увеличивается с максимальным числом pod’ов на узел, что учитывает накладные расходы kubelet и containerd при запуске большего числа pod’ов.
Что изменится при включении защиты узлов
В следующих таблицах сравниваются стандартные значения по умолчанию для узлов Linux под управлением Kubernetes 1.29 или более поздней версии со значениями по умолчанию, которые AKS применяет при включении защиты узлов.
Резервирование ресурсов
| Setting | Без усиления защиты узлов | С усилением защиты узлов |
|---|---|---|
| CPU, зарезервированный для Kube | На основе количества ядер ЦП. Дополнительные сведения см. в разделе резервирования ЦП. | Без изменений |
| память, зарезервированная для Kube |
min(20 × maxPods + 50, 25% of node memory) MiB |
min(35 × maxPods + max(250, 2% of node memory), 25% of node memory) MiB |
| Идентификаторы процессов (PID), зарезервированные Kube | 1000 |
Не зарезервировано |
| Зарезервированная системой ЦП | None | 100m |
| Зарезервированная системой память | None | 200 MiB, а также 100 МиБ за каждые полные 32 ГиБ памяти узла, а также 100 МиБ для кластеров, использующих Azure CNI |
| Зарезервированное системой эфемерное хранилище | None | 1Gi |
Пороговые значения выселения
| Setting | Без усиления защиты узлов | С усиленной защитой узлов |
|---|---|---|
Жесткое вытеснение: memory.available |
100Mi |
250Mi для узлов с 8 ГиБ памяти или меньше, 375Mi для узлов с более чем 8 ГиБ и менее чем 32 ГиБ, а 512Mi также для узлов с 32 ГиБ или более |
Жесткое вытеснение: nodefs.available и nodefs.inodesFree |
10% и 5%. |
Без изменений |
Жесткое вытеснение: pid.available |
2000 |
Не установлено |
Мягкое вытеснение: memory.available |
None |
500Mi, 750Miили 1Gi, используя те же уровни памяти узла, что и жесткое вытеснение, с 30-секундным периодом отсрочки |
Обратимое вытеснение: nodefs.available и nodefs.inodesFree |
None |
12% и 7%, оба с 2-минутным льготным периодом |
| Максимальный льготный период завершения pod во время мягкого вытеснения | Не установлено | 60 секунд |
Принудительное применение ограничений cgroup
| Setting | Без укрепления узлов | С усиленной защитой узлов |
|---|---|---|
| Принудительно заданные доступные для выделения ресурсы узла | pods |
pods, kube-reserved и system-reserved |
| Kubelet и containerd cgroup |
system.slice, без ограничений |
kubereserved.slice, с памятью, ограниченной зарезервированной памятью kube, и долей ЦП, пропорциональной зарезервированному ЦП kube |
| cgroup служб хоста |
system.slice, без ограничений |
system.slice, с памятью, ограниченной памятью, зарезервированной системой, и долей ЦП, пропорциональной ЦП, зарезервированной системой |
Поскольку Node Hardening резервирует большую емкость, узлы сообщают о меньшей доступной емкости для подов. Например, на узле с 4 виртуальными ЦП и 16 ГиБ памяти, использующем Azure CNI, включение усиления защиты узла уменьшает доступную емкость следующим образом:
- При максимуме по умолчанию в 250 pod'ов на узел потребляется около 570 МиБ памяти, 100 милликоров ЦП и 1 ГиБ эфемерного хранилища.
- При максимуме 30 подов на узел — около 1,3 ГиБ памяти, 100 милликоров ЦП и 1 ГиБ эфемерного хранилища.
Пороги мягкого вытеснения не сокращают емкость, доступную для выделения. Они изменяются только после того, как kubelet начинает вытеснять поды.
Considerations
Перед включением Node Hardening следует учитывать следующие рекомендации.
- Вы включаете Node Hardening на уровне кластера, и он применяется ко всем пулам узлов Linux в кластере. Вы не можете включить его для отдельных пулов узлов, и это не влияет на пулы узлов Windows.
- Узлы сообщают о меньшей доступной емкости, поэтому поды, которые помещались на узле до включения защиты узлов, могут больше не помещаться после этого. Просмотрите запросы ресурсов pod и размеры пула узлов.
- Службы узла в
system.sliceимеют общий жесткий предел памяти, равный объему памяти, зарезервированному системой. Если вы запускаете собственные агенты на узлах в качестве системных служб systemd, например, агентов безопасности, мониторинга или пересылки журналов, эти агенты засчитываются в этот лимит. Проверьте использование памяти и стабильность Node Hardening перед его использованием в рабочей среде. - Значения, заданные в настраиваемой конфигурации kubelet пула узлов, переопределяют соответствующие значения по умолчанию Node Hardening. Дополнительные сведения см. в разделе Настройка параметров защиты узлов.
- При отключении защиты узлов в дальнейшем существующие пулы узлов сохраняют защищенные параметры мягкого вытеснения, даже после повторного создания образа узлов. Чтобы удалить эти параметры, необходимо создать пулы узлов. Дополнительные сведения см. в разделе Отключение защиты узлов.
- Значения по умолчанию могут изменяться, пока функция находится в предварительной версии. Начните с непроизводственного кластера и проверьте рабочие нагрузки в условиях типичного дефицита ресурсов узла.
Prerequisites
- Подписка на Azure. Если ее нет, создайте бесплатную учетную запись.
- Кластер AKS с пулами узлов Linux или разрешения на его создание.
-
aks-previewрасширение Azure CLI иCustomNodeConfigPreviewфлаг функции, описанные в следующих разделах.
Установите расширение aks-preview Azure CLI
aks-previewУстановите расширение с помощьюaz extension addкоманды.az extension add --name aks-previewОбновите до последней версии расширения с помощью команды
az extension update.az extension update --name aks-preview
Регистрация флага компонента CustomNodeConfigPreview
CustomNodeConfigPreviewЗарегистрируйте флаг компонента с помощьюaz feature registerкоманды.az feature register --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"Через несколько минут отобразится состояние Registered (Зарегистрировано).
Проверьте состояние регистрации с помощью
az feature showкоманды.az feature show --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"Когда отображается состояние Зарегистрирован, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью команды
az provider register.az provider register --namespace "Microsoft.ContainerService"
Включить защиту узлов
На этапе предварительной версии Node Hardening не включен по умолчанию.
Включение защиты узлов в новом кластере
Создайте кластер с включенной защитой узла с помощью команды az aks create с параметром --enable-node-hardening.
Для этой команды требуются расширение aks-preview и флаг функции CustomNodeConfigPreview. Дополнительные сведения см. в разделе Необходимые условия.
az aks create \
--resource-group <resource-group-name> \
--name <cluster-name> \
--enable-node-hardening \
--generate-ssh-keys
Чтобы подтвердить изменение, см. раздел Проверка параметров защиты узла.
Включите защиту узлов в существующем кластере
Включите усиление защиты узлов в существующем кластере с помощью команды az aks update с параметром --enable-node-hardening.
Для этой команды требуется расширение aks-preview и флаг функции CustomNodeConfigPreview. Дополнительные сведения см. в разделе Необходимые условия.
az aks update \
--resource-group <resource-group-name> \
--name <cluster-name> \
--enable-node-hardening
Чтобы подтвердить изменение, см. раздел Проверка параметров защиты узла.
Проверьте параметры усиления защиты узлов
Получите учетные данные для кластера с помощью
az aks get-credentialsкоманды.az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>Просмотрите действующие параметры резервирования kubelet и выселения на узле, запросив конечную точку конфигурации kubelet.
kubectl get --raw "/api/v1/nodes/<node-name>/proxy/configz" | jq '.kubeletconfig | {kubeReserved, systemReserved, evictionHard, evictionSoft, evictionSoftGracePeriod, evictionMaxPodGracePeriod, enforceNodeAllocatable}'На защищённом узле
systemReservedиevictionSoftсодержат значения, аkube-reservedвключаетenforceNodeAllocatableиsystem-reserved.Сравните вместимость узла с его распределяемыми ресурсами.
kubectl get node <node-name> -o jsonpath='{.status.capacity}{"\n"}{.status.allocatable}{"\n"}'На защищенном узле ресурсы ЦП, памяти и эфемерного хранилища, доступные для выделения, ниже емкости. Разница равна значениям kube-reserved и system-reserved в Резервировании ресурсов, а также жёстким порогам вытеснения в Порогах вытеснения. Например, на узле с 4 виртуальными ЦП и 16 ГиБ памяти, использующем Azure CNI, доступный для выделения ЦП на 240 миллиядер меньше, чем емкость: 140 миллиядер ЦП, зарезервированного для kube, и 100 миллиядер системно зарезервированного ЦП.
Настроить параметры усиления защиты узлов
Вы можете переопределить параметры kube-reserved и параметры eviction по умолчанию для пула узлов Linux с помощью настраиваемой конфигурации kubelet. Для этих параметров требуется флаг функции CustomNodeConfigPreview. Их можно использовать независимо от того, включен ли Node Hardening в кластере. AKS управляет системными зарезервированными значениями и принудительным применением cgroup, и их невозможно настроить.
Каждый параметр переопределяет строку в таблицах резервирования ресурсов или пороговых значений вытеснения . Зарезервированные строки Kube соответствуют kubeReserved параметрам. Строки принудительного удаления соответствуют параметрам hardEvictionThreshold. Строки мягкого вытеснения соответствуют параметрам softEvictionThreshold и softEvictionGracePeriod. Максимальный льготный период перед принудительным завершением pod соответствует evictionMaxPodGracePeriodInSeconds.
Можно настроить следующие параметры.
| Setting | Overrides | Description |
|---|---|---|
kubeReserved.cpuMillicores |
ЦП, зарезервированный для Kube | ЦПУ, зарезервированный для системных демонов Kubernetes, в милликорах. |
kubeReserved.memoryMB |
Память, зарезервированная для Kube | Память, зарезервированная для системных демонов Kubernetes, в MiB. |
hardEvictionThreshold.memoryAvailable |
Жесткое вытеснение: memory.available |
Жесткий порог вытеснения для доступной памяти. |
hardEvictionThreshold.nodeFsAvailable |
Жесткое вытеснение: nodefs.available |
Порог жесткого вытеснения для доступного пространства файловой системы узла. |
hardEvictionThreshold.nodeFsInodesFree |
Жесткое вытеснение: nodefs.inodesFree |
Порог жесткого вытеснения для свободных inode файловой системы узла. |
softEvictionThreshold.memoryAvailable |
Мягкое вытеснение: memory.available |
Мягкий порог вытеснения доступной памяти. |
softEvictionThreshold.nodeFsAvailable |
Мягкое вытеснение: nodefs.available |
Мягкий порог вытеснения для доступного пространства файловой системы узла. |
softEvictionThreshold.nodeFsInodesFree |
Мягкое вытеснение: nodefs.inodesFree |
Порог обратимого вытеснения для свободных inode файловой системы узла. |
softEvictionGracePeriod.memoryAvailable |
Мягкое вытеснение: memory.available льготный период |
Как долго доступная память должна оставаться ниже её мягкого порога, прежде чем kubelet вытеснит поды. |
softEvictionGracePeriod.nodeFsAvailable |
Мягкое вытеснение: nodefs.available льготный период |
Как долго доступное пространство файловой системы узла должно оставаться ниже его мягкого порога до того, как kubelet вытеснит поды. |
softEvictionGracePeriod.nodeFsInodesFree |
Мягкое вытеснение: nodefs.inodesFree льготный период |
Как долго свободные inode файловой системы узла должны оставаться ниже своего мягкого порога, прежде чем kubelet вытеснит поды. |
evictionMaxPodGracePeriodInSeconds |
Максимальный льготный период завершения pod во время мягкого вытеснения | Максимальное количество секунд, в течение которых kubelet позволяет подам завершаться во время мягкого вытеснения. |
- Допустимые значения, минимумы и правила проверки для каждого параметра см. в разделе "Параметры конфигурации настраиваемого узла" для AKS.
- Для каждого сигнала вытеснения задайте оба: порог мягкого вытеснения и соответствующий льготный период, и убедитесь, что каждое пороговое значение мягкого вытеснения больше порога жесткого вытеснения для одного и того же сигнала.
Создайте файл конфигурации kubelet, например
nodehardening-kubelet.jsonс параметрами, которые требуется настроить. В следующем примере устанавливается каждое настраиваемое значение. Он задает kube-reserved: 200 милликор ЦП и 1024 МиБ памяти. Он задает пороговые значения жесткого вытеснения:512Miдоступной памяти,10%доступного пространства файловой системы и5%свободных inode. Он задает пороги мягкого вытеснения1Gi,12%и7%с льготными периодами в 30 секунд, 2 минуты и 2 минуты. Он также задает максимальный 60-секундный период ожидания перед принудительным завершением pod.{ "kubeReserved": { "cpuMillicores": 200, "memoryMB": 1024 }, "hardEvictionThreshold": { "memoryAvailable": "512Mi", "nodeFsAvailable": "10%", "nodeFsInodesFree": "5%" }, "softEvictionThreshold": { "memoryAvailable": "1Gi", "nodeFsAvailable": "12%", "nodeFsInodesFree": "7%" }, "softEvictionGracePeriod": { "memoryAvailable": "30s", "nodeFsAvailable": "2m", "nodeFsInodesFree": "2m" }, "evictionMaxPodGracePeriodInSeconds": 60 }Создайте пул узлов Linux, использующий файл конфигурации, с помощью команды
az aks nodepool addс параметром--kubelet-config.az aks nodepool add \ --resource-group <resource-group-name> \ --cluster-name <cluster-name> \ --name <node-pool-name> \ --kubelet-config ./nodehardening-kubelet.jsonВы также можете использовать
--kubelet-configпараметр сaz aks createкомандой, чтобы применить конфигурацию к начальному пулу узлов кластера.
Отключить укрепление узлов
Отключите усиление защиты узлов с помощью команды az aks update с параметром --disable-node-hardening.
Для этой команды требуется расширение aks-preview и флаг функции CustomNodeConfigPreview. Дополнительные сведения см. в разделе Необходимые условия.
az aks update \
--resource-group <resource-group-name> \
--name <cluster-name> \
--disable-node-hardening
Отключение функции Node Hardening отключает параметр уровня кластера, но не сразу изменяет существующие узлы. Существующие узлы сохраняют все защищенные параметры, пока они не будут повторно созданы из образа, например при обновлении образа узла. После повторной установки образа узла применяются следующие изменения:
- Возвращено к стандартным параметрам AKS: ресурсы, зарезервированные для kube, и системные ресурсы, пороги жесткого вытеснения и принудительное применение cgroup. Распределяемая емкость узла увеличивается соответствующим образом.
- Сохранено: Пороги мягкого вытеснения, льготные периоды мягкого вытеснения и максимальный льготный период завершения pod во время мягкого вытеснения.
Настраиваемую конфигурацию kubelet можно задать только при создании кластера или пула узлов, поэтому не удается удалить сохраненные параметры мягкого вытеснения из существующего пула узлов. Чтобы удалить их, создайте новый пул узлов, который явно сбрасывает их, переместите рабочие нагрузки в новый пул узлов и удалите старый пул узлов.
Создайте файл конфигурации kubelet, например
remove-soft-eviction.json. В следующем примере каждый порог мягкого вытеснения и период ожидания устанавливаются в пустую строку, которая отключает мягкое вытеснение для этого сигнала. Он также задает максимальный период ожидания завершения pod, равный0, что является стандартным значением по умолчанию AKS.{ "softEvictionThreshold": { "memoryAvailable": "", "nodeFsAvailable": "", "nodeFsInodesFree": "" }, "softEvictionGracePeriod": { "memoryAvailable": "", "nodeFsAvailable": "", "nodeFsInodesFree": "" }, "evictionMaxPodGracePeriodInSeconds": 0 }Создайте пул узлов Linux, использующий файл конфигурации, с помощью команды
az aks nodepool addс параметром--kubelet-config.az aks nodepool add \ --resource-group <resource-group-name> \ --cluster-name <cluster-name> \ --name <node-pool-name> \ --kubelet-config ./remove-soft-eviction.jsonПереместите рабочие нагрузки в новый пул узлов и удалите старый пул узлов. Дополнительные сведения см. в разделе "Изменение размера пулов узлов" в AKS.
Чтобы проверить параметры на узле, см. раздел Проверка параметров защиты узлов. На узлах в новом пуле узлов evictionSoft пуст.