Kubernetes планирует рабочие нагрузки на основе pod‑ов. После создания рабочей нагрузки планировщик автоматически назначает pod‑ы. Например, планировщик распределяет pod‑ы по узлам, которые имеют достаточные ресурсы.
Хотя поведение планировщика по умолчанию достаточно для большинства потребностей, могут возникнуть ситуации, когда требуется более точный контроль над тем, где развертываются pod‑ы. Для решения этой задачи Kubernetes позволяет настраивать политики планирования при создании рабочих нагрузок. Например, вам может потребоваться:
Используйте методы, перечисленные в таблице ниже, чтобы выбрать политику планирования pod‑ов в Kubernetes.
Scheduling Policy | YAML Field | Description | Reference |
|---|---|---|---|
Node allocation | nodeSelector | Базовый режим планирования, при котором Kubernetes выбирает целевой узел в соответствии с метками узла. Это означает, что pod‑ы планируются только на узел, имеющий конкретную метку. | |
Node affinity | nodeAffinity | Node affinity более выразителен, чем nodeSelector. Он позволяет использовать Label Selectors для фильтрации узлов, которым требуется аффинити на основе их меток, и выбирать между Required и Preferred для Affinity Rules. ПРИМЕЧАНИЕ: Если одновременно указаны nodeSelector и nodeAffinity, pod может быть запланирован на кандидатный узел только при выполнении обоих условий. | |
Планирование аффинити или антиаффинити рабочей нагрузки | podAffinity/podAntiAffinity | Используйте Label Selectors для идентификации pod‑ов для правил аффинити или антиаффинити. Затем вы можете планировать новые pod‑ы рабочей нагрузки либо вместе с целевыми pod‑ами на том же узле (или в том же домене топологии), либо отдельно от них. Кроме того, задайте Affinity Rules как Required и Preferred. ПРИМЕЧАНИЕ: Аффинити и антиаффинити рабочей нагрузки требуют определённого объёма вычислительного времени, что значительно замедляет планирование в кластерах большого масштаба. Не включайте аффинити и антиаффинити рабочей нагрузки в кластере, содержащем сотни узлов. | Настройка планирования аффинити или антиаффинити рабочей нагрузки (podAffinity или podAntiAffinity) |
Политики планирования, использующие node affinity или аффинити/антиаффинити рабочей нагрузки, могут включать как жёсткие, так и мягкие ограничения для удовлетворения сложных требований к планированию. Жёсткие ограничения должны быть выполнены, а мягкие — насколько это возможно.
Тип правила | Поле YAML | Описание | Ссылка |
|---|---|---|---|
Требуется | requiredDuringSchedulingIgnoredDuringExecution | Жёсткое ограничение. Планировщик размещает pod только на узлах, соответствующих указанным правилам. Если совпадений нет, pod остаётся незапланированным. | |
Предпочтительно | preferredDuringSchedulingIgnoredDuringExecution | Мягкое ограничение. Планировщик предпочитает узлы, соответствующие указанным правилам. Если совпадений нет, pod всё равно будет размещён на любом доступном узле. При использовании предпочтительной аффинности можно задать поле веса в диапазоне от 1 до 100 для каждого pod. Присвоение более высокого веса pod увеличит его приоритет в процессе планирования. |
Поле YAML requiredDuringScheduling или preferredDuringScheduling в указанных выше правилах аффинности указывает, что правило метки должно быть принудительно выполнено или должно быть выполнено насколько возможно во время планирования. IgnoredDuringExecution указывает, что любые изменения метки узла после того, как Kubernetes планирует pod, не повлияют на работу pod и не приведут к его повторному планированию. Однако, если kubelet на узле перезапускается, kubelet повторно проверит правило аффинности узла, и pod всё равно будет размещён на другом узле.
При создании scheduling policy используйте логические операторы label selector для фильтрации значений меток и определения объектов, которым требуется affinity или anti-affinity.
Parameter | Description | Example YAML |
|---|---|---|
key | Ключ метки. Объекты, соответствующие критериям фильтра, должны содержать метку с этим ключом, а значение метки должно соответствовать логической операции между списком значений метки (values field) и логическими операторами. | В приведённом ниже примере объекты, соответствующие критериям фильтра, должны иметь метку с ключом topology.kubernetes.io/zone и значением либо az1, либо az2.
|
operator | Логический оператор, который можно использовать для определения правил фильтрации значений меток. Параметры:
| |
значения | Значения меток |