- PVSM.RU - https://www.pvsm.ru -
В понедельник должен был [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 по умолчанию) «доросли» следующие возможности:
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 context) существует множество точек расширения (extension points), на каждой из которых могут вызываться плагины фреймворка.
(Жизненный цикл для вызова плагинов в 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].
Для CustomResources представлены улучшения, призванные реализовать для данных, хранимых таким образом (в рамках JSON в CRD), поведение, которое лучше соответствует общепринятому в Kubernetes API (для «родных» объектов K8s):
Обе фичи изначально планировались на включение в состав релиза K8s 1.12, однако только теперь представлены в виде альфа-версий.
Этим изменения в CRD не ограничились:
Другое интересное нововведение получило название 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:
Option
, сообщающее об опциях выполняемой операции.
Значимое новшество в сетевой части Kubernetes — так называемая «защита финализатора» (Finalizer Protection) для балансировщиков нагрузки. Теперь перед тем, как удалять ресурсы LoadBalancer'а, производится проверка, что соответствующий ресурс Service'а не был полностью удалён. Для этого к каждому сервису с type=LoadBalancer
прикрепляется так называемый finalizer: при удалении такого сервиса реальное удаление ресурса блокируется, пока finalizer не будет удалён, а сам finalizer не удаляется до тех пор, пока не завершится «подчистка» ресурсов соответствующего балансировщика нагрузки (service.kubernetes.io/load-balancer-cleanup
). Текущая версия реализации — альфа-версия, а подробности о ней можно найти в KEP [29].
Кроме того:
kube-proxy --cleanup
).Как всегда, не обошлось без приятных мелочей в консольных командах для работы с кластерами Kubernetes:
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.kubeadm upgrade node
для обновления узлов кластера, заменившая (ныне объявленные устаревшими) kubeadm upgrade node config
и kubeadm upgrade node experimental-control-plane
.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:
SupportNodePidsLimit
[42] (изоляция PID'ов от узла к pod'ам).accessLogs
[46], терминации TLS [47] и обновления LoadBalancerSourceRanges
[48].cloudConfigType
, одним из значений которой может быть secret
). Также Kubelet в Azure теперь может работать [50] без Azure identity (для этого должен быть включён useInstanceMetadata
).Читайте также в нашем блоге:
Автор: 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
Нажмите здесь для печати.