Селекторы узлов и аффинность
Управляйте размещением Pods с помощью селекторов узлов и более выразительных правил аффинности узлов и Pods.
«Селекторы узлов и аффинность» — бесплатный урок Kubernetes Basics на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kubernetes Basics, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kubernetes Basics содержит 4 уроков всего.
Управление размещением подов
По умолчанию Kubernetes планирует поды на любом доступном узле. Но что делать, если Вам нужен больший контроль?
Иногда требуется запускать поды на определённых узлах. Возможно, на этих узлах есть специальное оборудование или лицензии либо они находятся в определённых зонах доступности.
В этом уроке рассматривается, как направлять работу планировщика Kubernetes с помощью селекторов узлов и привязки к узлам.
Зачем направлять работу планировщика?
Представьте, что у Вас есть под базы данных, которому необходимо работать на узле с высокопроизводительными SSD, или приложение с интенсивным использованием GPU, которому требуется определённое оборудование.
Возможно, Вы также захотите разместить некоторые поды подальше друг от друга для повышения отказоустойчивости или обеспечить их запуск на узлах с определёнными операционными системами.
Kubernetes предоставляет инструменты для описания таких предпочтений при планировании.
У узлов есть метки
Прежде чем указывать подам, куда им направляться, узлам нужны идентификаторы! Kubernetes использует метки, чтобы идентифицировать узлы по их характеристикам.
- Метки представляют собой пары «ключ — значение», например
disk=ssdилиgpu=true. - Вы можете добавлять пользовательские метки к узлам с помощью команды
kubectl label nodes <node-name> <key>=<value>. - С помощью этих меток выбираются определённые узлы для размещения подов.
Селекторы узлов: простое совпадение
Самый простой способ ограничить под определённым набором узлов — использовать nodeSelector.
Это поле в спецификации пода, принимающее набор пар «ключ — значение». Под будет запланирован только на узлах, у которых есть все эти метки.
Это всё равно что сказать: «Мне нужен узел, который точно соответствует этим условиям».
Селектор узлов в действии
Предположим, что у нас есть узлы с меткой disk=ssd. Вот как запустить под только на этих узлах:
apiVersion: v1
kind: Pod
metadata:
name: ssd-app
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
disk: ssdПривязка к узлам: расширенное сопоставление
Хотя nodeSelector прост в использовании, он очень строг. Что делать, если Вам нужны «предпочтительные» узлы или более сложные правила сопоставления?
Привязка к узлам предоставляет больше гибкости. Она позволяет задавать «мягкие» или «жёсткие» требования к размещению подов на узлах с определёнными метками.
Для этого используется более мощный синтаксис с операторами In, NotIn, Exists, DoesNotExist, Gt, Lt.
Обязательная и предпочтительная привязка
Существует два основных типа привязки к узлам:
requiredDuringSchedulingIgnoredDuringExecution: под обязательно должен быть запланирован на узле, соответствующем правилам. Если такого узла нет, под не будет запланирован.preferredDuringSchedulingIgnoredDuringExecution: планировщик пытается найти узел, соответствующий правилам, но если доступных узлов нет, всё равно запланирует под в другом месте. Это подход «по возможности».
Обязательная привязка к узлу
Вот под, которому требуется узел с меткой env=production. Если такого узла нет, под останется в состоянии ожидания.
apiVersion: v1
kind: Pod
metadata:
name: prod-app
spec:
containers:
- name: my-container
image: httpd
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- productionПривязка подов: важны другие поды
Что делать, если Вы хотите планировать поды в зависимости от того, где работают другие поды?
- Привязка подов: направляет поды на узлы, где уже работают другие поды с определёнными метками. Это полезно для совместного размещения часто взаимодействующих служб.
- Антипривязка подов: не позволяет размещать поды на узлах, где работают другие поды с определёнными метками. Это удобно для распределения реплик по узлам и обеспечения высокой доступности.
Антипривязка подов на практике
Этот манифест гарантирует, что никакие два пода с меткой app=my-web не будут запланированы на одном узле. Это повышает отказоустойчивость.
topologyKey задаёт область, в которой действует антипривязка (например, узел или зона).
apiVersion: v1
kind: Pod
metadata:
name: web-app-pod
labels:
app: my-web
spec:
containers:
- name: web-container
image: busybox
command: ["sh", "-c", "echo 'Hello from web-app'; sleep 3600"]
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my-web
topologyKey: "kubernetes.io/hostname"Проверьте свои знания
Вы хотите гарантировать, что критически важные поды базы данных не должны планироваться на узлах с меткой zone=dev. Какое правило планирования следует использовать для такого строгого исключения на основе меток узлов?
Итоги: управление планированием
Отличная работа! Вы изучили эффективные способы управления размещением подов:
- Метки узлов: пары «ключ — значение», описывающие характеристики узлов.
- Селекторы узлов: простое строгое сопоставление для планирования подов на узлах с определёнными метками.
- Привязка к узлам: более гибкие правила (обязательные или предпочтительные) выбора узла с использованием операторов.
- Привязка и антипривязка подов: совместное или раздельное размещение подов в зависимости от расположения других подов.
Эти инструменты необходимы для оптимизации использования ресурсов, обеспечения отказоустойчивости и удовлетворения конкретных потребностей приложений.
Часто задаваемые вопросы
Урок «Селекторы узлов и аффинность» бесплатный?
Да — полный текст урока «Селекторы узлов и аффинность» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kubernetes Basics, подпишись на CoddyKit PRO. Курс Kubernetes Basics содержит 4 уроков всего.
Чему я научусь в уроке «Селекторы узлов и аффинность»?
Управляйте размещением Pods с помощью селекторов узлов и более выразительных правил аффинности узлов и Pods. Ты практикуешь Kubernetes Basics с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kubernetes Basics?
Предыдущий опыт не требуется. Kubernetes Basics на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Селекторы узлов и аффинность»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kubernetes Basics?
Да. Каждый урок Kubernetes Basics включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Запросы и ограничения ресурсов
- Селекторы узлов и аффинность
- Метki и допускающие правила
- Приоритет и вытеснение подов