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

Тег образа контейнера

v0.29.0

image.pullPolicy

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

IfNotPresent

imagePullSecrets – Secret для загрузки образов#

Параметр

Описание

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

imagePullSecrets

Список Secret для загрузки образа контейнера из приватных реестров.
Пример конфигурации:

- name: container-registry-secret

[]

resources – запросы и ограничения ресурсов контейнера#

Параметр

Описание

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

resources.requests.cpu

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

500m

resources.requests.memory

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

256Mi

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

Параметр

Описание

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

securityContext.allowPrivilegeEscalation

Активация разрешения на эскалацию привилегий в контейнере

false

securityContext.capabilities.drop

Список возможностей (capabilities), отзываемых у контейнера

- ALL

securityContext.privileged

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

false

securityContext.readOnlyRootFilesystem

Монтирование корневой файловой системы в режиме «только для чтения»

true

securityContext.runAsNonRoot

Запуск от имени пользователя без административных полномочий

true

securityContext.runAsUser

ID пользователя для запуска контейнера

1000

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

Параметр

Описание

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

podSecurityContext

Параметры контекста безопасности pod.
Пример конфигурации:

fsGroup: 1000

{}

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

false

startingDeadlineSeconds

Максимальное время в секундах для ожидания начала выполнения job

~

successfulJobsHistoryLimit

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

1

failedJobsHistoryLimit

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

1

ttlSecondsAfterFinished

Время в секундах до удаления завершенного job

~

timeZone

Часовой пояс для расписания CronJob

~

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

Параметр

Описание

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

concurrencyPolicy

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

Forbid

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

Параметр

Описание

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

deschedulingInterval

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

5m

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

Параметр

Описание

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

replicas

Количество реплик pod

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

Команда запуска контейнера, переопределяющая стандартный entrypoint образа контейнера

- "/bin/descheduler"

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

Параметр

Описание

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

cmdOptions.v

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

3

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

Параметр

Описание

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

deschedulerPolicyAPIVersion

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

descheduler/v1alpha1

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

Параметр

Описание

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

deschedulerPolicy.nodeSelector

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

foo: bar

~

deschedulerPolicy.maxNoOfPodsToEvictPerNode

Максимальное количество pod для вытеснения с одного узла

~

deschedulerPolicy.maxNoOfPodsToEvictPerNamespace

Максимальное количество pod для вытеснения из одного пространства имен

~

deschedulerPolicy.ignorePvcPods

Игнорирование pod с PersistentVolumeClaim

~

deschedulerPolicy.evictLocalStoragePods

Разрешение вытеснения pod с локальным хранилищем

~

deschedulerPolicy.tracing.collectorEndpoint

Конечная точка коллектора для трассировки

~

deschedulerPolicy.tracing.transportCert

Сертификат транспорта для трассировки

~

deschedulerPolicy.tracing.serviceName

Имя сервиса для трассировки

~

deschedulerPolicy.tracing.serviceNamespace

Пространство имен сервиса для трассировки

~

deschedulerPolicy.tracing.sampleRate

Частота выборки трассировки

~

deschedulerPolicy.tracing.fallbackToNoOpProviderOnError

Использование нулевого провайдера при ошибке трассировки

~

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, нарушающих правила InterPodAntiAffinity

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

system-cluster-critical

nodeSelector – селектор узлов для планирования pod#

Параметр

Описание

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

nodeSelector

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

foo: bar

{}

affinity – правила привязки (affinity и anti-affinity) pod к узлам#

Параметр

Описание

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

affinity

Настройки правила привязки (affinity и anti-affinity) pod к узлам.
Пример конфигурации:

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 – параметры Toleration для pod#

Параметр

Описание

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

tolerations

Toleration для размещения pod на узлах с ограничениями (taints).
Пример конфигурации:

- key: "management"
  operator: "Equal"
  value: "tool"
  effect: "NoSchedule"

[]

rbac – настройки RBAC (управление доступом на основе ролей)#

Параметр

Описание

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

rbac.create

Активация автоматического создания ресурсов RBAC

true

serviceAccount – настройки сервисного аккаунта#

Параметр

Описание

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

serviceAccount.create

Создание ServiceAccount для Descheduler

true

serviceAccount.name

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

~

serviceAccount.annotations

Аннотации, добавляемые ко всем создаваемым ресурсам

{}

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

Параметр

Описание

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

podAnnotations

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

{}

podLabels – метки pod#

Параметр

Описание

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

podLabels

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

{}

dnsConfig – пользовательская конфигурация DNS для pod#

Параметр

Описание

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

dnsConfig

Пользовательская конфигурация DNS для pod

{}

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

Параметр

Описание

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

livenessProbe.failureThreshold

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

3

livenessProbe.httpGet.path

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

/healthz

livenessProbe.httpGet.port

Имя порта для проверки работоспособности

10258

livenessProbe.httpGet.scheme

Схема обращения для проверки работоспособности.
Возможные значения: HTTP, HTTPS

HTTPS

livenessProbe.initialDelaySeconds

Задержка в секундах перед первой проверкой работоспособности

3

livenessProbe.periodSeconds

Интервал в секундах между проверками работоспособности

10

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

Параметр

Описание

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

service.enabled

Активация создания Service

false

service.ipFamilyPolicy

Политика выбора IP-стека для service.
Возможные значения: SingleStack, PreferDualStack, RequireDualStack

""

service.ipFamilies

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

- IPv6
- IPv4

[]

serviceMonitor – параметры ServiceMonitor#

Параметр

Описание

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

serviceMonitor.enabled

Активация создания ServiceMonitor для Prometheus Operator

false

serviceMonitor.additionalLabels

Дополнительные метки для ресурса ServiceMonitor.
Пример конфигурации:

prometheus: kube-prometheus-stack

{}

serviceMonitor.interval

Интервал сбора метрик

""

serviceMonitor.insecureSkipVerify

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

true

serviceMonitor.serverName

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

~

serviceMonitor.metricRelabelings

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

- action: keep
  regex: 'descheduler_(build_info|pods_evicted)'
  sourceLabels: [__name__]

[]

serviceMonitor.relabelings

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

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

[]