Descheduler
О descheduler
Основные понятия:
- Scheduler - компонент Kubernetes, который производит назначение подов на узлы. Происходит единожды в момент запуска пода
- Descheduler - необязательный компонент Kubernetes, который на основе внутренних правил может производить выселение нагрузки с одного из узлов.
- Выселение нагрузки - Выключение Pods на узле, который подходит под правила Desheduler. Не гарантирует последующего размещения на другом узле, если это не противоречит механизмам Scheduler
Варианты использования:
- Распределить нагрузку на все доступные узлы
- Сосредоточить нагрузку на минимальном числе узлов
- Исходные требования к размещению не актуальны.
- Выход из строя узлов и последующее перемещение подов.
- Добавление новых узлов.
Заметка
Ознакомьтесь с управлением модулями Bootsman
Подключение модуля desheduler
Описание Yaml
Внимание!
Все values, которые не содержат описания (1) являются продвинутыми настройками и редактировать их не рекомендовано
- Описание
apiVersion: addon.bootsman.tech/v1alpha1
kind: Config
metadata:
name: CLUSTER_NAME-descheduler
namespace: CLUSTER_NAMESPACE
spec:
enabled: true (1)
values:
deschedulerPolicy: (2)
evictLocalStoragePods: true (3)
nodeSelector: node-role.kubernetes.io/controlplane!=true (4)
profiles:
- name: default
pluginConfig: (5)
- name: DefaultEvictor (6)
args:
evictLocalStoragePods: true (7)
ignorePvcPods: true (8)
- name: RemoveDuplicates (9)
args:
excludeOwnerKinds: (10)
- ReplicaSet
- name: LowNodeUtilization (11)
args:
targetThresholds: (12)
cpu: 50
memory: 50
pods: 50
thresholds: (13)
cpu: 20
memory: 20
pods: 20
- name: RemovePodsHavingTooManyRestarts (14)
args:
includingInitContainers: true (15)
podRestartThreshold: 100 (16)
- name: RemovePodsViolatingNodeAffinity (17)
args:
nodeAffinityType: (18)
- requiredDuringSchedulingIgnoredDuringExecution
- preferredDuringSchedulingIgnoredDuringExecution
- name: RemovePodsViolatingNodeTaints (19)
args:
excludedTaints: [] (20)
includedTaints: []
- name: RemovePodsViolatingTopologySpreadConstraint (21)
args:
constraints:
- DoNotSchedule
- ScheduleAnyway
topologyBalanceNodeFit: true
plugins: (22)
balance:
enabled:
- RemoveDuplicates
- RemovePodsViolatingTopologySpreadConstraint
- LowNodeUtilization
deschedule:
enabled:
- RemovePodsHavingTooManyRestarts
- RemovePodsViolatingNodeTaints
- RemovePodsViolatingNodeAffinity
deschedulingInterval: 5m (23)
image:
repository: harbor.bootsman.host/bootsman-nimbus/common-artifacts/descheduler
- True - включено.
False - выключено
- Настройки политик приложения.
- true - разрешено выселение pods при наличии localstorage.
false - запрещено.
При запрете pods с emptyDir не будут выселяться
- Фильтр, указывающий на каких узлах применять политики
- Настройки плагинов.
Для работы одноименные плагины должны быть включены
- Настройки по умолчанию для правил "выселения" нагрузки.
- true - выселять нагрузку имеющие локальные хранилища типа EmptyDir.
false - не подвергать выселению нагрузку с локальными хранилищами
- true - не подвергать выселению нагрузку с подключенными PVC.
false - выселение происходит в общем порядке
- Политика удаление дубликатов приложений на одном узле. Цель - обеспечить размещение реплик на разных узлах.
- Список типов(kind) объектов, которых не будет касаться политика удаления дубликатов
- Политика перераспределения нагрузки от более нагруженных к менее нагруженным узлам
- Параметры определяющие перегруженные узлы
- Параметры определяющие недонагруженные узлы
- Политика обеспечивающая удаление Pods при большом числе перезапуске.
- true - в счетчик идут init контейнеры.
false - только приложение
- Число перезапусков, при превышении которого будет произведено выселение.
- Политика обеспечивает соответствие запущенных приложений с affinity правил
- Тип правил, которые будут учитываться при принятии решении о выселении
- Политика обеспечивает соответствие запущенных приложений с Taints
- Список Taints, которые включены или невключены, на основе которых обеспечивается соответствие
- Политика обеспечивает соответствие запущенных приложений с топологией
- Включенные плагины
- Период проверки кластер на соответствие политик Desheduler
Настройка в UI
Все Values
Продвинутые настройки
Ниже представлены тонкие настройки модуля.
Используйте их для расширения конфигурации модуля, если потребуется.
Документация
Более полная документация по модулю:
Descheduler Docs
Descheduler Chart
Descheduler Values
values:
# CronJob or Deployment
kind: Deployment
image:
repository: harbor.bootsman.host/bootsman-nimbus/common-artifacts/descheduler
# Overrides the image tag whose default is the chart version
tag: ""
pullPolicy: IfNotPresent
imagePullSecrets:
# - name: container-registry-secret
resources:
requests:
cpu: 500m
memory: 256Mi
# limits:
# cpu: 100m
# memory: 128Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
# podSecurityContext -- [Security context for pod](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
podSecurityContext: {}
# fsGroup: 1000
nameOverride: ""
fullnameOverride: ""
# -- Override the deployment namespace; defaults to .Release.Namespace
namespaceOverride: ""
# labels that'll be applied to all resources
commonLabels: {}
cronJobApiVersion: "batch/v1"
schedule: "*/2 * * * *"
suspend: false
# startingDeadlineSeconds: 200
# successfulJobsHistoryLimit: 3
# failedJobsHistoryLimit: 1
# ttlSecondsAfterFinished 600
# timeZone: Etc/UTC
# Required when running as a Deployment
deschedulingInterval: 5m
# Specifies the replica count for Deployment
# Set leaderElection if you want to use more than 1 replica
# Set affinity.podAntiAffinity rule if you want to schedule onto a node
# only if that node is in the same zone as at least one already-running descheduler
replicas: 1
# Specifies whether Leader Election resources should be created
# Required when running as a Deployment
# NOTE: Leader election can't be activated if DryRun enabled
leaderElection: {}
# enabled: true
# leaseDuration: 15s
# renewDeadline: 10s
# retryPeriod: 2s
# resourceLock: "leases"
# resourceName: "descheduler"
# resourceNamespace: "kube-system"
command:
- "/bin/descheduler"
cmdOptions:
v: 3
# Recommended to use the latest Policy API version supported by the Descheduler app version
deschedulerPolicyAPIVersion: "descheduler/v1alpha2"
deschedulerPolicy:
# nodeSelector: "key1=value1,key2=value2"
# maxNoOfPodsToEvictPerNode: 10
# maxNoOfPodsToEvictPerNamespace: 10
# ignorePvcPods: true
# evictLocalStoragePods: true
# evictDaemonSetPods: true
# tracing:
# collectorEndpoint: otel-collector.observability.svc.cluster.local:4317
# transportCert: ""
# serviceName: ""
# serviceNamespace: ""
# sampleRate: 1.0
# fallbackToNoOpProviderOnError: true
profiles:
- name: default
pluginConfig:
- name: DefaultEvictor
args:
ignorePvcPods: true
evictLocalStoragePods: true
- name: RemoveDuplicates
- name: RemovePodsHavingTooManyRestarts
args:
podRestartThreshold: 100
includingInitContainers: true
- name: RemovePodsViolatingNodeAffinity
args:
nodeAffinityType:
- requiredDuringSchedulingIgnoredDuringExecution
- name: RemovePodsViolatingNodeTaints
- name: RemovePodsViolatingInterPodAntiAffinity
- name: RemovePodsViolatingTopologySpreadConstraint
- name: LowNodeUtilization
args:
thresholds:
cpu: 20
memory: 20
pods: 20
targetThresholds:
cpu: 50
memory: 50
pods: 50
plugins:
balance:
enabled:
- RemoveDuplicates
- RemovePodsViolatingTopologySpreadConstraint
- LowNodeUtilization
deschedule:
enabled:
- RemovePodsHavingTooManyRestarts
- RemovePodsViolatingNodeTaints
- RemovePodsViolatingNodeAffinity
- RemovePodsViolatingInterPodAntiAffinity
priorityClassName: system-cluster-critical
nodeSelector: {}
# foo: bar
affinity: {}
# 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"
topologySpreadConstraints: []
# - maxSkew: 1
# topologyKey: kubernetes.io/hostname
# whenUnsatisfiable: DoNotSchedule
# labelSelector:
# matchLabels:
# app.kubernetes.io/name: descheduler
tolerations: []
# - key: 'management'
# operator: 'Equal'
# value: 'tool'
# effect: 'NoSchedule'
rbac:
# Specifies whether RBAC resources should be created
create: true
serviceAccount:
# Specifies whether a ServiceAccount should be created
create: true
# The name of the ServiceAccount to use.
# If not set and create is true, a name is generated using the fullname template
name:
# Specifies custom annotations for the serviceAccount
annotations: {}
podAnnotations: {}
podLabels: {}
dnsConfig: {}
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10258
scheme: HTTPS
initialDelaySeconds: 3
periodSeconds: 10
service:
enabled: false
# @param service.ipFamilyPolicy [string], support SingleStack, PreferDualStack and RequireDualStack
#
ipFamilyPolicy: ""
# @param service.ipFamilies [array] List of IP families (e.g. IPv4, IPv6) assigned to the service.
# Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/
# E.g.
# ipFamilies:
# - IPv6
# - IPv4
ipFamilies: []
serviceMonitor:
enabled: false
# The namespace where Prometheus expects to find service monitors.
# namespace: ""
# Add custom labels to the ServiceMonitor resource
additionalLabels: {}
# prometheus: kube-prometheus-stack
interval: ""
# honorLabels: true
insecureSkipVerify: true
serverName: null
metricRelabelings: []
# - action: keep
# regex: 'descheduler_(build_info|pods_evicted)'
# sourceLabels: [__name__]
relabelings: []
# - sourceLabels: [__meta_kubernetes_pod_node_name]
# separator: ;
# regex: ^(.*)$
# targetLabel: nodename
# replacement: $1
# action: replace

