Descheduler#

Descheduler – инструмент, предназначенный для улучшения распределения pod в кластере Kubernetes. Анализирует текущее состояние размещения и при необходимости удаляет или заменяет («вытесняет») некоторые pod, чтобы Kube-scheduler мог переразместить их более оптимально.

Основные задачи и возможности
  • Оптимизация размещения pod:

    Помогает освободить перегруженные или неэффективно используемые узлы, «вытесняя» менее критичные pod.

  • Поддержка различных стратегий:

    Включает политики для:

    • удаления pod с перегруженных узлов;

    • балансировки между узлами по количеству pod;

    • освобождения узлов с низкой нагрузкой (для масштабирования);

    • удаления pod, нарушающих anti-affinity правила.

  • Работа в дополнение к Kube-scheduler:

    Не заменяет стандартный планировщик, а дополняет его, со временем исправляя неоптимальное распределение.

  • Гибкая настройка через конфигурацию:

    Позволяет включать/отключать стратегии, задавать фильтры по пространствам имен, меткам и другим параметрам.

  • Запуск по расписанию (через CronJob):

    Обычно разворачивается, как периодическая задача, так как работает асинхронно.

Примечание

Descheduler является инструментом по умолчанию компонента Pod-management и устанавливается с ним автоматически в режиме CronJob.

Конфигурация values#

Параметры Descheduler можно переопределить через редактирование нужных значений в spec.values. Общее описание конфигурации values для инструментов приведено в разделе «Конфигурации инструментов дополнительных компонентов».

kind – тип развертывания descheduler#

Параметр

Описание

Значение по умолчанию

kind

Тип ресурса Kubernetes для развертывания Descheduler. Возможные значения: CronJob (периодический запуск по расписанию) или Deployment (постоянное выполнение)

CronJob

image – настройки образа контейнера#

Параметр

Описание

Значение по умолчанию

image.repository

Репозиторий образа Descheduler с использованием шаблонных переменных для формирования полного пути

{{ .Values.global.image.registry }}/{{ .Values.global.image.repository }}/{{ .Values.global.dappVersion }}/dapp-descheduler/descheduler

image.tag

Тег версии образа Descheduler

v0.29.0

image.pullPolicy

Политика загрузки образа. Возможные значения: Always, IfNotPresent, Never

IfNotPresent

imagePullSecrets – секреты для загрузки образов#

Параметр

Описание

Значение по умолчанию

imagePullSecrets

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

[]

resources – настройки аппаратных ресурсов#

Параметр

Описание

Значение по умолчанию

resources.requests.cpu

Запрашиваемое количество CPU для контейнера

500m

resources.requests.memory

Запрашиваемый объем памяти для контейнера

256Mi

securityContext – контекст безопасности контейнера#

Параметр

Описание

Значение по умолчанию

securityContext.allowPrivilegeEscalation

Разрешить ли контейнеру повышать привилегии

false

securityContext.capabilities.drop

Список capabilities Linux, которые нужно удалить из контейнера

- ALL

securityContext.privileged

Запускать ли контейнер в привилегированном режиме

false

securityContext.readOnlyRootFilesystem

Использовать ли файловую систему только для чтения

true

securityContext.runAsNonRoot

Требовать запуск контейнера от имени непривилегированного пользователя

true

securityContext.runAsUser

ID пользователя, от имени которого запускается контейнер

1000

podSecurityContext – контекст безопасности pod#

Параметр

Описание

Значение по умолчанию

podSecurityContext

Настройки контекст безопасности для pod, например, fsGroup и другие параметры, применяемые ко всем контейнерам Pod

{}

nameOverride – переопределение имени ресурса#

Параметр

Описание

Значение по умолчанию

nameOverride

Частичное переопределение имени чарта для генерации имен ресурсов

""

fullnameOverride – полное переопределение имени ресурса#

Параметр

Описание

Значение по умолчанию

fullnameOverride

Полное переопределение сгенерированного имени ресурсов

""

commonLabels – общие метки#

Параметр

Описание

Значение по умолчанию

commonLabels

Метки, которые будут применены ко всем создаваемым ресурсам

{}

cronJobApiVersion – версия API CronJob#

Параметр

Описание

Значение по умолчанию

cronJobApiVersion

Версия API Kubernetes для ресурса CronJob

batch/v1

schedule – расписание запуска CronJob#

Параметр

Описание

Значение по умолчанию

schedule

Расписание запуска Descheduler в формате cron (применяется только при kind: CronJob)

*/15 * * * *

suspend – приостановка CronJob#

Параметр

Описание

Значение по умолчанию

suspend

Приостановка выполнения CronJob

false

successfulJobsHistoryLimit – лимит истории успешных заданий#

Параметр

Описание

Значение по умолчанию

successfulJobsHistoryLimit

Количество успешно завершенных заданий для хранения в истории

1

failedJobsHistoryLimit – лимит истории неудачных заданий#

Параметр

Описание

Значение по умолчанию

failedJobsHistoryLimit

Количество неудачно завершенных заданий для хранения в истории

1

concurrencyPolicy – политика одновременного выполнения заданий#

Параметр

Описание

Значение по умолчанию

concurrencyPolicy

Политика одновременного выполнения заданий CronJob. Возможные значения: Allow, Forbid, Replace

Forbid

deschedulingInterval – интервал анализа размещения pod для Deployment#

Параметр

Описание

Значение по умолчанию

deschedulingInterval

Интервал между запусками Descheduler (требуется при kind: Deployment)

5m

replicas – количество реплик#

Параметр

Описание

Значение по умолчанию

replicas

Количество реплик для Deployment. При использовании более 1 реплики необходимо настроить leaderElection

1

leaderElection – настройки выбора лидера#

Параметр

Описание

Значение по умолчанию

leaderElection

Настройки механизма выбора лидера (требуется при kind: Deployment и replicas > 1). leaderElection нельзя активировать, если включен режим DryRun. Пример конфигурации:

enabled: true
leaseDuration: 15s
renewDeadline: 10s
retryPeriod: 2s
resourceLock: «leases»
resourceName: «descheduler»
resourceNamescape: «kube-system»

{}

command – команда запуска#

Параметр

Описание

Значение по умолчанию

command

Команда для запуска Descheduler в контейнере

- "/bin/descheduler"

cmdOptions – опции командной строки#

Параметр

Описание

Значение по умолчанию

cmdOptions.v

Уровень детализации логирования (verbosity level). Возможные значения: 0 – ERROR, 1 – WARNING, 2 – INFO, 3 – DEBUG, 4 и выше – TRACE

3

deschedulerPolicyAPIVersion – версия API политики#

Параметр

Описание

Значение по умолчанию

deschedulerPolicyAPIVersion

Версия API-политики Descheduler. Рекомендуется использовать последнюю версию API, поддерживаемую версией Descheduler

descheduler/v1alpha1

deschedulerPolicy – политика descheduler#

Параметр

Описание

Значение по умолчанию

deschedulerPolicy.strategies.RemoveDuplicates.enabled

Включить стратегию удаления дублирующихся pod одного узла для обеспечения высокой доступности

true

deschedulerPolicy.strategies.RemovePodsHavingTooManyRestarts.enabled

Включить стратегию удаления pod, имеющих слишком много перезапусков

true

deschedulerPolicy.strategies.RemovePodsHavingTooManyRestarts.params.podsHavingTooManyRestarts.podRestartThreshold

Пороговое значение количества перезапусков pod, после которого он будет «вытеснен»

100

deschedulerPolicy.strategies.RemovePodsHavingTooManyRestarts.params.podsHavingTooManyRestarts.includingInitContainers

Учет перезапусков init-контейнеров при подсчете

true

deschedulerPolicy.strategies.RemovePodsViolatingNodeTaints.enabled

Включить стратегию удаления pod, которые нарушают NoSchedule taints на узлах

true

deschedulerPolicy.strategies.RemovePodsViolatingNodeAffinity.enabled

Включить стратегию удаления pod, нарушающих правила NodeAffinity

true

deschedulerPolicy.strategies.RemovePodsViolatingNodeAffinity.params.nodeAffinityType

Типы NodeAffinity для проверки. Возможные значения: requiredDuringSchedulingIgnoredDuringExecution, preferredDuringSchedulingIgnoredDuringExecution

- requiredDuringSchedulingIgnoredDuringExecution

deschedulerPolicy.strategies.RemovePodsViolatingInterPodAntiAffinity.enabled

Включить стратегию удаления pod, нарушающих правила InterPod AntiAffinity

true

deschedulerPolicy.strategies.RemovePodsViolatingTopologySpreadConstraint.enabled

Включить стратегию удаления pod, нарушающих ограничения топологического распределения

true

deschedulerPolicy.strategies.RemovePodsViolatingTopologySpreadConstraint.params.includeSoftConstraints

Включать ли в проверку мягкие ограничения (soft constraints)

false

deschedulerPolicy.strategies.LowNodeUtilization.enabled

Включить стратегию поиска недоиспользуемых узлов и «вытеснении» pod с других узлов для их перепланирования на недоиспользуемые узлы

true

deschedulerPolicy.strategies.LowNodeUtilization.params.nodeResourceUtilizationThresholds.thresholds.cpu

Пороговое значение использования CPU в процентах, ниже которого узел считается недоиспользуемым

20

deschedulerPolicy.strategies.LowNodeUtilization.params.nodeResourceUtilizationThresholds.thresholds.memory

Пороговое значение использования памяти в процентах, ниже которого узел считается недоиспользуемым

20

deschedulerPolicy.strategies.LowNodeUtilization.params.nodeResourceUtilizationThresholds.thresholds.pods

Пороговое значение количества pod в процентах, ниже которого узел считается недоиспользуемым

20

deschedulerPolicy.strategies.LowNodeUtilization.params.nodeResourceUtilizationThresholds.targetThresholds.cpu

Целевое пороговое значение CPU в процентах для узлов, с которых будут «вытесняться» pod

50

deschedulerPolicy.strategies.LowNodeUtilization.params.nodeResourceUtilizationThresholds.targetThresholds.memory

Целевое пороговое значение памяти в процентах для узлов, с которых будут «вытесняться» pod

50

deschedulerPolicy.strategies.LowNodeUtilization.params.nodeResourceUtilizationThresholds.targetThresholds.pods

Целевое пороговое значение количества pod в процентах для узлов, с которых будут «вытесняться» pod

50

priorityClassName – класс приоритета pod#

Параметр

Описание

Значение по умолчанию

priorityClassName

PriorityClass для pod Descheduler, определяющий их важность при планировании

system-cluster-critical

nodeSelector – селектор узлов#

Параметр

Описание

Значение по умолчанию

nodeSelector

Селектор узлов для планирования pod Descheduler на конкретные узлы

{}

affinity – правила affinity#

Параметр

Описание

Значение по умолчанию

affinity

Настройки affinity для управления размещением pod Descheduler. Пример конфигурации:

nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- descheduler
topologyKey: «kubernetes.io/hostname»

{}

tolerations – настройки tolerations для taint#

Параметр

Описание

Значение по умолчанию

tolerations

Список tolerations для планирования pod на узлы с соответствующими taint. Пример конфигурации:

- key: „management“
operator: „Equal“
value: „tool“
effect: „NoSchedule“

[]

rbac – настройки RBAC#

Параметр

Описание

Значение по умолчанию

rbac.create

Создание ресурсов RBAC (Role, ClusterRole, RoleBinding, ClusterRoleBinding)

true

serviceAccount – настройки ServiceAccount#

Параметр

Описание

Значение по умолчанию

serviceAccount.create

Создавать ли ServiceAccount для Descheduler

true

serviceAccount.name

Имя ServiceAccount. Если не задано и create=true, имя генерируется автоматически

null

serviceAccount.annotations

Аннотации для ServiceAccount

{}

podAnnotations – аннотации pod#

Параметр

Описание

Значение по умолчанию

podAnnotations

Аннотации, которые будут добавлены к pod Descheduler

{}

podLabels – метки pod#

Параметр

Описание

Значение по умолчанию

podLabels

Метки, которые будут добавлены к pod Descheduler

{}

dnsConfig – настройки DNS pod#

Параметр

Описание

Значение по умолчанию

dnsConfig

Пользовательские параметры DNS для Pod descheduler

{}

livenessProbe – проверка работоспособности pod#

Параметр

Описание

Значение по умолчанию

livenessProbe.failureThreshold

Количество неудачных проверок до перезапуска контейнера

3

livenessProbe.httpGet.path

URL-путь для HTTP-проверки работоспособности pod

/healthz

livenessProbe.httpGet.port

Порт для HTTP-проверки работоспособности pod

10258

livenessProbe.httpGet.scheme

Схема протокола для проверки pod (HTTP или HTTPS)

HTTPS

livenessProbe.initialDelaySeconds

Задержка перед первой проверкой после запуска контейнера (в секундах)

3

livenessProbe.periodSeconds

Периодичность выполнения проверки работоспособности (в секундах)

10

service – настройки Service#

Параметр

Описание

Значение по умолчанию

service.enabled

Создавать ли Service для Descheduler

false

service.ipFamilyPolicy

Политика выбора IP-стека для Service, допустимые значения: SingleStack, PreferDualStack или RequireDualStack

""

service.ipFamilies

Список IP-семейств, назначаемых Service. Пример конфигурации:

- IPv6
- IPv4

[]

serviceMonitor – настройки ServiceMonitor для Prometheus#

Параметр

Описание

Значение по умолчанию

serviceMonitor.enabled

Создавать ли ServiceMonitor для сбора метрик Prometheus

false

serviceMonitor.additionalLabels

Дополнительные метки для ресурса ServiceMonitor

{}

serviceMonitor.interval

Интервал сбора метрик. Если не задан, используется глобальный интервал Prometheus

""

serviceMonitor.insecureSkipVerify

Пропускать ли проверку TLS-сертификата при сборе метрик

true

serviceMonitor.serverName

Имя сервера для проверки TLS-сертификата

null

serviceMonitor.metricRelabelings

Правила переименования метрик после их сбора. Пример конфигурации:

- action: keep
regex: „descheduler_(build_info

pods_evicted)“
sourceLabels: [name]

serviceMonitor.relabelings

Правила переименования меток перед сбором метрик. Пример конфигурации:

- sourceLabels: [__meta_kubernetes_pod_node_name]
separator: ;
regex: ^(.*)\(<br> targetLabel: nodename<br> replacement: \)1
action: replace

[]