По умолчанию kubelet использует CFS квоты для обеспечения ограничений pod CPU. Когда узел запускает множество pod CPU-bound, нагрузка может перемещаться между разными ядрами CPU в зависимости от того, ограничен ли pod и какие ядра CPU доступны во время планирования. Многие нагрузки не чувствительны к этой миграции и нормально работают без какого‑либо вмешательства. Некоторые приложения являются CPU-sensitive. Они чувствительны к:
Если ваши нагрузки чувствительны к любому из этих пунктов, вы можете использовать Kubernetes CPU политики управления для выделения выделенных ядер CPU (через привязку CPU) этим рабочим нагрузкам. Это сократит задержку планировщика и повысит производительность приложений. Менеджер CPU предпочтительно выделяет ресурсы на сокете и полные физические ядра, чтобы избежать помех.
Политика управления CPU указывается с помощью kubelet --cpu-manager-policy. По умолчанию Kubernetes поддерживает следующие политики:
Политика управления CPU не применяется к узлам ECS (PM) в кластерах CCE Turbo.
При создании кластера вы можете включить управление CPU в Расширенные настройки области. Этот параметр применяется ко всему кластеру, и политики управления CPU на уровне кластера не могут быть изменены после создания кластера. Если управление CPU не включено при создании кластера, узлы в DefaultPool не будут поддерживать изменения в политиках управления CPU. Чтобы применить политики управления CPU, необходимо создать пользовательский пул узлов и настроить желаемые параметры для его узлов.
Вы можете настроить политику управления CPU для пользовательского пула узлов. После настройки параметр kubelet --cpu-manager-policy будет автоматически изменён на узлах в пуле узлов.
Пул узлов по умолчанию (DefaultPool) соответствует политикам управления CPU на уровне кластера, и его политики управления CPU не могут быть изменены.
Prerequisites:
Можно использовать планирование привязки к узлам для размещения настроенных 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}