Kubernetes v1.35: новые операторы допусков Gt и Lt для точного размещения подов

Kubernetes v1.35 вводит долгожданную альфа-функцию — расширенные операторы допусков (Extended Toleration Operators), которые добавляют операторы Gt (больше) и Lt (меньше) к стандартным механизмам taints и tolerations. Это позволяет кластерным администраторам и разработчикам задавать пороговые услови

Kubernetes v1.35: новые операторы допусков Gt и Lt для точного размещения подов

Kubernetes v1.35 вводит долгожданную альфа-функцию — расширенные операторы допусков (Extended Toleration Operators), которые добавляют операторы Gt (больше) и Lt (меньше) к стандартным механизмам taints и tolerations. Это позволяет кластерным администраторам и разработчикам задавать пороговые условия для размещения подов на узлах, что особенно актуально для гибридных кластеров с разными уровнями SLA, стоимости и производительности. Нововведение решает давнюю проблему: ранее Kubernetes поддерживал только два оператора — Equal (точное совпадение значения) и Exists (наличие ключа). Этого хватало для категориальных сценариев, но не позволяло сравнивать числовые метрики, такие как вероятность отказа узла, стоимость в час или IOPS диска. Теперь, начиная с версии 1.35, в spec.tolerations можно указывать пороговые условия, что открывает новые возможности для оптимизации размещения нагрузок.

Как работают новые операторы Gt и Lt

Новые операторы добавляются в поле operator в spec.tolerations. Они работают с числовыми значениями, которые должны быть представлены в виде строки, но интерпретируются как числа. Например, если узел имеет taint с ключом failure-probability и значением 5, то toleration с оператором Lt и значением 5 будет соответствовать узлам, где значение меньше 5. Аналогично, оператор Gt соответствует значениям больше указанного.

Важно отметить, что операторы Gt и Lt не поддерживают сравнение с отсутствующим значением — если taint не имеет значения, toleration не сработает. Это поведение аналогично оператору Equal, но для числовых сравнений. Также стоит помнить, что значения должны быть числовыми строками, иначе поведение не определено. Разработчики Kubernetes намеренно упростили реализацию, поэтому операторы «меньше или равно» и «больше или равно» пока отсутствуют. Если требуется нестрогое неравенство, можно использовать комбинацию нескольких tolerations или другие подходы.

Какие практические сценарии открывают новые операторы

Новые операторы решают несколько реальных проблем. Например, в кластерах, где смешаны обычные узлы и узлы spot (прерываемые), можно пометить spot-узлы taint-ом с ключом failure-probability и значением, отражающим вероятность прерывания. Высокоприоритетные поды могут использовать toleration с оператором Lt и порогом 5%, чтобы гарантированно попасть только на надежные узлы. В то же время, пакетные задания могут использовать оператор Gt, чтобы направляться на дешевые spot-узлы.

Другой пример — производительность: узлы с разными характеристиками дисков (IOPS) могут быть помечены taint-ом с ключом disk-iops. Латенси-чувствительные сервисы могут требовать IOPS выше 10000, используя toleration с оператором Gt. Это избавляет от необходимости создавать множество дискретных категорий taint или использовать внешние admission контроллеры. Кроме того, операторы Gt и Lt позволяют реализовать более точные политики для гибридных облачных сред, где стоимость и производительность узлов варьируются.

Как включить и использовать новые операторы

Функция реализована как альфа, поэтому для её включения необходимо установить feature gate ExtendedTolerationOperators=true в kube-apiserver и kube-scheduler. Также требуется версия Kubernetes 1.35 или новее. Изменения касаются только API-спецификации PodSpec — в поле tolerations теперь можно указывать операторы Gt и Lt. Сам scheduler использует эти операторы при принятии решений о размещении, сравнивая числовые значения taint-ов и tolerations.

Пример манифеста пода с использованием оператора Gt: yaml apiVersion: v1 kind: Pod metadata: name: high-io-pod spec: tolerations: - key: disk-iops operator: Gt value: "10000" effect: NoSchedule containers: - name: app image: nginx В этом примере под будет размещён только на узлах, где taint disk-iops имеет значение больше 10000. Если taint отсутствует или значение меньше, под не будет запланирован на узел.

Кому и зачем нужно это нововведение

Разработчики, управляющие кластерами с разнородными узлами, получат более гибкий инструмент для политик размещения. Особенно это полезно для платформенных команд, которые хотят установить безопасные умолчания (например, «не размещать обычные поды на узлах с высокой вероятностью отказа»), но при этом разрешить отдельным подам явно выбирать такие узлы с указанием порога.

Для бизнеса это означает более эффективное использование ресурсов: критичные нагрузки получают гарантии SLA, а некритичные — экономят на стоимости. В российском контексте, где популярны гибридные облачные решения и собственные кластеры, эта функция может снизить затраты на инфраструктуру. Например, можно направлять тестовые нагрузки на дешёвые узлы с высоким риском отказа, а продакшен — на надёжные.

Какие ограничения и планы на будущее

Функция находится на стадии альфа, и её API может измениться. Ожидается, что в следующих версиях будут доработаны детали, возможно, добавлены операторы для нестрогих неравенств. Команда Kubernetes приглашает сообщество к тестированию и обратной связи. В планах — стабилизация функции в одном из следующих релизов. Пока же стоит учитывать, что операторы Gt и Lt не поддерживают отрицание, и при необходимости можно комбинировать несколько tolerations или использовать внешние контроллеры.

Итог

Расширенные операторы допусков в Kubernetes 1.35 — это небольшое, но важное улучшение, которое делает систему более гибкой для реальных сценариев с числовыми метриками. Если вы управляете разнородными кластерами, стоит обратить внимание на эту альфа-функцию и начать тестирование уже сейчас. Она позволяет точнее контролировать размещение подов, улучшая SLA и снижая затраты.