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

Kubernetes 1.12: обзор основных новшеств

Kubernetes 1.12: обзор основных новшеств - 1

Сегодня 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-драйверов:

  • альфа-версия возможности драйвера регистрировать себя [19] в Kubernetes API (с целью упростить для пользователей обнаружение драйверов, установленных в кластере, и позволить драйверам влиять на процессы взаимодействия Kubernetes с ними);
  • альфа-версия возможности драйвера получать информацию о поде [20], запросившем том через 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 мс).

Кроме того, дозрели до бета-версии следующие возможности планировщика:

  • Taint node by Condition [26], появившаяся ещё в K8s 1.8 и позволяющая помечать узел определённым статусом (для дальнейших действий) при наступлении определённых событий: теперь контроллер жизненного цикла узла автоматически создаёт taints, а планировщик их проверяет (вместо условий [27]);
  • планирование подов в DaemonSet с помощью kube-scheduler (вместо контроллера DaemonSet): его тоже сделали активным по умолчанию;
  • указание класса приоритета [28] в ResourceQuota.

Узлы кластера

Интересным нововведением стало появление (в статусе альфа-версии) RuntimeClass [29] — нового ресурса уровня кластера, предназначенного для обслуживания параметров исполняемой среды контейнеров (container runtime). RuntimeClasses назначаются на поды через одноимённое поле в PodSpec и реализуют поддержку использования множества исполняемых сред в рамках кластера или узла. Зачем?

«Интерес к использованию разных исполняемых сред в кластере растёт. На данный момент главным мотиватором для этого являются песочницы (sandboxes) и стремление контейнеров Kata и gVisor интегрироваться с Kubernetes. В будущем также потребуют поддержки другие runtime-модели вроде Windows-контейнеров или даже удалённых исполняемых сред. RuntimeClass предлагает способ выбирать между разными исполняемыми средами, настроенными в кластере, и изменять их свойства (и кластером, и пользователем)».

Для выбора между предопределёнными конфигурациями в CRI (Container Runtime Interface) передаётся RuntimeHandler [30], что призвано заменить нынешние аннотации пода:

Kubernetes 1.12: обзор основных новшеств - 2

А конфигурация в 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.

Kubernetes 1.12: обзор основных новшеств - 3
Схема работы Vertical Pod Autoscaler (VPA) в Kubernetes

Наконец, в K8s 1.12 включены (в виде альфа-версии) результаты работы [44] над «упрощением инсталляции с помощью ComponentConfig» (в рамках sig-cluster-lifecycle), продолжающейся уже почти два года. К сожалению, по непонятной причине (простому недосмотру?), доступ к документу design proposal [45] с подробностями закрыт для анонимных пользователей.

Другие изменения

API

Две новые возможности реализованы в группе api-machinery:

  • параметр dry-run [46] для apiserver (альфа-версия), который производит имитацию валидации и обработки запросов;
  • Resource Quota API [47] (сразу бета-версия), определяющий ограниченные по умолчанию ресурсы (вместо текущего поведения, когда потребление ресурсов не ограничено, если квота не задана).

Azure

Объявлена стабильной:

Добавлены первые реализации (альфа-версии):

Kubectl

  • Реализована альфа-версия обновлённого механизма плагинов [53], что позволяет как добавлять новые команды, так и переписывать уже существующие подкоманды любого уровня вложенности. Он сделан похожим на Git и просматривает исполняемые файлы, начинающиеся с kubectl-, в $PATH пользователя. Подробнее см. в design proposal [54].
  • Реализована бета-версия идеи по выделению [55] пакета pkg/kubectl/genericclioptions из kubectl в самостоятельный репозиторий.
  • Объявлена стабильной функция вывода на стороне сервера [56] (server-side printing).

Прочие

  • Представлена альфа-версия нового механизма TTL after finish [57], предназначенного для ограничения времени жизни закончивших выполняться Jobs и Pods. По истечении заданного TTL объекты будут автоматически вычищены без необходимости в пользовательском вмешательстве.
  • Объявлена стабильной генерация в Kubelet приватного ключа и CSR (TLS Bootstrap) для подписи сертификата на уровне кластера.
  • Перешла в статус бета-версии ротация серверного TLS-сертификата в Kubelet.

P.S.

Читайте также в нашем блоге:

Автор: 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