Распределение рабочей нагрузки в процессе работы
Базовая функциональность Kubernetes не предусматривает перераспределение рабочей нагрузки в процессе работы. В Nova Container Platform для поддержки оптимального распределения и использования ресурсов используется компонент descheduler.
Descheduler на основе заданных критериев периодически оценивает нагрузку и вытесняет поды.
Descheduler запускается в Nova Container Platform с политикой, заданной в ConfigMap nova-descheduler в namespace nova-descheduler.
Descheduler каждые 15 минут вытесняет поды, которые удовлетворяют включенной в ConfigMap политике.
|
Время, после которого будут вытеснены поды, зависит от настройки |
1. Настройки политики Descheduler
1.1. DefaultEvictor
DefaultEvictor обеспечивает вытеснение подов таким образом, чтобы результирующий под поместился хотя бы на одном доступном узле, если указана опция nodeFit: true.
- name: "DefaultEvictor"
args:
nodeFit: true
1.2. RemoveDuplicates
Политика RemoveDuplicates удаляет дублирующие поды: на узле должен быть запущен только один под от одного контроллера. Если на одном узле находятся два пода от одного контроллера, descheduler удаляет дублирующий под.
- name: ProfileName
pluginConfig:
- name: "RemoveDuplicates"
plugins:
balance:
enabled:
- "RemoveDuplicates"
1.3. RemoveFailedPods
Политика RemoveFailedPods вытесняет поды, которые завершились с ошибкой и в течение установленного времени minPodLifetimeSeconds не восстановились, за исключением подов, принадлежащих типам, перечисленным в excludeOwnerKinds.
- name: "RemoveFailedPods"
args:
excludeOwnerKinds:
- "Job"
minPodLifetimeSeconds: 900
1.4. PodLifeTime
Политика PodLifeTime вытесняет с узлов поды в состояниях Pending и PodInitializing, которые находятся в этих состояниях дольше 30 минут.
- name: "PodLifeTime"
args:
maxPodLifeTimeSeconds: 1800
states:
- "Pending"
- "PodInitializing"
1.5. RemovePodsHavingTooManyRestarts
Политика RemovePodsHavingTooManyRestarts удаляет с узлов поды, имеющие более 50 перезапусков контейнеров (включая init-контейнеры).
- name: "RemovePodsHavingTooManyRestarts"
args:
podRestartThreshold: 50
includingInitContainers: true
1.6. RemovePodsViolatingNodeTaints
Политика RemovePodsViolatingNodeTaints удаляет поды, нарушающие условия taint на узлах. Например, под, имеющий toleration и запущенный на узле с соответствующим taint, будет вытеснен с узла, если taint на узле будет изменен или удален.
Настроенные taint можно посмотреть в настройке политики.
- name: "RemovePodsViolatingNodeTaints"
args:
excludedTaints:
- node.kubernetes.io/memory-pressure
- node.kubernetes.io/disk-pressure
- node.kubernetes.io/pid-pressure
- node.kubernetes.io/unschedulable
- node.kubernetes.io/network-unavailable
1.7. RemovePodsViolatingNodeAffinity
Политика RemovePodsViolatingNodeAffinity обеспечивает соблюдение подами правил affinity. Если поды не соответствуют правилам affinity, поды вытесняются с узла.
Настроенные правила affinity:
-
requiredDuringSchedulingIgnoredDuringExecution -
preferredDuringSchedulingIgnoredDuringExecution
- name: "RemovePodsViolatingNodeAffinity"
args:
nodeAffinityType:
- "requiredDuringSchedulingIgnoredDuringExecution"
- "preferredDuringSchedulingIgnoredDuringExecution"
1.8. RemovePodsViolatingInterPodAntiAffinity
Политика RemovePodsViolatingInterPodAntiAffinity удаляет поды, нарушившие правила anti-affinity.
- name: "RemovePodsViolatingInterPodAntiAffinity"
1.9. LowNodeUtilization
Политика LowNodeUtilization перераспределяет поды с нагруженных узлов на ненагруженные. Узлы в кластере отслеживаются по CPU, памяти и подам (в процентах). После превышения порога, указанного в политике, выполняется перераспределение подов.
|
Настройка учитывает не реальное потребление ресурсов на узле, а реквесты у подов. |
- name: ProfileName
pluginConfig:
- name: "LowNodeUtilization"
args:
thresholds:
"cpu" : 40
"memory": 40
"pods": 20
targetThresholds:
"cpu" : 80
"memory": 80
"pods": 60
plugins:
balance:
enabled:
- "LowNodeUtilization"
2. Пример настроенной политики Descheduler
policy.yaml
apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
- name: Default
pluginConfig:
- name: "DefaultEvictor"
args:
nodeFit: true
- name: "RemoveDuplicates"
- name: "RemoveFailedPods"
args:
excludeOwnerKinds:
- "Job"
minPodLifetimeSeconds: 900
- name: "PodLifeTime"
args:
maxPodLifeTimeSeconds: 1800
states:
- "Pending"
- "PodInitializing"
- name: "RemovePodsHavingTooManyRestarts"
args:
podRestartThreshold: 50
includingInitContainers: true
- name: "RemovePodsViolatingNodeTaints"
args:
excludedTaints:
- node.kubernetes.io/memory-pressure
- node.kubernetes.io/disk-pressure
- node.kubernetes.io/pid-pressure
- node.kubernetes.io/unschedulable
- node.kubernetes.io/network-unavailable
- name: "RemovePodsViolatingNodeAffinity"
args:
nodeAffinityType:
- "requiredDuringSchedulingIgnoredDuringExecution"
- "preferredDuringSchedulingIgnoredDuringExecution"
- name: "RemovePodsViolatingInterPodAntiAffinity"
- name: "LowNodeUtilization"
args:
thresholds:
"cpu" : 40
"memory": 40
"pods": 20
targetThresholds:
"cpu" : 80
"memory": 80
"pods": 60
plugins:
deschedule:
enabled:
- "RemovePodsViolatingInterPodAntiAffinity"
- "RemovePodsViolatingNodeAffinity"
- "RemovePodsViolatingNodeTaints"
- "RemovePodsHavingTooManyRestarts"
- "PodLifeTime"
- "RemoveFailedPods"
balance:
enabled:
- "LowNodeUtilization"
- "RemoveDuplicates"
При обновлении платформы старая политика сохраняется в ConfigMap nova-descheduler-deprecated.