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

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

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

В понедельник должен был [1] официально состояться (но пока этого не случилось) очередной релиз Kubernetes — 1.15 [2]. По сложившейся для нашего блога традиции, рассказываем о наиболее значимых изменениях в новой версии.

Информация, использованная для подготовки этого материала, взята из таблицы Kubernetes enhancements tracking [3], CHANGELOG-1.15 [4] и сооветствующих issues, pull requests, а также Kubernetes Enhancement Proposals (KEP). Поскольку на следующей неделе пройдет конференция KubeCon в Шанхае, у этого релиза был сокращённый 11-недельный цикл (вместо 12 недель), что на количество значимых изменений, впрочем, заметно не повлияло. Итак, поехали!..

Хранилища данных

Представлен новый API ExecutionHook, позволяющий динамически исполнять пользовательские команды в pod'е/контейнере или группе pod'ов/контейнеров, а вместе с ним — соответствующий контроллер (ExecutionHookController), реализующий управление жизненным циклом хука. Мотивацией к появлению этой фичи стало желание предоставить пользователям возможность создавать/удалять снапшоты в соответствии с логикой работы приложения, т.е. выполнять какие-то специфичные для приложения команды до и после создания снапшота. Предполагается, что такие хуки также могут быть полезны и для других ситуаций — например, выполнения обновлений, отладки, обновления конфигурационных файлов, рестарта контейнера, подготовки к иным событиям вроде миграции базы данных. Текущий статус — альфа-версия (ожидается перевод в бету для следующего релиза), подробности — в KEP [5].

В ephemeral-storage, что позволяет разграничивать для конкретных pod'ов/контейнеров объём общего разделяемого пространства (shared storage), добавлена поддержка квот [6] файловой системы. Этот новый механизм использует квоты на проект (project quotas [7]), доступные в XFS и ext4, обеспечивая мониторинг потребления ресурсов и опциональное накладывание лимитов на них. Текущий статус — альфа-версия; планы по будущим релизам пока не уточняются.

Ещё одна новая возможность, представленная sig-storage, — использование существующих PVC в качестве DataSource для создания новых PVC. Иными словами, это реализация функции клонирования томов. Клоны следует отличать от снапшотов, поскольку каждый клон является новым и «полноценным» томом: он создан как копия уже существующего, однако полностью следует жизненному циклу обычных томов (в отличие от снапшотов, хоть и являющихся копиями томов на определённый момент времени, но не самостоятельными томами). Иллюстрация использования возможности:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
    name: pvc-2
    namespace: myns
spec:
  capacity:
    storage: 10Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: pvc-1

В этом случае будет создан новый самостоятельный PV/PVC (pvc-2), содержащий те же данные, что были на pvc-1. При этом указано, что новый PVC должен иметь то же пространство имён, что и оригинальный.

Существующие ограничения — поддержка только динамического provisioner'а и только плагинов CSI (у них должна присутствовать capability CLONE_VOLUME). Подробнее читайте в KEP [8].

До статуса бета-версии (а значит и активации в инсталляциях Kubernetes по умолчанию) «доросли» следующие возможности:

  • Функция [9] расширения размера Persistent Volume «онлайн», т.е. без необходимости в рестарте pod'а, использующего соответствующий PVC. Впервые (в статусе альфа-версии) она появилась в K8s 1.11.
  • Поддержка [10] переменных окружения для названий директорий, монтируемых как subPath, которая была впервые представлена в K8s 1.11 и получила развитие в прошлом 1.14.

А вот процесс миграции внутренностей старых плагинов для хранилищ, реализованных внутри кодовой базы Kubernetes (in-tree), в пользу плагинов для нового интерфейса CSI затянулся. Ожидалось, что к релизу 1.15 завершат миграцию всех плагинов облачных провайдеров, однако принято решение [11] оставить статус альфа-версии, поскольку фича зависит от API, представленных в K8s 1.15 и пока что реализованных тоже лишь в альфа-версии (в частности, речь идёт об улучшениях в поддержке Azure: плагинов Azure File [12] и Azure Disk [13] в csi-translation-lib).

Планировщик

Два заметных нововведения — оба пока в виде альфа-версий — доступны в планировщике Kubernetes.

Первое — фреймворк планирования (Kubernetes Scheduling Framework [14]), представляющий собой новый набор API для плагинов, расширяющих возможности существующего планировщика. Плагины создаются вне основного репозитория (out-of-tree), но входят в состав планировщика при компиляции. Таким образом, функциональное ядро планировщика остаётся максимально простым и удобным в поддержке, а дополнительные возможности реализуются отдельно, причём без тех многочисленных ограничений, которыми «страдал» нынешний способ [15] расширения фич планировщика (с помощью webhooks).

В новом фреймворке каждая попытка планирования pod'а разбивается на два этапа:

  • планирования (scheduling cycle) — где выбирается узел для pod'а,
  • и привязывания (binding cycle) — где выбранное решение реализуется в рамках кластера.

На каждом из этих этапов (вместе их ещё называют контекстом планирования — scheduling context) существует множество точек расширения (extension points), на каждой из которых могут вызываться плагины фреймворка.

Kubernetes 1.15: обзор основных новшеств - 2
(Жизненный цикл для вызова плагинов в Scheduling Framework.)

В рамках альфа-версии фреймворка реализованы только точки Reserve, Unreserve и Prebind. Подробности об этом масштабном нововведении читайте в KEP [16].

Второе — опция Non-Preempting [17] для PriorityClasses.

Классы приоритетов получили стабильный (GA) статус в прошлом релизе Kubernetes, что повлияло на процессы планирования и выборки pod'ов: pod'ы планируются в соответствии с приоритетом, а если pod не может быть создан из-за недостатка ресурсов, то pod'ы с более низким приоритетом могут вытесняться для освобождения необходимого пространства.

Новая опция — Preempting, определяемая как булев в структуре PriorityClass, означает: если pod ожидает своего планирования и имеет Preempting=false, его создание не приведёт к вытеснению других pod'ов. Это поле появляется в PodSpec в процессе pod admission (аналогично тому, как и значение PriorityClass). Подробности о реализации — в KEP [18].

API Machinery

Для CustomResources представлены улучшения, призванные реализовать для данных, хранимых таким образом (в рамках JSON в CRD), поведение, которое лучше соответствует общепринятому в Kubernetes API (для «родных» объектов K8s):

  • автоматическое удаление полей, не указанных в схемах валидации OpenAPI, — подробности см. в KEP «Pruning for Custom Resources [19]»;
  • возможность задавать в схемах валидации OpenAPI v3 значения по умолчанию (defaulting) для полей, что особенно важно для сохранения совместимости API при добавлении объектам новых полей, — подробности см. в KEP «Defaulting for Custom Resources [20]».

Обе фичи изначально планировались на включение в состав релиза K8s 1.12, однако только теперь представлены в виде альфа-версий.

Этим изменения в CRD не ограничились:

  • возможность Publish CRD OpenAPI [21] — т.е. валидация CustomResources на стороне сервера (с помощью схемы OpenAPI v3), представленная в прошлом релизе Kubernetes, — достигла бета-версии и теперь включена по умолчанию;
  • механизм [22] преобразования версий CRD-ресурсов, основанный на внешних webhooks, тоже переведён в бета-версию.

Другое интересное нововведение получило название Watch bookmark [23]. Его суть сводится к добавлению нового типа события в Watch API [24]Bookmark. Этот тип означает метку, что все объекты до определённой resourceVersion уже были обработаны watch'ем. Такой механизм позволит снизить нагрузку на kube-apiserver, уменьшив количество событий, которые требуется обрабатывать при каждом перезапуске watch'а, а также снизить количество нежелательных ошибок типа «resource version too old». В Kubernetes 1.15 фича имеет статус альфа-версии, а её повышение до беты ожидается к следующему релизу.

  Added    EventType = "ADDED"
  Modified EventType = "MODIFIED"
  Deleted  EventType = "DELETED"
  Error    EventType = "ERROR"
  Bookmark EventType = "BOOKMARK"

(Возможные типы событий в Watch API.)

В Admission Webhooks:

  • добавлена [25] поддержка селектора объектов (object selector [26]) в дополнение к существующим селекторам пространств имён;
  • реализована [27] возможность регистрации конкретной версии ресурса и вызова, когда модифицируется любая более старая версия этого ресурса;
  • в AdmissionReview API добавлено [28] поле Option, сообщающее об опциях выполняемой операции.

Сеть

Значимое новшество в сетевой части Kubernetes — так называемая «защита финализатора» (Finalizer Protection) для балансировщиков нагрузки. Теперь перед тем, как удалять ресурсы LoadBalancer'а, производится проверка, что соответствующий ресурс Service'а не был полностью удалён. Для этого к каждому сервису с type=LoadBalancer прикрепляется так называемый finalizer: при удалении такого сервиса реальное удаление ресурса блокируется, пока finalizer не будет удалён, а сам finalizer не удаляется до тех пор, пока не завершится «подчистка» ресурсов соответствующего балансировщика нагрузки (service.kubernetes.io/load-balancer-cleanup). Текущая версия реализации — альфа-версия, а подробности о ней можно найти в KEP [29].

Кроме того:

  • Плагин NodeLocal DNS Cache [30], представленный в Kubernetes 1.13 и улучшающий производительность работы DNS, достиг бета-версии.
  • Kube-proxy больше автоматически не удаляет [31] сетевые правила, созданные в результате его работы в других режимах (для этого требуется явный запуск kube-proxy --cleanup).

CLI

Как всегда, не обошлось без приятных мелочей в консольных командах для работы с кластерами Kubernetes:

  • Перевод [32] kubectl get на получение данных с сервера (а не клиента) для полноценной поддержки расширений объявлен завершённым (стабильным).
  • В kubectl top добавили [33] опцию --sort-by:
    $ kubectl --kubeconfig=kubectl.kubeconfig top pod --sort=memory
    NAME                               CPU(cores)   MEMORY(bytes)
    elasticsearch-logging-v1-psc43     2m           2406Mi
    hadoop-journalnode-2               13m          362Mi
    hodor-v0.0.5-3204531036-fqb0q      23m          64Mi
    kubernetes-admin-mongo-...         5m           44Mi 
    cauth-v0.0.5-2463911897-165m8      34m          10Mi
    test-1440672787-kvx8h              0m           1Mi
  • В kubectl rollout restart добавили [34] поддержку DaemonSets и StatefulSets.
  • Добавлена [35] новая команда kubeadm upgrade node для обновления узлов кластера, заменившая (ныне объявленные устаревшими) kubeadm upgrade node config и kubeadm upgrade node experimental-control-plane.
  • Добавлены [36] новые команды kubeadm alpha certs certificate-key (для генерации случайного ключа, который можно затем передать в kubeadm init --experimental-upload-certs) и kubeadm alpha certs check-expiration (для проверки времени действия локальных PKI-сертификатов).
  • Команда kubeadm config upload объявлена [37] устаревшей, поскольку её замена (kubeadm init phase upload-config) стала зрелой.

Другие

Среди прочих заметных изменений в Kubernetes 1.15:

  • Поддержка [38] Pod Disruption Budget (PDB) добавлена и для сторонних ресурсов/контроллеров, основанных на CRD (например: EtcdCluster, MySQLReplicaSet…), с помощью Scale subresource [39]. Пока это бета-версия, которую сделают стабильной уже в следующем релизе. Подробности — в KEP [40].
  • До бета-версии дошли две фичи для узлов/Kubelet: поддержка [41] сторонних плагинов для мониторинга устройств (дабы вынести из Kubelet, т.е. out-of-tree, все специфичные для устройств знания) и SupportNodePidsLimit [42] (изоляция PID'ов от узла к pod'ам).
  • Для кодовой базы Kubernetes добавлена [43] и включена по умолчанию поддержка Go Modules [44] (вместо Godep и режима GOPATH, объявленного устаревшим).
  • Поддержка [45] AWS NLB (Network Load Balancer), впервые представленная ещё в K8s 1.9, достигла уровня бета-версии. В частности, она получила возможность конфигурации accessLogs [46], терминации TLS [47] и обновления LoadBalancerSourceRanges [48].
  • Реализована возможность [49] конфигурировать облачного провайдера Azure из секретов Kubernetes (для этого добавлена новая опция cloudConfigType, одним из значений которой может быть secret). Также Kubelet в Azure теперь может работать [50] без Azure identity (для этого должен быть включён useInstanceMetadata).
  • В cluster-lifecycle довели до бета-версии возможность [51] создания HA-кластеров с помощью kubeadm, а также завершили очередной этап (v1beta2) в реорганизации [52] формата конфигурационного файла kubeadm.
  • В метрики от планировщика добавлено [53] количество pods в статусе pending в разных очередях, а от CSI — статистика [54] о томах через kubelet volume metrics.
  • Обновления в используемом/зависимом программном обеспечении: Go 1.12.5, cri-tools 1.14.0, etcd 3.3.10 (версия не изменилась для сервера, но обновилась для клиента). Не изменились версии CNI, CSI, CoreDNS (в одной из альфа-версий Kubernetes 1.15 её обновили до 1.5.0, но потом снова откатили к 1.3.1), поддерживаемые версии Docker.

P.S.

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

Автор: Dmitry Stolyarov

Источник [59]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/321208

Ссылки в тексте:

[1] должен был: https://github.com/kubernetes/sig-release/tree/master/releases/release-1.15#timeline

[2] 1.15: https://github.com/kubernetes/sig-release/tree/master/releases/release-1.15

[3] таблицы Kubernetes enhancements tracking: https://docs.google.com/spreadsheets/u/1/d/1Vc949C4iC2f8GTmjfJkX04VUNcbimhg8ujp1bUAjGK4/edit#gid=0

[4] CHANGELOG-1.15: https://github.com/kubernetes/kubernetes/blob/release-1.15/CHANGELOG-1.15.md

[5] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20190120-execution-hook-design.md

[6] поддержка квот: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20180906-quotas-for-ephemeral-storage.md

[7] project quotas: http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch08s14.html

[8] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20181111-extend-datasource-field.md

[9] Функция: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20190125-online-growing-persistent-volume-size.md

[10] Поддержка: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20181029-volume-subpath-env-expansion.md

[11] принято решение: https://github.com/kubernetes/enhancements/issues/625#issuecomment-493725517

[12] Azure File: https://github.com/kubernetes/kubernetes/pull/78356

[13] Azure Disk: https://github.com/kubernetes/kubernetes/pull/78330

[14] Kubernetes Scheduling Framework: https://github.com/kubernetes/enhancements/issues/624

[15] нынешний способ: https://kubernetes.io/docs/concepts/extend-kubernetes/extend-cluster/#scheduler-extensions

[16] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20180409-scheduling-framework.md

[17] Non-Preempting: https://github.com/kubernetes/enhancements/issues/902

[18] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190317-non-preempting-priorityclass.md

[19] Pruning for Custom Resources: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20180731-crd-pruning.md

[20] Defaulting for Custom Resources: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190426-crd-defaulting.md

[21] Publish CRD OpenAPI: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/00xx-publish-crd-openapi.md

[22] механизм: https://github.com/mbohlool/community/blob/crd_conversion_kep/contributors/design-proposals/api-machinery/customresource-conversion-webhook.md

[23] Watch bookmark: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190206-watch-bookmark.md

[24] Watch API: https://kubernetes.io/docs/reference/using-api/api-concepts/#efficient-detection-of-changes

[25] добавлена: https://github.com/kubernetes/kubernetes/pull/78505

[26] object selector: https://github.com/liggitt/enhancements/blob/7b7fc0c2293c02c9bb580805dbdae49d802a189b/keps/sig-api-machinery/00xx-admission-webhooks-to-ga.md#object-selector

[27] реализована: https://github.com/kubernetes/kubernetes/pull/78135

[28] добавлено: https://github.com/kubernetes/kubernetes/pull/77563

[29] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20190423-service-lb-finalizer.md

[30] NodeLocal DNS Cache: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20190424-NodeLocalDNS-beta-proposal.md

[31] не удаляет: https://github.com/kubernetes/kubernetes/pull/76109

[32] Перевод: https://github.com/kubernetes/enhancements/issues/515

[33] добавили: https://github.com/kubernetes/kubernetes/pull/75920

[34] добавили: https://github.com/kubernetes/kubernetes/pull/77423

[35] Добавлена: https://github.com/kubernetes/kubernetes/pull/78408

[36] Добавлены: https://github.com/kubernetes/kubernetes/pull/77848

[37] объявлена: https://github.com/kubernetes/kubernetes/pull/77946

[38] Поддержка: https://github.com/kubernetes/enhancements/issues/981

[39] Scale subresource: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#scale-subresource

[40] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-apps/20190412-pdb-support-for-custom-resources-with-scale-subresource.md

[41] поддержка: https://github.com/kubernetes/enhancements/issues/606

[42] SupportNodePidsLimit: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190129-pid-limiting.md#node-to-pod-isolation

[43] добавлена: https://github.com/kubernetes/enhancements/issues/917

[44] поддержка Go Modules: https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/2019-03-19-go-modules.md

[45] Поддержка: https://github.com/kubernetes/enhancements/issues/423

[46] accessLogs: https://github.com/kubernetes/kubernetes/pull/78497

[47] терминации TLS: https://github.com/kubernetes/kubernetes/pull/74910

[48] обновления LoadBalancerSourceRanges: https://github.com/kubernetes/kubernetes/pull/74692

[49] возможность: https://github.com/kubernetes/kubernetes/pull/78242

[50] может работать: https://github.com/kubernetes/kubernetes/pull/77906

[51] возможность: https://github.com/kubernetes/enhancements/issues/357

[52] реорганизации: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/0023-kubeadm-config.md

[53] добавлено: https://github.com/kubernetes/kubernetes/pull/75501

[54] статистика: https://github.com/kubernetes/kubernetes/pull/76188

[55] Kubernetes 1.14: обзор основных новшеств: https://habr.com/company/flant/blog/445196/

[56] Kubernetes 1.13: обзор основных новшеств: https://habr.com/company/flant/blog/432208/

[57] Kubernetes 1.12: обзор основных новшеств: https://habr.com/company/flant/blog/424331/

[58] Kubernetes 1.11: обзор основных новшеств: https://habr.com/company/flant/blog/415349/

[59] Источник: https://habr.com/ru/post/456084/?utm_source=habrahabr&utm_medium=rss&utm_campaign=456084