2025 годы завершается релизом Kubernetes v1.35 (кодовое имя «Timbernetes»), который принес 60 улучшений, из которых 17 перешли в статус Stable. Наши бэкенды, фронтенды и прочие инструменты деплоятся в Кубернетесе, поэтому мы с вниманием следим за изменениями в мире Cloud Native. В этом блоге коротко расскажем о самых важных изменениях в версии k8s 1.35.
Вертикальное масштабирование "на лету"
Еще в далеком феврале 2024 года мы писали об этой фиче - изменении ресурсов контейнера в поде без его перезагрузки. С релизом 1.35 эта функция перешла в Stable (KEP #1287). Если раньше для изменения лимитов CPU или RAM требовался перезапуск пода, что критично для Stateful-нагрузок, то теперь можно корректировать ресурсы без рестарта контейнеров.
Пользователи Vertical Pod Autoscaler, которые боялись перезагружать контейнеры, могут включить его в рабочий режим и не беспокоится о потенциальном даунтайме.
А вот такая ошибка больше не будет появлятся при изменении ресурсов контейнера:
The Pod "resize-test" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`,`spec.initContainers[*].image`,`spec.activeDeadlineSeconds`,`spec.tolerations` (only additions to existing tolerations),`spec.terminationGracePeriodSeconds` (allow it to be set to 1 if it was previously negative)
Gang Scheduling - контроль группы подов
Функция Gang Scheduling добавлена в Alpha ветку (KEP #4671). Она позволяет внедрить стратегию "все или ничего" для планирования запуска группы подов. Группа подов будет запущена, только если в кластере достаточно ресурсов для одновременного запуска всех ее подов. Это особенно удобно для сценариев, в которых поды взаимозависимы и должны работать вместе. В сообществе широко обсуждают важность этой фичи для распределенного обучения AI-моделей, когда необходимо, чтобы все обучающие поды стартовали одновременно. Это позволяет избежать ситуации, когда часть процессов ожидает выделения ресурсов, что приводит к простою вычислительных мощностей и снижению общей эффективности кластера.
KYAML - пока еще не JSON
KYAML — новый, более безопасный формат вывода для kubectl, призванный устранить самые частые ошибки при работе с YAML в Kubernetes. Он перешёл в статус Beta, начиная с версии k8s 1.35 (KEP #5295).
Это специальное подмножество YAML, в котором все строки в кавычках, а отступы не влияют на структуру данных. Это решает проблемы автоматического преобразования типов (когда NO превращается в false) и упрощает работу с шаблонами в Helm или Kustomize, поскольку код становится нечувствительным к пробелам.
Вместо стандартного YAML с риском ошибиться в отступах, KYAML использует явные скобки:
Это специальное подмножество YAML, в котором все строки в кавычках, а отступы не влияют на структуру данных. Это решает проблемы автоматического преобразования типов (когда NO превращается в false) и упрощает работу с шаблонами в Helm или Kustomize, поскольку код становится нечувствительным к пробелам.
Вместо стандартного YAML с риском ошибиться в отступах, KYAML использует явные скобки:
{
apiVersion: "v1",
kind: "Service",
metadata: {
name: "my-service",
labels: {
app: "my-app",
},
},
}Формат остаётся полностью совместимым с существующими YAML-парсерами, но делает конфигурации более предсказуемыми и устойчивыми к ошибкам.
Числовые tolerations: планирование по SLA в Kubernetes
В Kubernetes 1.35 механизм taints и tolerations получил улучшение (KEP #5471) — поддержку числовых операторов Gt (больше) и Lt (меньше). Это позволяет разработать политики для работы с нодами с определенным уровнем надежности, что идеально для гибридных кластеров, сочетающих дорогие и дешёвые ноды (например, spot инстансы).
Ключевое отличие от NodeAffinity — поддержка NoExecute. Это позволяет не только контролировать размещение, но и автоматически вытеснять под с узла, если его SLA (например, доступность spot ноды) упадёт ниже заданного порога.
Вы ставите на spot инстанс taint sla=500:NoExecute. По умолчанию поды на неё не попадут. А вот какая-нибудь jobа может явно "согласиться" на работу, если SLA больше 400, добавив toleration:
Ключевое отличие от NodeAffinity — поддержка NoExecute. Это позволяет не только контролировать размещение, но и автоматически вытеснять под с узла, если его SLA (например, доступность spot ноды) упадёт ниже заданного порога.
Вы ставите на spot инстанс taint sla=500:NoExecute. По умолчанию поды на неё не попадут. А вот какая-нибудь jobа может явно "согласиться" на работу, если SLA больше 400, добавив toleration:
tolerations:
- key: "sla"
operator: "Gt"
value: "400"
effect: "NoExecute"Это создаёт безопасную по модель: администратор централизованно задаёт риск на узлах, а разработчики явно "подписываются" на приемлемый для их сервисов уровень.
Node Declared Features: автоматическое управление версионной несовместимостью
Начиная с альфы в Kubernetes 1.35, добавляется фреймворк Node Declared Features. Его цель — автоматически решать проблему, когда новая функция включается на уровне кластера, но ноды обновляются постепенно и её не поддерживают.
Как это работает:
Ноды начинают автоматически объявлять в своём статусе список доступных функций. На основе этих данных система принимает решения:
- Планировщик не станет размещать под, которому нужна новая фича, на ноде, которая её не поддерживает.
- Контроллер отклонит операцию (например, изменение ресурсов пода), если нода, где он работает, не обладает необходимой функциональностью.
Например: Фича "изменение ресурсов пода на лету". Если нода заявляет о поддержке GuaranteedQoSPodCPUResize, планировщик сможет разместить на нём соответствующие поды, а контроллер разрешит их динамическое обновление.
В чём выгода: Этот механизм устраняет рутинную работу. Администраторам больше не нужно вручную настраивать метки и правила для каждой новой функции Kubernetes — система автоматически обеспечивает совместимость.
Прощай, Ingress NGINX
В этом релизе продолжается активный переход от Ingress NGINX к Gateway API. Также прекращается поддержка первой версии контрольных групп Linux (cgroup v1), так как управление ресурсами полностью переходит на cgroup v2.
Полный список изменений в версии 1.35 доступен в официальном Changelog 1.35.