Поделиться через


Настройка конфигурации узла для пулов узлов Службы Azure Kubernetes (AKS)

Настройка конфигурации узла позволяет настраивать параметры операционной системы или параметры kubelet в соответствии с потребностями рабочих нагрузок. При создании кластера AKS или добавлении пула узлов в кластер можно настроить подмножество часто используемых параметров ОС и kubelet. Чтобы настроить параметры за пределами этого подмножества, можно использовать демон-сет для настройки необходимых конфигураций без потери поддержки AKS для узлов.

Создание пользовательских файлов конфигурации узлов для пулов узлов AKS

Изменения конфигурации ОС и kubelet требуют создания нового файла конфигурации с параметрами и вашими желаемыми настройками. Если значение параметра не задано, то значение по умолчанию устанавливается.

Примечание.

В следующих примерах показаны распространенные параметры конфигурации. Параметры можно изменить в соответствии с требованиями рабочей нагрузки. Полный список поддерживаемых настраиваемых параметров конфигурации см. в разделе "Поддерживаемые настраиваемые параметры конфигурации ".

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

Создайте файл linuxkubeletconfig.json со следующим содержимым.

{
 "cpuManagerPolicy": "static",
 "cpuCfsQuota": true,
 "cpuCfsQuotaPeriod": "200ms",
 "imageGcHighThreshold": 90,
 "imageGcLowThreshold": 70,
 "topologyManagerPolicy": "best-effort",
 "allowedUnsafeSysctls": [
  "kernel.msg*",
  "net.*"
],
 "failSwapOn": false
}

Конфигурация ОС

Создайте файл linuxosconfig.json со следующим содержимым.

{
 "transparentHugePageEnabled": "madvise",
 "transparentHugePageDefrag": "defer+madvise",
 "swapFileSizeMB": 1500,
 "sysctls": {
  "netCoreSomaxconn": 163849,
  "netIpv4TcpTwReuse": true,
  "netIpv4IpLocalPortRange": "32000 60000"
 }
}

Создание кластера AKS с помощью пользовательских файлов конфигурации

Примечание.

При создании нового кластера AKS следует учитывать следующие сведения при использовании пользовательских файлов конфигурации:

  • Если при создании кластера указать конфигурацию, конфигурация применяется только к узлам в начальном пуле узлов. Все параметры, не настроенные в JSON-файле, сохраняют значения по умолчанию.
  • CustomLinuxOsConfig не поддерживается для типа ОС Windows.

Создайте новый кластер, используя пользовательские файлы конфигурации и команду az aks create, и укажите ваши файлы конфигурации для параметров --kubelet-config и --linux-os-config. В следующем примере команды создается новый кластер с пользовательскими ./linuxkubeletconfig.json и ./linuxosconfig.json файлами:

az aks create --name <cluster-name> --resource-group <resource-group-name> --kubelet-config ./linuxkubeletconfig.json --linux-os-config ./linuxosconfig.json

Добавление пула узлов с помощью пользовательских файлов конфигурации

Примечание.

При использовании пользовательских файлов конфигурации при добавлении нового пула узлов в существующий кластер AKS следует учитывать следующие сведения:

  • При добавлении пула узлов Linux в существующий кластер можно указать конфигурацию kubelet, конфигурацию ОС или оба. При добавлении пула узлов Windows в существующий кластер можно указать только конфигурацию kubelet. Если при добавлении пула узлов указать конфигурацию, конфигурация применяется только к узлам в новом пуле узлов. Все параметры, не настроенные в JSON-файле, сохраняют значения по умолчанию.
  • CustomKubeletConfig поддерживается для пулов узлов Linux и Windows.

Создайте новый пул узлов Linux с помощью команды az aks nodepool add, указав файлы конфигурации для параметров --kubelet-config и --linux-os-config. Следующая команда создает новый пул Linux-узлов с кастомизированным файлом ./linuxkubeletconfig.json.

az aks nodepool add --name <node-pool-name> --cluster-name <cluster-name> --resource-group <resource-group-name> --kubelet-config ./linuxkubeletconfig.json

Были применены параметры подтверждения

После применения настраиваемой конфигурации узла можно подтвердить применение параметров к узлам, подключившись к узлу и убедившись sysctl , что изменения конфигурации были внесены в файловую систему.

Поддерживаемые настраиваемые параметры конфигурации

Настраиваемая конфигурация kubelet для Linux

Параметр Допустимые значения или интервал По умолчанию. Описание
cpuManagerPolicy нет, статический ничего Статическая политика позволяет контейнерам в гарантированных модулях с целочисленными запросами ЦП получить доступ к эксклюзивным ЦП на узле.
cpuCfsQuota истина, ложь true Включение и отключение применения квот ЦП CFS для контейнеров, определяющих ограничения ЦП.
cpuCfsQuotaPeriod Интервал в миллисекундах (мс) 100ms Задает значение периода квоты CFS для центрального процессора.
imageGcHighThreshold 0–100 85 Процент использования дискового пространства, после достижения которого всегда выполняется очистка ненужных данных образов. Минимальное использование диска, которое активирует сборку мусора. Для отключения автоматического удаления изображений установите 100.
imageGcLowThreshold 0–100, не больше imageGcHighThreshold 80 Процент дискового пространства, до достижения которого сборка ненужных образов никогда не выполняется. Минимальное заполнение диска, которое может активировать сборку мусора.
topologyManagerPolicy отсутствует, прилагается максимум усилий, ограниченный, один узел NUMA ничего Оптимизация согласования узлов NUMA. Дополнительные сведения см. в разделе "Политики управления топологией" на узле.
allowedUnsafeSysctls kernel.shm*, , kernel.msg*kernel.sem, fs.mqueue.*net.* нет Разрешенный список ненадежных sysctls или ненадежных шаблонов sysctls.
containerLogMaxSizeMB Размер в мегабайтах (МБ) 50 Максимальный размер (например, 10 МБ) файла журнала контейнера перед ротацией.
containerLogMaxFiles ≥ 2 5 Максимальное количество файлов журнала контейнера, которое может присутствовать для контейнера.
podMaxPids — от -1 до предела PID ядра -1 (∞) Максимальное количество идентификаторов процессов, которые могут выполняться в Pod.
seccompDefault Unconfined, RuntimeDefault Unconfined Задает профиль seccomp по умолчанию для всех рабочих нагрузок. RuntimeDefault использует профиль seccomp по умолчанию контейнера, ограничивающий определенные системные вызовы для повышения безопасности. Сбой в работе ограниченных системных вызовов. Unconfined не устанавливает ограничений на системные вызовы, разрешая все системные вызовы и снижая безопасность. Дополнительные сведения см. в профиле seccomp по умолчанию для контейнеров. Этот параметр находится в предварительной версии. Зарегистрируйте флаг компонента KubeletDefaultSeccompProfilePreview с помощью az feature register команды --namespace "Microsoft.ContainerService".

Конфигурация Windows kubelet по умолчанию

Параметр Допустимые значения или интервал По умолчанию. Описание
imageGcHighThreshold 0–100 85 Процент использования дискового пространства, после достижения которого всегда выполняется очистка ненужных данных образов. Минимальное использование диска, которое активирует сборку мусора. Для отключения автоматического удаления изображений установите 100.
imageGcLowThreshold 0–100, не больше imageGcHighThreshold 80 Процент дискового пространства, до достижения которого сборка ненужных образов никогда не выполняется. Минимальное заполнение диска, которое может активировать сборку мусора.
containerLogMaxSizeMB Размер в мегабайтах (МБ) 10 Максимальный размер (например, 10 МБ) файла журнала контейнера перед ротацией.
containerLogMaxFiles ≥ 2 5 Максимальное количество файлов журнала контейнера, которое может присутствовать для контейнера.

Параметры конфигурации пользовательской ОС Linux

Внимание

Чтобы упростить поиск и удобочитаемость, параметры ОС отображаются в этой статье по их имени, но их следует добавить в JSON-файл конфигурации или API AKS с помощью соглашения о написании в формате camelCase.

Например, если изменить vm.max_map_count setting, необходимо переформатировать файл JSON конфигурации как vmMaxMapCount.

Ограничения дескриптора файлов Linux

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

В следующей таблице перечислены ограничения дескриптора файлов, которые можно настроить для каждого пула узлов:

Настройка Допустимые значения или интервал По умолчанию Ubuntu 22.04 По умолчанию Ubuntu 24.04 Azure Linux 3.0 по умолчанию Описание
fs.file-max 8192 - 9223372036854775807 9223372036854775807 9223372036854775807 9223372036854775807 Максимальное количество файловых дескрипторов, которые выделяет ядро Linux. Это значение имеет максимально возможное значение (2^63-1), чтобы предотвратить исчерпание дескриптора файлов и обеспечить неограниченные системные дескрипторы файлов для контейнерных рабочих нагрузок.
fs.inotify.max_user_watches 781250–2097152 1048576 1048576 1048576 Максимальное количество наблюдений за файлами, разрешенное системой. Каждое контрольное значение занимает примерно 90 байт на 32-разрядном ядре и примерно 160 байт на 64-разрядном ядре.
fs.aio-max-nr 65536–6553500 65536 65536 65536 Значение aio-nr показывает текущее количество асинхронных запросов на ввод-вывод в системе. Значение aio-max-nr определяет максимальное значение, до которого может увеличиться aio-nr.
fs.nr_open 8192–20000500 1048576 1048576 1073741816 Максимальное число дескрипторов файлов, которые может выделить процесс.

Примечание.

Параметр fs.file-max имеет значение 9223372036854775807 (максимальное значение для подписанного 64-разрядного целого числа) в Ubuntu и Azure Linux на основе вышестоящих значений по умолчанию. Эта конфигурация:

  • Предотвращает атаки типа "отказ в обслуживании ", основанные на исчерпании дескрипторов на уровне системы.
  • Гарантирует, что рабочие нагрузки контейнеров никогда не перегружены ограничениями на количество дескрипторов файлов на уровне системы.
  • Обеспечивает безопасность с помощью ограничений для каждого процесса (fs.nr_open и ulimit), которые по-прежнему применяются к отдельным процессам.
  • Оптимизирует для платформ контейнеров, где многие контейнеры могут выполняться одновременно, и каждый из них потенциально может открыть множество файлов и сетевых подключений.

Настройка сокета Linux и сети

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

Настройка Допустимые значения или интервал По умолчанию Ubuntu 22.04 По умолчанию Ubuntu 24.04 Azure Linux 3.0 по умолчанию Описание
net.core.somaxconn 4096–3240000 16384 16384 16384 Максимальное количество запросов на подключение, которые могут быть поставлены в очередь для любого заданного слушающего сокета. Верхний предел значения параметра невыполненной работы, передаваемого в функцию listen(2). Если аргумент невыполненной работы больше somaxconn, то он усекается до этого предела без уведомления.
net.core.netdev_max_backlog 1000–3240000 1000 1000 1000 Максимальное количество пакетов, поставленных в очередь на стороне ввода, когда интерфейс получает пакеты быстрее, чем ядро может их обработать.
net.core.rmem_max 212992–134217728 1048576 1048576 212992 Максимальный размер буфера сокета приема в байтах.
net.core.wmem_max 212992–134217728 212992 212992 212992 Максимальный размер буфера сокета отправки в байтах.
net.core.optmem_max 20480–4194304 20480 131072 20480 Максимальный размер вспомогательного буфера (буфера памяти параметров) для каждого сокета. Память параметров сокета используется в некоторых случаях для хранения дополнительных структур, относящихся к использованию сокета.
net.ipv4.tcp_max_syn_backlog 128–3240000 16384 16384 16384 Максимальное количество запросов на подключение в очереди, которые не получили подтверждение от подключающегося клиента. Если это число превышено, ядро начинает удаление запросов.
net.ipv4.tcp_max_tw_buckets 8000–1440000 262144 262144 131072 Максимальное число сокетов timewait, поддерживаемых системой одновременно. Если это число превышено, сокет TIME-WAIT немедленно уничтожается и выводится предупреждающее сообщение.
net.ipv4.tcp_fin_timeout 5–120 60 60 60 Время, в течение которого осиротевшее соединение (более не используемое ни одним приложением) остается в состоянии FIN_WAIT_2, прежде чем оно будет прервано на локальной стороне.
net.ipv4.tcp_keepalive_time 30–432000 7200 7200 7200 Частота отправки сообщений keepalive протоколом TCP, если включена функция keepalive.
net.ipv4.tcp_keepalive_probes 1–15 9 9 9 Число проб keepalive, отправляемых протоколом TCP, пока он не определит, что подключение разорвано.
net.ipv4.tcp_keepalive_intvl 10 - 90 75 75 75 Частота отправки проб. Если умножить это значение на tcp_keepalive_probes, получится время завершения подключения, которое не отвечает, после запуска проб.
net.ipv4.tcp_tw_reuse 2 2 2 Разрешение повторно использовать сокеты TIME-WAIT для новых подключений, если они безопасны с точки зрения протокола.
net.ipv4.ip_local_port_range Первое: 1024 - 60999 и Последний: 32768 - 65535] Первый: 32768, последний: 60999 Первый: 32768, последний: 60999 Первый: 32768, последний: 60999 Диапазон локальных портов, используемых для выбора локального порта при передаче трафика TCP и UDP. Состоит из двух чисел: первое число — это первый локальный порт, разрешенный для трафика TCP и UDP на узле агента, а второе число — номер последнего локального порта.
net.ipv4.neigh.default.gc_thresh1 128–80000 4096 4096 4096 Минимальное количество записей, которые могут находиться в кэше ARP. Сборка мусора не активируется, если количество записей ниже этого параметра.
net.ipv4.neigh.default.gc_thresh2 512–90000 8192 8192 8192 Максимальное мягкое количество записей, которые могут находиться в ARP кэше. Этот параметр, возможно, является наиболее важным, так как сборка мусора ARP инициируется примерно через 5 секунд после достижения этого мягкого предела.
net.ipv4.neigh.default.gc_thresh3 1024–100000 16384 16384 16384 Строгое максимальное количество записей в кэше ARP.
net.netfilter.nf_conntrack_max 131072 - 2097152 Динамическое вычисление Динамическое вычисление Динамическое вычисление nf_conntrack — это модуль, отслеживающий записи подключения для NAT в Linux. Модуль nf_conntrack использует хэш-таблицу для сохранения записи установленного подключения протокола TCP. nf_conntrack_max — максимальное количество узлов в хэш-таблице, то есть максимальное число подключений, поддерживаемое модулем nf_conntrack, или размер таблицы отслеживания подключений. Значение по умолчанию динамически вычисляется на основе системной памяти с помощью формулы: RAM_in_bytes / 16384 (или RAM_in_MB * 64). Например, виртуальная машина с 8 ГБ ОЗУ имеет примерно 524 288 подключений. Фактические значения зависят от размера виртуальной машины и доступной памяти.
net.netfilter.nf_conntrack_buckets 65536 - 524288 Динамическое вычисление Динамическое вычисление Динамическое вычисление nf_conntrack — это модуль, отслеживающий записи подключения для NAT в Linux. Модуль nf_conntrack использует хэш-таблицу для сохранения записи установленного подключения протокола TCP. nf_conntrack_buckets — размер хэш-таблицы. Значение по умолчанию динамически вычисляется на основе системной памяти с помощью формулы: RAM_in_bytes / 16384с не менее чем 1024 контейнерами и максимум 262 144 контейнерами. По умолчанию nf_conntrack_max обычно установлено на nf_conntrack_buckets * 4. Фактические значения зависят от размера виртуальной машины и доступной памяти.

Ограничения рабочей роли Linux

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

Настройка По умолчанию Ubuntu 22.04 По умолчанию Ubuntu 24.04 Azure Linux 3.0 по умолчанию Описание
kernel.threads-max Динамическое вычисление Динамическое вычисление Динамическое вычисление Процессы могут запускать рабочие потоки. Максимальное число создаваемых потоков задается параметром ядра kernel.threads-max. Значение по умолчанию вычисляется динамически на основе системной памяти с помощью формулы( total_ram_pages / 4 где каждая страница обычно составляет 4 КБ). Фактические значения зависят от размера виртуальной машины и доступной памяти.

Виртуальная память Linux

В следующей таблице перечислены параметры ядра, которые можно настроить для каждого пула узлов, чтобы оптимизировать работу подсистемы виртуальной памяти (VM) ядра Linux и writeout переноса грязных данных на диск:

Настройка Допустимые значения или интервал По умолчанию Ubuntu 22.04 По умолчанию Ubuntu 24.04 Azure Linux 3.0 по умолчанию Описание
vm.max_map_count 65530 1048576 1048576 Этот файл содержит максимальное количество областей карты памяти, которые может иметь процесс. Области таблицы распределения памяти используются как следствие вызова malloc непосредственно функциями mmap, mprotect и madvise, а также при загрузке общих библиотек.
vm.vfs_cache_pressure 1 - 100 100 100 100 Это процентное значение управляет тенденцией освобождения ядром памяти, которая используется для кэширования объектов directory и inode.
vm.swappiness 0–100 60 60 60 Этот элемент управления используется для определения того, насколько агрессивно ядро переключает страницы памяти. Более высокие значения повышают агрессивность, более низкие значения уменьшают объем обмена. Значение 0 указывает ядру не начинать своп, пока количество свободных и сохраненных в файл страниц не будет меньше порога в зоне.
swapFileSizeMB 1 МБ — размер временного диска (/dev/sdb) нет нет нет SwapFileSizeMB указывает размер в МБ файла буфера, который необходимо создать на узлах агента из этого пула узлов.
transparentHugePageEnabled always madvise never always always madvise Прозрачные огромные страницы — это функция ядра Linux, предназначенная для повышения производительности благодаря более эффективному использованию аппаратного обеспечения для сопоставления памяти вашего процессора. Если включено, ядро пытается выделить hugepages всякий раз, когда возможно, и любой процесс Linux получает страницы размером 2 МБ, если регион размером 2 МБ имеет естественное выравнивание. В некоторых случаях, когда hugepages включены по всей системе, приложения могут в конечном итоге выделять больше ресурсов памяти. Приложение может mmap выделять большой регион, но использовать только 1 байт из него; в таком случае страница размером 2 МБ может быть выделена вместо страницы размером 4 КБ без серьезной необходимости. В этом сценарии можно отключить функцию hugepages для всей системы или использовать ее только в регионах MADV_HUGEPAGE madvise.
transparentHugePageDefrag always, , deferdefer+madvise, madvisenever madvise madvise madvise Это значение определяет, должно ли ядро агрессивно применять сжатие памяти для повышения доступности hugepages.