Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Распределение рабочей нагрузки в процессе работы

Базовая функциональность Kubernetes не предусматривает перераспределение рабочей нагрузки в процессе работы. В Nova Container Platform для поддержки оптимального распределения и использования ресурсов используется компонент descheduler.

Descheduler на основе заданных критериев периодически оценивает нагрузку и вытесняет поды.

Descheduler запускается в Nova Container Platform с политикой, заданной в ConfigMap nova-descheduler в namespace nova-descheduler.

Descheduler каждые 15 минут вытесняет поды, которые удовлетворяют включенной в ConfigMap политике.

Время, после которого будут вытеснены поды, зависит от настройки minPodLifetimeSeconds.

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.