Сценарии применения
По умолчанию kubelet использует CFS квоты для обеспечения ограничений pod CPU. Когда узел запускает множество pod CPU-bound, нагрузка может перемещаться между разными ядрами CPU в зависимости от того, ограничен ли pod и какие ядра CPU доступны во время планирования. Многие нагрузки не чувствительны к этой миграции и нормально работают без какого‑либо вмешательства. Некоторые приложения являются CPU-sensitive. Они чувствительны к:
- CPU дросселирование
- Переключение контекста
- Промахи кэша процессора
- Доступ к памяти между сокетами
- Hyperthreads, которые предполагается запускать на одной физической CPU карте
Если ваши нагрузки чувствительны к любому из этих пунктов, вы можете использовать Kubernetes CPU политики управления для выделения выделенных ядер CPU (через привязку CPU) этим рабочим нагрузкам. Это сократит задержку планировщика и повысит производительность приложений. Менеджер CPU предпочтительно выделяет ресурсы на сокете и полные физические ядра, чтобы избежать помех.
Политика управления CPU указывается с помощью kubelet --cpu-manager-policy. По умолчанию Kubernetes поддерживает следующие политики:
- none: политика по умолчанию. Этая none политика явно включает существующую схему привязки CPU по умолчанию, не предоставляя дополнительной привязки сверх того, что делает планировщик OS автоматически.
- static: Эту static политика позволяет контейнерам в гарантированных pods с целочисленными запросами CPU, чтобы использовать выделенные ресурсы CPU на узлах через привязку CPU.
Примечания и ограничения
Политика управления CPU не применяется к узлам ECS (PM) в кластерах CCE Turbo.
Настройка политики управления CPU на уровне кластера (Узлы в DefaultPool Поддерживается)
При создании кластера вы можете включить управление CPU в Расширенные настройки области. Этот параметр применяется ко всему кластеру, и политики управления CPU на уровне кластера не могут быть изменены после создания кластера. Если управление CPU не включено при создании кластера, узлы в DefaultPool не будут поддерживать изменения в политиках управления CPU. Чтобы применить политики управления CPU, необходимо создать пользовательский пул узлов и настроить желаемые параметры для его узлов.
- Если эта функция включена, статическая используется политика Kubernetes, где применяется привязка CPU.
- Если эта функция отключена, нет Используется политика Kubernetes, где привязка CPU не используется.
Настройка политики управления CPU уровня Node Pool
Вы можете настроить политику управления CPU для пользовательского пула узлов. После настройки параметр kubelet --cpu-manager-policy будет автоматически изменён на узлах в пуле узлов.
Пул узлов по умолчанию (DefaultPool) соответствует политикам управления CPU на уровне кластера, и его политики управления CPU не могут быть изменены.
- Войдите в CCE console и щёлкните название кластера, чтобы открыть консоль кластера.
- Выберите Nodes в навигационной панели и щёлкните Node Pools вкладку справа. Найдите целевой пул узлов и выберите Больше > Управление.
- На Manage Configurations странице, измените cpu-manager-policy значение статический в kubelet области.
- Нажмите OK.
Разрешить Pod'ам использовать ресурсы CPU исключительно
Prerequisites:
- Включите статический политику на узле. Подробности см. Настройка политики управления CPU на уровне кластера (поддерживаются узлы в DefaultPool).
- Запросы и лимиты должны быть настроены в pods, и их значения должны быть одинаковыми целыми числами.
Можно использовать планирование привязки к узлам для размещения настроенных pods на узлах, где static policy включена. Таким образом, pod'ы могут исключительно использовать ресурсы CPU.
Пример YAML:
kind: DeploymentapiVersion: apps/v1metadata:name: testspec:replicas: 1selector:matchLabels:app: testtemplate:metadata:labels:app: testspec:containers:- name: container-1image: nginx:alpineresources:requests:cpu: 2 # The value must be an integer and must be the same as that in limits.memory: 2048Milimits:cpu: 2 # The value must be an integer and must be the same as that in requests.memory: 2048MiimagePullSecrets:- name: default-secret
Проверка
Возьмите узел с 8 vCPU и 16 GiB памяти в качестве примера. Разверните рабочую нагрузку, у которой запрос и лимит CPU оба 2 на узле заранее.
Войдите в узел, где запущена рабочая нагрузка, и проверьте /var/lib/kubelet/cpu_manager_state вывод.
cat /var/lib/kubelet/cpu_manager_state
Вывод команды:
{"policyName":"static","defaultCpuSet":"0-1,4-7","entries":{"de14506d-0408-411f-bbb9-822866b58ae2":{"container-1":"2-3"}},"checksum":3744493798}
- Если policyName есть статический, политика настроена.
- Значение 2-3 указывает набор CPU, которые могут использоваться контейнерами в pod.