Для повышения отказоустойчивости и производительности системы вы можете задать гибкие правила распределения нагрузки на узлах при помощи инструментов:
- Affinity — определить гибкие правила для размещения подов по отношению друг к другу или на определённых узлах;
- Anti-affinity — предотвратить размещение подов одного типа на одном узле или в одной топологии.
Также для настройки размещения подов можно использовать:
- параметр nodeSelector — задать базовое размещение по меткам узлов;
- инструменты taints и tolerations — выделить узлы для критически важных сервисов и запретить другую нагрузку на них.
Инструмент 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 выбирается узел для размещения подов.