Перейти к содержанию

Descheduler

О descheduler

Основные понятия:

  1. Scheduler - компонент Kubernetes, который производит назначение подов на узлы. Происходит единожды в момент запуска пода
  2. Descheduler - необязательный компонент Kubernetes, который на основе внутренних правил может производить выселение нагрузки с одного из узлов.
  3. Выселение нагрузки - Выключение Pods на узле, который подходит под правила Desheduler. Не гарантирует последующего размещения на другом узле, если это не противоречит механизмам Scheduler

Варианты использования:

  1. Распределить нагрузку на все доступные узлы
  2. Сосредоточить нагрузку на минимальном числе узлов
  3. Исходные требования к размещению не актуальны.
  4. Выход из строя узлов и последующее перемещение подов.
  5. Добавление новых узлов.

Заметка

Ознакомьтесь с управлением модулями Bootsman

Подключение модуля desheduler

Описание Yaml

Внимание!

Все values, которые не содержат описания (1) являются продвинутыми настройками и редактировать их не рекомендовано

  1. Описание
apiVersion: addons.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
  1. True - включено.

    False - выключено

  2. Настройки политик приложения.
  3. true - разрешено выселение pods при наличии localstorage.

    false - запрещено.

    При запрете pods с emptyDir не будут выселяться

  4. Фильтр, указывающий на каких узлах применять политики
  5. Настройки плагинов.

    Для работы одноименные плагины должны быть включены

  6. Настройки по умолчанию для правил "выселения" нагрузки.
  7. true - выселять нагрузку имеющие локальные хранилища типа EmptyDir.

    false - не подвергать выселению нагрузку с локальными хранилищами

  8. true - не подвергать выселению нагрузку с подключенными PVC.

    false - выселение происходит в общем порядке

  9. Политика удаление дубликатов приложений на одном узле. Цель - обеспечить размещение реплик на разных узлах.
  10. Список типов(kind) объектов, которых не будет касаться политика удаления дубликатов
  11. Политика перераспределения нагрузки от более нагруженных к менее нагруженным узлам
  12. Параметры определяющие перегруженные узлы
  13. Параметры определяющие недонагруженные узлы
  14. Политика обеспечивающая удаление Pods при большом числе перезапуске.
  15. true - в счетчик идут init контейнеры.

    false - только приложение

  16. Число перезапусков, при превышении которого будет произведено выселение.
  17. Политика обеспечивает соответствие запущенных приложений с affinity правил
  18. Тип правил, которые будут учитываться при принятии решении о выселении
  19. Политика обеспечивает соответствие запущенных приложений с Taints
  20. Список Taints, которые включены или невключены, на основе которых обеспечивается соответствие
  21. Политика обеспечивает соответствие запущенных приложений с топологией
  22. Включенные плагины
  23. Период проверки кластер на соответствие политик Desheduler

Настройка в UI

Image Image

Все 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