﻿# Правила распределения нагрузки на узлах

> [HTML Version](affinity-antiaffinity.html)

Для повышения отказоустойчивости и производительности системы вы можете задать гибкие правила распределения нагрузки на узлах при помощи инструментов:

- [Affinity](#affinity) — определить гибкие правила для размещения подов по отношению друг к другу или на определённых узлах;

- [Anti-affinity](#antiaffinity) — предотвратить размещение подов одного типа на одном узле или в одной топологии.

Перед настройкой Affinity или Anti-affinity ознакомьтесь со всеми инструментами для размещения подов и с рекомендациями по их совместному использованию в статье [«Продвинутые параметры ELMA365 Enterprise»](advanced-kubernetes-settings.md). 

## Инструмент Affinity

Вы можете настроить гибкие правила для распределения подов по узлам или зонам. Например, определить приоритетные узлы или задать сложные условия для размещения подов. Для этого используйте инструмент Affinity. Он настраивается с помощью параметра \[OBJECT\]. 

### Настройка параметра nodeAffinity

Рассмотрим настройку параметра \[OBJECT\] на примере и настроим запуск пода только на узлах с меткой  \[OBJECT\]. Для этого в файле \[OBJECT\] перейдите к полю \[OBJECT\] и укажите значения:

````
global:  
  affinity:  
    nodeAffinity:  
      requiredDuringSchedulingIgnoredDuringExecution:  
        nodeSelectorTerms:  
        - matchExpressions:  
          - key: role  
            operator: In  
            values:  
            - worker

````
Где:

- \[OBJECT\] — правило размещения пода на узле;

- \[OBJECT\] — список условий, которые должны выполняться для узлов;

- \[OBJECT\] — логические выражения для фильтрации меток:

	- \[OBJECT\] — имя метки;

	- \[OBJECT\] — оператор сравнения: 

		- \[OBJECT\] — значение метки должно входить в список \[OBJECT\];

		- \[OBJECT\] — значение метки не должно входить в список \[OBJECT\];

		- \[OBJECT\] — у пода должна быть метка \[OBJECT\] с заданным именем;

		- \[OBJECT\]  — у пода не должно быть метки \[OBJECT\] с заданным именем;

- \[OBJECT\] — значения метки, которые используются с операторами \[OBJECT\] и \[OBJECT\]. Можно указать несколько значений.

После настройки параметра примените его, как указано в статье [«Изменение параметров ELMA365 Enterprise»](change-settings-enterprise.md#apply-new-parameters).

## Инструмент Anti-affinity

Для повышения отказоустойчивости системы вы можете распределить поды одного типа по разным узлам. Например, задать правила для размещения подов сервиса **mailer**. Если одного узла недостаточно для выполнения вычислений, то работа сервиса продолжится на других узлах.

Чтобы задать такие правила, используйте инструмент Anti-affinity. Он настраивается с помощью параметра \[OBJECT\].

### Настройка параметра podAntiAffinity

Рассмотрим настройку параметра \[OBJECT\] на примере и запретим размещение подов с меткой \[OBJECT\] на одном узле. Для этого в файле \[OBJECT\] перейдите к полю \[OBJECT\] и задайте настройки:

````
global:  
  affinity:  
    podAntiAffinity:  
      requiredDuringSchedulingIgnoredDuringExecution:  
      - labelSelector:  
          matchExpressions:  
          - key: app  
            operator: In  
            values:  
            - mailer  
        topologyKey: kubernetes.io/hostname

````
Где:

- \[OBJECT\] — правило размещения пода на узле;

- \[OBJECT\] — метки подов, к которым применяется правило;

- \[OBJECT\] — логические выражения для фильтрации меток:

	- \[OBJECT\] — имя метки;

	- \[OBJECT\] — оператор сравнения: 

		- \[OBJECT\] — значение метки должно входить в список \[OBJECT\];

		- \[OBJECT\] — значение метки не должно входить в список \[OBJECT\];

		- \[OBJECT\] — у пода должна быть метка \[OBJECT\] с заданным именем;

		- \[OBJECT\]  — у пода не должно быть метки \[OBJECT\] с заданным именем;

- \[OBJECT\] — значения метки, которые используются с операторами \[OBJECT\] и \[OBJECT\]. Можно указать несколько значений;

- \[OBJECT\] — ключ метаданных, который используется для определения топологии узлов, например \[OBJECT\]. 

После настройки параметра примените его, как указано в статье [«Изменение параметров ELMA365 Enterprise»](change-settings-enterprise.md#apply-new-parameters).

## Значения по умолчанию в поле .Values.global.affinity 

Если в поле \[OBJECT\] вы не задали значения, применяется настройка по умолчанию:

````
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

````
В этой конфигурации:

- предотвращается размещение нескольких подов одного приложения (\[OBJECT\]) или релиза (\[OBJECT\]) на одном узле;

- для определения топологии используется ключ \[OBJECT\], который распределяет поды по различным узлам;

- в параметре \[OBJECT\] задаётся приоритет правила, по которому в планировщике Kubernetes выбирается узел для размещения подов.

