- PVSM.RU - https://www.pvsm.ru -
В начале этой недели состоялся [1] очередной релиз Kubernetes, который окрестили «ангельским», — 1.13 [2]. Такое название связано с числом 113, которое считается [3] «ангельским» и, со слов разработчиков Kubernetes, символизирует «новые начинания, трансформацию и конец одной главы перед открытием новых». Не вдаваясь в дальнейший анализ символизма происходящего, по уже сложившейся для нашего блога традиции, мы в седьмой раз расскажем о ключевых изменениях в новой версии Kubernetes, что призваны порадовать DevOps-/SRE-инженеров, работающих с этим продуктом.
В качестве источников информации мы оперировали данными из таблицы Kubernetes enhancements tracking [4], CHANGELOG-1.13 [5] и сооветствующих issues, pull requests, Kubernetes Enhancement Proposals (KEP).
Одним из главных событий релиза Kubernetes 1.13 стало объявление стабильного статуса (General Availability, GA) для консольной утилиты kubeadm. В блоге K8s этому даже посвятили отдельную публикацию [6]. Как многие знают, kubeadm — инструмент для создания кластеров Kubernetes согласно лучшим практикам проекта, а также их дальнейшего минимального сопровождения. Отличительная особенность в том, что разработчики стремятся сохранить его компактным и независимым от поставщика/инфраструктуры, не включая в него решение таких вопросов, как provisioning инфраструктуры, сторонние сетевые решения, дополнения (мониторинг, логирование и т.п.), специфичные интеграции с облачными провайдерами.
Статус GA ознаменовал зрелость kubeadm в следующих вопросах:
kubeadm join
используются bootstrap-токены [7], а для настройки kubelet задействован ComponentConfig [8];kubeadm init phase
), позволяющие выбирать, какие инициализирующие процедуры будут выполняться;kubeadm upgrade
гарантирует обновления кластера между релизами 1.10.x, 1.11.x, 1.12.x и 1.13.x (обновляет etcd, API Server, Controller Manager и Scheduler);Также можно отметить, что kubeadm теперь корректно распознает Docker 18.09.0 и его более новые версии. Наконец, разработчики просят пользователей kubeadm пройти небольшой онлайн-опрос [9], в котором можно высказать свои пожелания по использованию и развитию проекта.
CoreDNS, получивший стабильный статус в релизе Kubernetes 1.11 [10], пошёл ещё дальше и стал [11] DNS-сервером по умолчанию в K8s (вместо использовавшегося до сих пор kube-dns). Планировалось, что это произойдёт ещё в 1.12, однако разработчики столкнулись с необходимостью проведения дополнительных оптимизаций в масштабируемости и потреблении памяти, которые были завершены только к нынешнему релизу.
Поддержка kube-dns сохранится «как минимум на один следующий релиз», но разработчики говорят о необходимости начинать миграцию на актуальное решение уже сейчас.
Из связанных с темой CoreDNS изменений в Kubernetes 1.13 можно также отметить [12] появление плагина NodeLocal DNS Cache [13], призванного улучшить производительность работы DNS. Улучшение достигается благодаря запуску на узлах кластера агента для DNS-кэша, к которому будут напрямую обращаться pod'ы этого узла. По умолчанию функция отключена, а для её активации необходимо выставить KUBE_ENABLE_NODELOCAL_DNS=true
.
Большое внимание в последних релизах Kubernetes уделяется работе с Container Storage Interface (CSI), что началась с альфа-версии CSI в K8s 1.9 [14], продолжилась бета-версией в 1.10 [15]… Впрочем, мы уже писали [16] о нём и не раз [17]. В K8s 1.13 достигнута новая значимая веха: поддержка CSI объявлена стабильной (GA).
(Схема из статьи «Понимаем Container Storage Interface [16]»)
Вместе с этим, появилась поддержка спецификации CSI версии v1.0.0 и признана устаревшей поддержка старых версий стандарта (0.3 и более ранних). Это означает, что старым драйверам CSI для работы в Kubernetes 1.15 и старших версий потребуется обновление до CSI 1.0 (и перемещение в новый каталог регистрации плагинов Kubelet). К слову, из самих драйверов стоит отметить появление [18] альфа-версии интерфейса CSI для управления жизненным циклом томов AWS EBS (Elastic Block Store).
Новое дополнение [19] в addon manager теперь производит автоматическую установку CRD от CSI, если активирован хотя бы один из двух feature gates: CSIDriverRegistry
и CSINodeInfo
. Оно имеет статус альфа-версии, а по сути является лишь временным решением задачи, подробно описанной как механизм установки CRD [20].
Стало стабильным планирование томов с учётом топологии (Topology Aware Volume Scheduling [21]), про которое мы рассказывали в контексте релиза Kubernetes 1.10 [15]. Если вкратце, то с ним планировщик в своей работе учитывает ограничения топологии тома pod'а (например, его зону и узел).
Представленная ещё в Kubernetes 1.9 [14] возможность [22] использовать блочные raw-устройства (не сетевые) как Persistent Volumes переведена [23] в бета-версию и отныне включена по умолчанию.
Завершим тему хранилищ тем, что поддержка GCERegionalPersistentDisk объявлена [24] стабильной.
Представлена альфа-версия поддержки [25] сторонних плагинов для мониторинга устройств. Идея этой инициативы заключается в том, чтобы вынести из Kubelet специфичные для устройств знания вовне (out-of-tree). Администраторы кластеров получат метрики, сообщаемые плагинами устройств на уровне контейнера, а производители — возможность создавать эти метрики без необходимости вносить изменения в ядро Kubernetes. С подробностями о реализации можно ознакомиться в предложении, получившем название Kubelet Metadata API [26].
Объявлен [27] стабильным Kubelet Plugin Watcher [28] (его же называли Kubelet Device Plugin Registration), позволяющий плагинам уровня узла (плагины устройств, CSI и CNI) сообщать о себе Kubelet и взаимодействовать с ним.
Новая возможность в статусе альфа-версии — NodeLease [29]. Если раньше «пульс» (heartbeat) узла определялся по NodeStatus, то с новой фичей у каждого узла появляется связанный с ним объект Lease
(в пространстве имён kube-node-lease
), который периодически обновляется узлом. «Пульс» же теперь задают оба параметра: и прежний NodeStatus, который сообщается мастеру только в случае изменений либо по фиксированному таймауту (по умолчанию это раз в минуту), и новый объект (он обновляется часто). Поскольку этот объект совсем небольшой, это значительно улучшит масштабируемость и производительность. Авторы взялись за создание нового «пульса» после тестирования кластеров с размером более 2000 узлов, которые во время своей работы могли упираться в лимиты etcd, — подробнее см. в KEP-0009 [30].
type Lease struct {
metav1.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
// +optional
ObjectMeta metav1.ObjectMeta `json:"metadata,omitempty"`
// Specification of the Lease.
// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
// +optional
Spec LeaseSpec `json:"spec,omitempty"`
}
type LeaseSpec struct {
HolderIdentity string `json:"holderIdentity"`
LeaseDurationSeconds int32 `json:"leaseDurationSeconds"`
AcquireTime metav1.MicroTime `json:"acquireTime"`
RenewTime metav1.MicroTime `json:"renewTime"`
LeaseTransitions int32 `json:"leaseTransitions"`
}
(Компактная спецификация нового объекта для представления «пульса» узла — Lease
— идентична LeaderElectionRecord
[31])
Альфа-версия Dynamic Audit Control [32] следует идеям Dynamic Admission Control и обеспечивает динамическую конфигурацию продвинутых возможностей аудита — для этого теперь можно зарегистрировать (динамически) webhook, который будет получать поток событий. Потребность в этой фиче объясняется тем, что аудит в Kubernetes предлагает очень мощные возможности, однако они сложны в настройке, а каждое изменение конфигурации до сих пор требовало перезагрузки apiserver.
Шифрование данных в etcd (см. официальную документацию [33]) переведено [34] из экспериментального статуса в бета-версию.
kind: EncryptionConfiguration
apiVersion: apiserver.config.k8s.io/v1
resources:
- resources:
- secrets
providers:
- identity: {}
- aesgcm:
keys:
- name: key1
secret: c2VjcmV0IGlzIHNlY3VyZQ==
- name: key2
secret: dGhpcyBpcyBwYXNzd29yZA==
- aescbc:
keys:
- name: key1
secret: c2VjcmV0IGlzIHNlY3VyZQ==
- name: key2
secret: dGhpcyBpcyBwYXNzd29yZA==
- secretbox:
keys:
- name: key1
secret: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=
(Пример конфигурации с зашифрованными данными — взят из документации [35].)
Среди менее значимых новшеств в этой категории:
PodSecurityPolicy
добавили [37] поддержку правила MayRunAs
для опций fsGroup
и supplementalGroups
, позволяющего определять диапазон разрешённых идентификаторов групп (GID) для подов/контейнеров без принудительного установления GID по умолчанию. Кроме того, с PodSecurityPolicy
теперь в спецификации pod'ов возможна [38] стратегия RunAsGroup
, т.е. можно контролировать основной GID для контейнеров.
Команда kubectl diff
, показывающая [40] разницу между локальной конфигурацией и актуальным описанием работающего объекта (работает и рекурсивно для каталогов с конфигурациями), получила статус бета-версии.
Фактически diff
«предсказывает» изменения, которые будут внесены с выполнением команды kubectl apply
, и для этого используется другая новая возможность — APIServer DryRun [41]. Её суть — холостой запуск — должна быть ясна из названия, а более подробное описание доступно в документации Kubernetes [42]. К слову, в релизе 1.13 функцию DryRun тоже «повысили» до бета-версии и включили по умолчанию.
И ещё одно продвижение до бета-версии в консольном мире Kubernetes затронуло новый механизм плагинов [43]. Попутно в нём исправили [44] порядок вывода плагинов (kubectl plugin list
), убрав оттуда дополнительную сортировку.
Кроме того, в kubectl describe node
добавили [45] вывод используемых ресурсов ephemeral-storage [46], а в kubectl describe pod
— томов типа projected [47].
Функция планировщика Taint Based Eviction [48] переведена в статус бета-версии и включена по умолчанию после долгого затишья [49] в разработке. Её предназначение — автоматическое добавление taints [50] на узлы (посредством NodeController или kubelet) при наступлении определённых условий, таких как, например, node.kubernetes.io/not-ready
, что соответствует значению NodeCondition
в Ready=False
.
Аннотация критически важных для работы кластера pod'ов — critical-pod
— объявлена [51] устаревшей. Вместо неё предлагается использовать приоритеты [52] (в бета-версии с Kubernetes 1.11).
Для AWS впервые (в рамках альфа-версий) стали доступны:
В SIG Azure реализовали дополнительную поддержку для Azure Disk (Ultra SSD, Standard SSD и Premium Azure Files) и продвинули Cross resource group nodes [57] до бета-версии. Кроме того, в CNI-плагинах для Windows появилась [58] возможность настройки DNS в контейнере.
Читайте также в нашем блоге:
Автор: distol
Источник [60]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/301430
Ссылки в тексте:
[1] состоялся: https://kubernetes.io/blog/2018/12/03/kubernetes-1-13-release-announcement/
[2] 1.13: https://github.com/kubernetes/sig-release/tree/master/releases/release-1.13
[3] считается: https://angelnumbersmeaning.com/angel-number-113-meaning-and-symbolism/
[4] таблицы Kubernetes enhancements tracking: https://docs.google.com/spreadsheets/d/1_nPzArx7ptlrNfwQpLGUoTYLQ9XULnMAJbT8UBuPlYs/edit?usp=sharing
[5] CHANGELOG-1.13: https://github.com/kubernetes/kubernetes/blob/release-1.13/CHANGELOG-1.13.md
[6] отдельную публикацию: https://kubernetes.io/blog/2018/12/04/production-ready-kubernetes-cluster-creation-with-kubeadm/
[7] bootstrap-токены: https://kubernetes.io/docs/reference/access-authn-authz/bootstrap-tokens/
[8] ComponentConfig: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/0014-20180707-componentconfig-api-types-to-staging.md
[9] онлайн-опрос: https://docs.google.com/forms/d/e/1FAIpQLSd_G3AdnWG96Mtq2MEiZER9sLZZrNmSYjgqYEuv3gb2JPcZ-w/viewform
[10] Kubernetes 1.11: https://habr.com/company/flant/blog/415349/
[11] стал: https://github.com/kubernetes/enhancements/issues/566
[12] отметить: https://github.com/kubernetes/kubernetes/pull/70555
[13] NodeLocal DNS Cache: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/0030-nodelocal-dns-cache.md
[14] K8s 1.9: https://habr.com/company/flant/blog/344220/
[15] 1.10: https://habr.com/company/flant/blog/353114/
[16] писали: https://habr.com/company/flant/blog/424211/
[17] не раз: https://habr.com/company/flant/blog/426133/
[18] появление: https://github.com/kubernetes/enhancements/issues/630
[19] Новое дополнение: https://github.com/kubernetes/kubernetes/pull/70193
[20] механизм установки CRD: https://github.com/kubernetes/enhancements/issues/615
[21] Topology Aware Volume Scheduling: https://github.com/kubernetes/enhancements/issues/490
[22] возможность: https://github.com/kubernetes/features/issues/351
[23] переведена: https://github.com/kubernetes/kubernetes/pull/71167
[24] объявлена: https://github.com/kubernetes/kubernetes/pull/70716
[25] поддержки: https://github.com/kubernetes/enhancements/issues/606
[26] Kubelet Metadata API: https://docs.google.com/document/d/1NYnqw-HDQ6Y3L_mk85Q3wkxDtGNWTxpsedsgw4NgWpg/edit
[27] Объявлен: https://github.com/kubernetes/kubernetes/pull/70559
[28] Kubelet Plugin Watcher: https://github.com/kubernetes/enhancements/issues/595
[29] NodeLease: https://github.com/kubernetes/enhancements/issues/589
[30] KEP-0009: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/0009-node-heartbeat.md
[31] LeaderElectionRecord
: https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/client-go/tools/leaderelection/resourcelock/interface.go#L37
[32] Dynamic Audit Control: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/0014-dynamic-audit-configuration.md
[33] официальную документацию: https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
[34] переведено: https://github.com/kubernetes/kubernetes/pull/71206
[35] документации: https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration
[36] можно настроить: https://github.com/kubernetes/kubernetes/pull/65763
[37] добавили: https://github.com/kubernetes/kubernetes/pull/65135
[38] возможна: https://github.com/kubernetes/kubernetes/pull/67802
[39] заменили: https://github.com/kubernetes/kubernetes/pull/69663
[40] показывающая: https://github.com/kubernetes/features/issues/491
[41] APIServer DryRun: https://github.com/kubernetes/enhancements/issues/576
[42] документации Kubernetes: https://kubernetes.io/docs/reference/using-api/api-concepts/#dry-run
[43] новый механизм плагинов: https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/
[44] исправили: https://github.com/kubernetes/kubernetes/pull/70443
[45] добавили: https://github.com/kubernetes/kubernetes/pull/70268
[46] ephemeral-storage: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#local-ephemeral-storage
[47] projected: https://kubernetes.io/docs/concepts/storage/volumes/#projected
[48] Taint Based Eviction: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#taint-based-evictions
[49] долгого затишья: https://github.com/kubernetes/enhancements/issues/166
[50] taints: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
[51] объявлена: https://github.com/kubernetes/kubernetes/pull/70298
[52] приоритеты: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
[53] интеграция: https://github.com/kubernetes/enhancements/issues/629
[54] aws-alb-ingress-controller: https://github.com/kubernetes-sigs/aws-alb-ingress-controller
[55] внешний CCM: https://github.com/kubernetes/enhancements/issues/631
[56] cloud-provider-aws: https://github.com/kubernetes/cloud-provider-aws
[57] Cross resource group nodes: https://github.com/kubernetes/enhancements/issues/604
[58] появилась: https://github.com/kubernetes/kubernetes/pull/67435
[59] Kubernetes 1.12: обзор основных новшеств: https://habr.com/company/flant/blog/424331/
[60] Источник: https://habr.com/post/432208/?utm_campaign=432208
Нажмите здесь для печати.