TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #122 40
Про affinity и antiAffinity в k8s

В kubernetes благодаря этим свойствам мы можем управлять жестко или не очень тем, где будут размещены наши поды.

Есть два основных типа:
1. Node affinity - управляет тем, на каких узлах следует размещать поды, например по меткам узлов.
2. Pod affinity/AntiAffinity - управляет тем, где поды должны или не должны размещаться, относительно других подов.

У каждого из них есть два основных типа использования:
requiredDuringSchedulingIgnoredDuringExecution - обязательное условие, если по нужным параметрам нода не будет найдена, под "зависнет" в Pending.
preferredDuringSchedulingIgnoredDuringExecution - предпочтительное условие, то есть kubernetes(scheduler) постарается разместить под на подходящих узлах, но не гарантирует этого.

Node Affinity:
Позволяет задавать условия, по которым Pod будет размещен на узле, подходящим по node labels.
Пример размещения пода на узле с меткой disktype=ssd:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd


У nodeAffinity нет свойства anti, как например у PodAffinity, но похожего поведения можно добиться используя операторы NotIn или DoesNotExist, чтобы исключить узлы с определенными метками.
Пример с исключением запуска подов на узле с лейблом environment=production:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: environment
operator: NotIn
values:
- production


Pod Affinity и Pod AntiAffinity:
Просто affinity (без anti) указывает на то, чтобы поды запускались на узлах, на которых уже есть поды с определенным лейблом.
Пример размещение подов на одном узле с другими подами с лейблом app=frontend:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- frontend
topologyKey: "kubernetes.io/hostname"


AntiAffinity - противоположность для просто affinity. То есть говорим НЕ размещать поды на узлах, на которых уже есть поды с определенным лейблом.
Пример с лейблом app=backend:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- backend
topologyKey: "kubernetes.io/hostname"


#kubernetes
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →