Правила распределения нагрузки на узлах

Для повышения отказоустойчивости и производительности системы вы можете задать гибкие правила распределения нагрузки на узлах при помощи инструментов:

  • Affinity — определить гибкие правила для размещения подов по отношению друг к другу или на определённых узлах;
  • Anti-affinity — предотвратить размещение подов одного типа на одном узле или в одной топологии.

Также для настройки размещения подов можно использовать:

Инструмент Affinity

Вы можете настроить гибкие правила для распределения подов по узлам или зонам. Например, определить приоритетные узлы или задать сложные условия для размещения подов. Для этого используйте инструмент Affinity. Он настраивается с помощью параметра nodeAffinity.

Настройка параметра nodeAffinity

Рассмотрим настройку параметра nodeAffinity на примере и настроим запуск пода только на узлах с меткой role=worker. Для этого в файле values-elma365.yaml перейдите к полю .Values.global.affinity и укажите значения:

global:
 affinity:
   nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
       nodeSelectorTerms:
       - matchExpressions:
         - key: role
           operator: In
           values:
           - worker

Где:

  • requiredDuringSchedulingIgnoredDuringExecution — правило размещения пода на узле;
  • nodeSelectorTerms — список условий, которые должны выполняться для узлов;
  • matchExpressions — логические выражения для фильтрации меток:
    • key — имя метки;
    • operator — оператор сравнения:
      • In — значение метки должно входить в список values;
      • NotIn — значение метки не должно входить в список values;
      • Exists — у пода должна быть метка key с заданным именем;
      • DoesNotExist  — у пода не должно быть метки key с заданным именем;
  • values — значения метки, которые используются с операторами In и NotIn. Можно указать несколько значений.

Этапы изменения параметра аналогичны шагам в статье «Изменение параметров ELMA365 Enterprise».

Инструмент Anti-affinity

Для повышения отказоустойчивости системы вы можете распределить поды одного типа по разным узлам. Например, задать правила для размещения подов сервиса mailer. Если одного узла недостаточно для выполнения вычислений, то работа сервиса продолжится на других узлах.

Чтобы задать такие правила, используйте инструмент Anti-affinity. Он настраивается с помощью параметра podAntiAffinity.

Настройка параметра podAntiAffinity

Рассмотрим настройку параметра podAntiAffinity на примере и запретим размещение подов с меткой app=mailer на одном узле. Для этого в файле values-elma365.yaml перейдите к полю .Values.global.affinity и задайте настройки:

global:
 affinity:
   podAntiAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
     - labelSelector:
         matchExpressions:
         - key: app
           operator: In
           values:
           - mailer
       topologyKey: kubernetes.io/hostname

Где:

  • requiredDuringSchedulingIgnoredDuringExecution — правило размещения пода на узле;
  • labelSelector — метки подов, к которым применяется правило;
  • matchExpressions — логические выражения для фильтрации меток:
    • key — имя метки;
    • operator — оператор сравнения:
      • In — значение метки должно входить в список values;
      • NotIn — значение метки не должно входить в список values;
      • Exists — у пода должна быть метка key с заданным именем;
      • DoesNotExist  — у пода не должно быть метки key с заданным именем;
  • values — значения метки, которые используются с операторами In и NotIn. Можно указать несколько значений;
  • topologyKey — ключ метаданных, который используется для определения топологии узлов, например kubernetes.io/hostname.

Этапы изменения параметра аналогичны шагам в статье «Изменение параметров ELMA365 Enterprise».

Значения по умолчанию в поле .Values.global.affinity

Если в поле .Values.global.affinity вы не задали значения, применяется настройка по умолчанию:

affinity:
 podAntiAffinity:
   preferredDuringSchedulingIgnoredDuringExecution:
     - podAffinityTerm:
         labelSelector:
           matchExpressions:
             - key: app
               operator: In
               values:
                 - <service name>
             - key: release
               operator: In
               values:
                 - "<release name>"
         topologyKey: kubernetes.io/hostname
       weight: 10

В этой конфигурации:

  • предотвращается размещение нескольких подов одного приложения (app=<service name>) или релиза (release=<release name>) на одном узле;
  • для определения топологии используется ключ kubernetes.io/hostname, который распределяет поды по различным узлам;
  • в параметре weight: 10 задаётся приоритет правила, по которому в планировщике Kubernetes выбирается узел для размещения подов.