- PVSM.RU - https://www.pvsm.ru -

Сегодня 27 сентября, а это означает [1], что в рабочее время (по американскому часовому поясу) мы можем ожидать очередной релиз Kubernetes — 1.12 (впрочем, его официальный анонс иногда задерживается). В общем, самое время продолжить славную традицию и рассказать о наиболее значимых изменениях, что мы и сделаем, руководствуясь публичной информацией от проекта: таблицей Kubernetes features tracking [2], CHANGELOG-1.12 [3], многочисленными issues, pull requests и design proposals. Итак, что нового в K8s 1.12?
Если выделять одну вещь, которая чаще любых других упоминается среди всех issues, связанных с релизом Kubernetes 1.12, пожалуй, ей станет Container Storage Interface (CSI), о котором мы уже писали [4] на днях. По этой причине начнём с изменений в поддержке хранилищ.
Плагины CSI [5] как таковые сохранили [6] статус бета-версии и ожидают признания стабильными к следующему релизу Kubernetes (1.13). Что же нового тогда в поддержке CSI?
В феврале этого года в самой спецификации CSI началась [7] работа над концепцией топологии. Если вкратце, топология — это информация о сегментировании кластеров (например, по «стойкам» для инсталляций on-premise или же по «регионам» и «зонам» для облачных окружений), которую необходимо знать и учитывать системам оркестровки. Зачем? Тома, выделяемые провайдерами хранилищ, вовсе не обязательно будут одинаково доступными во всём кластере, а поэтому знания о топологии необходимы, чтобы эффективно планировать ресурсы и принимать решения по provisioning'у.
Следствием появления топологий в CSI (приняты [8] в спецификацию 1 июня) стала их поддержка в Kubernetes 1.12:
Но на этом связанные с CSI обновления не заканчиваются. Другое важное нововведение в релизе Kubernetes 1.12 — поддержка снапшотов для CSI [14] (пока в статусе альфа-версии). Снапшоты для томов как таковые появились ещё в релизе K8s 1.8 [15]. Основную реализацию, включающую в себя контроллер и provisioner (два отдельных бинарника), было решено вынести во внешний репозиторий [16]. С тех пор появилась поддержка для томов GCE PD, AWS EBS, OpenStack Cinder, GlusterFS и Kubernetes hostPath.
Новый же design proposal [17] призван «продолжить эту инициативу, добавив поддержку снапшотов для CSI Volume Drivers» (поддержка снапшотов в спецификации CSI описана здесь [18]). Поскольку в Kubernetes придерживаются принципа включения в core API минимального набора возможностей, эта реализация (как и для снапшотов в Volume Snapshot Controller) использует CRD (CustomResourceDefinitions).
И ещё пара новых фич для CSI-драйверов:
NodePublish.Представленный в прошлом релизе Kubernetes механизм динамического лимитирования [21] томов на узлах продвинулся с альфа-версии до беты, получив [22]… как вы догадались, поддержку CSI, а также Azure.
Наконец, фича Mount namespace propagation [23], позволяющая монтировать том как rshared (чтобы все примонтированные каталоги контейнера были видны на хосте) и имевшая статус бета-версии в релизе K8s 1.10 [24], объявлена стабильной.
В планировщике Kubernetes 1.12 улучшают производительность благодаря альфа-версии механизма ограничения [25] поиска в кластере узлов, подходящих для планирования пода (feasible nodes). Если раньше для каждой попытки планирования каждого пода kube-scheduler проверял доступность всех узлов и передавал их для оценки, то теперь планировщик будет находить лишь некоторое их количество, после чего останавливать свою работу. При этом в механизме предусмотрен обязательный отбор узлов из разных регионов и зон, а также необходимость просматривать разные узлы в разных циклах планирования (не отбирать первые 100 узлов каждый запуск). Решение о реализации этого механизма приняли, руководствуясь результатами анализа данных по производительности планировщика (если 90-й перцентиль показывал время в 30 мс для пода, то 99-й — уже 60 мс).
Кроме того, дозрели до бета-версии следующие возможности планировщика:
DaemonSet с помощью kube-scheduler (вместо контроллера DaemonSet): его тоже сделали активным по умолчанию;ResourceQuota.
Интересным нововведением стало появление (в статусе альфа-версии) RuntimeClass [29] — нового ресурса уровня кластера, предназначенного для обслуживания параметров исполняемой среды контейнеров (container runtime). RuntimeClasses назначаются на поды через одноимённое поле в PodSpec и реализуют поддержку использования множества исполняемых сред в рамках кластера или узла. Зачем?
«Интерес к использованию разных исполняемых сред в кластере растёт. На данный момент главным мотиватором для этого являются песочницы (sandboxes) и стремление контейнеров Kata и gVisor интегрироваться с Kubernetes. В будущем также потребуют поддержки другие runtime-модели вроде Windows-контейнеров или даже удалённых исполняемых сред. RuntimeClass предлагает способ выбирать между разными исполняемыми средами, настроенными в кластере, и изменять их свойства (и кластером, и пользователем)».
Для выбора между предопределёнными конфигурациями в CRI (Container Runtime Interface) передаётся RuntimeHandler [30], что призвано заменить нынешние аннотации пода:

А конфигурация в containerd для kata-runtime выглядит примерно так:
[plugins.cri.containerd.kata-runtime]
runtime_type = "io.containerd.runtime.v1.linux"
runtime_engine = "/opt/kata/bin/kata-runtime"
runtime_root = ""
Критерием RuntimeClass для альфа-версии является успешная валидация по тесту CRI [31].
Кроме того, до статуса бета-версии выросли механизм регистрации локальных плагинов [32] (включая CSI) в Kubelet и shareProcessNamespace [33] (фича стала включённой по умолчанию).
Главная новость в сетевой части Kubernetes — альфа-версия [34] поддержки SCTP [35] (Stream Control Transmission Protocol). Получив поддержку в Pod, Service, Endpoint и NetworkPolicy, этот телекоммуникационный протокол пополнил ряды TCP и UDP. С новой фичей «приложения, требующие SCTP в качестве L4-протокола для своих интерфейсов, можно будет проще деплоить на Kubernetes-кластерах; например, они смогут использовать service discovery на базе kube-dns, а их взаимодействие будет контролироваться через NetworkPolicy». Подробности о реализации доступны в этом документе [36].
Стабильного статуса также достигли две сетевые возможности, представленные в K8s 1.8: поддержка политик [37] для исходящего трафика EgressRules в NetworkPolicy API и применение правил [38] по CIDR источника/получателя через ipBlockRule.
Улучшения в Horizontal Pod Autoscaler включают в себя:
Не стоит на месте и вертикальное масштабирование подов [42], которому до достижения бета-версии не хватало тестирования пользователями. Авторы сочли его достаточным для релиза K8s 1.12 и напоминают [43], что эта возможность является скорее дополнением к Kubernetes (не входит в ядро системы). Вся разработка ведётся в отдельном репозитории, бета-релиз в котором будет приурочен к релизу Kubernetes.

Схема работы Vertical Pod Autoscaler (VPA) в Kubernetes
Наконец, в K8s 1.12 включены (в виде альфа-версии) результаты работы [44] над «упрощением инсталляции с помощью ComponentConfig» (в рамках sig-cluster-lifecycle), продолжающейся уже почти два года. К сожалению, по непонятной причине (простому недосмотру?), доступ к документу design proposal [45] с подробностями закрыт для анонимных пользователей.
Две новые возможности реализованы в группе api-machinery:
параметр dry-run [46] для apiserver (альфа-версия), который производит имитацию валидации и обработки запросов;Объявлена стабильной:
Добавлены первые реализации (альфа-версии):
kubectl-, в $PATH пользователя. Подробнее см. в design proposal [54].pkg/kubectl/genericclioptions из kubectl в самостоятельный репозиторий.Читайте также в нашем блоге:
Автор: distol
Источник [62]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/294107
Ссылки в тексте:
[1] означает: https://github.com/kubernetes/sig-release/tree/master/releases/release-1.12
[2] таблицей Kubernetes features tracking: https://docs.google.com/spreadsheets/d/177LIKnO3yUmE0ryIg9OBek54Y-abw8OE8pq-9QgnGM4/edit#gid=0
[3] CHANGELOG-1.12: https://github.com/kubernetes/kubernetes/blob/release-1.12/CHANGELOG-1.12.md
[4] уже писали: https://habr.com/company/flant/blog/424211/
[5] Плагины CSI: https://github.com/kubernetes/features/issues/178
[6] сохранили: https://github.com/kubernetes/features/issues/178#issuecomment-409407224
[7] началась: https://github.com/container-storage-interface/spec/pull/188
[8] приняты: https://github.com/container-storage-interface/spec/pull/188#event-1656639778
[9] поддержка как таковая: https://github.com/kubernetes/features/issues/557
[10] поддержка топологий в динамическом provisioning'е: https://github.com/kubernetes/features/issues/561
[11] Volume Topology-aware Scheduling: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/volume-topology-scheduling.md
[12] поддержка топологии GCE PD: https://github.com/kubernetes/features/issues/558
[13] поддержка топологии AWS EBS: https://github.com/kubernetes/features/issues/567
[14] поддержка снапшотов для CSI: https://github.com/kubernetes/features/issues/177
[15] релизе K8s 1.8: https://habr.com/company/flant/blog/338230/
[16] внешний репозиторий: https://github.com/kubernetes-incubator/external-storage/tree/master/snapshot
[17] design proposal: https://github.com/kubernetes/community/blob/9adb191917a4a5e29342254f9eda7dd83a7d3802/contributors/design-proposals/storage/csi-snapshot.md
[18] здесь: https://github.com/container-storage-interface/spec/pull/224
[19] регистрировать себя: https://github.com/kubernetes/features/issues/594
[20] получать информацию о поде: https://github.com/kubernetes/features/issues/603
[21] механизм динамического лимитирования: https://github.com/kubernetes/features/issues/554
[22] получив: https://github.com/kubernetes/features/issues/554#issuecomment-418933754
[23] Mount namespace propagation: https://github.com/kubernetes/features/issues/432
[24] релизе K8s 1.10: https://habr.com/company/flant/blog/353114/
[25] механизма ограничения: https://github.com/kubernetes/kubernetes/issues/66627
[26] Taint node by Condition: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#taint-nodes-by-condition
[27] условий: https://kubernetes.io/docs/concepts/architecture/nodes/#condition
[28] указание класса приоритета: https://github.com/kubernetes/features/issues/612
[29] RuntimeClass: https://github.com/kubernetes/features/issues/585
[30] RuntimeHandler: https://github.com/tallclair/k8s-community/blob/83e09c413e9f14b2b4dc113424e2f0ff9eb5e65c/keps/sig-node/0014-runtime-class.md#runtime-handler
[31] валидация по тесту CRI: https://github.com/kubernetes-incubator/cri-tools/blob/master/docs/validation.md
[32] механизм регистрации локальных плагинов: https://github.com/kubernetes/features/issues/595
[33] shareProcessNamespace: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
[34] альфа-версия: https://github.com/kubernetes/features/issues/614
[35] SCTP: https://en.wikipedia.org/wiki/Stream_Control_Transmission_Protocol
[36] этом документе: https://github.com/kubernetes/community/blob/master/keps/sig-network/0015-20180614-SCTP-support.md
[37] поддержка политик: https://github.com/kubernetes/features/issues/366
[38] применение правил: https://github.com/kubernetes/features/issues/367
[39] обновлённый алгоритм: https://github.com/kubernetes/features/issues/591
[40] новом разделе документации: https://github.com/DirectXMan12/kubernetes.github.io/blob/fc1e01dd72edfbe0368576a446f13f24b23a674b/content/en/docs/tasks/run-application/horizontal-pod-autoscale.md#algorithm-details
[41] произвольных/пользовательских метрик: https://github.com/kubernetes/features/issues/117
[42] вертикальное масштабирование подов: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
[43] напоминают: https://github.com/kubernetes/features/issues/21#issuecomment-409280296
[44] работы: https://github.com/kubernetes/features/issues/115
[45] документу design proposal: https://docs.google.com/document/d/1arP4T9Qkp2SovlJZ_y790sBeiWXDO6SG10pZ_UUU-Lc/edit
[46] параметр dry-run: https://github.com/kubernetes/features/issues/576
[47] Resource Quota API: https://github.com/kubernetes/features/issues/587
[48] поддержка: https://github.com/kubernetes/features/issues/513
[49] поддержка: https://github.com/kubernetes/features/issues/514
[50] поддержки: https://github.com/kubernetes/features/issues/586
[51] поддержки: https://github.com/kubernetes/features/issues/604
[52] cross resource group: https://github.com/kubernetes/cloud-provider-azure/blob/master/docs/using-cross-resource-group-nodes.md
[53] обновлённого механизма плагинов: https://github.com/kubernetes/features/issues/579
[54] design proposal: https://github.com/juanvallejo/community/blob/992ad98816881865c04526466a1c163bcbe17ef0/keps/sig-cli/0024-kubectl-plugins.md
[55] идеи по выделению: https://github.com/kubernetes/features/issues/581
[56] вывода на стороне сервера: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/server-get.md
[57] TTL after finish: https://github.com/kubernetes/features/issues/592
[58] Kubernetes 1.11: обзор основных новшеств: https://habr.com/company/flant/blog/415349/
[59] Kubernetes 1.9: обзор основных новшеств: https://habr.com/company/flant/blog/344220/
[60] Четыре релиза 1.0 от CNCF и главные анонсы про Kubernetes с KubeCon 2017: https://habr.com/company/flant/blog/344098/
[61] Docker 17.06 и Kubernetes 1.7: ключевые новшества: https://habr.com/company/flant/blog/332160/
[62] Источник: https://habr.com/post/424331/?utm_campaign=424331
Нажмите здесь для печати.