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

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

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

Очередной релиз системы Kubernetes, 1.9, должен случиться на этой неделе. Согласно текущему плану [1], это произойдёт сегодня (13 декабря). Об основных новшествах, которые принесёт этот выпуск, уже известно: как и в прошлый раз [2], их накопилось действительно много. Представляем обзор самых значимых изменений, которые приходят в Kubernetes с грядущим релизом 1.9.

При написании этой статьи использовались:

  • официальный черновик K8s 1.9 Release Notes [3];
  • таблица для разработчиков Kubernetes Features OSS tracking board [4] (обратите внимание, что некоторые её данные расходятся с реальностью, т.к. не все перечисленные там фичи успели закончить к релизу);
  • CHANGELOG-1.9 [5].

… и, конечно, бесконечные issues и pull requests в GitHub-репозиториях проекта.

API

Редизайн Event API

В архитектуре API событий (и библиотеке EventRecorder) реализованы [6] изменения, направленные на улучшения в двух направлениях:

  1. Снизить влияние событий на общую производительность кластера.
  2. Сделать объект Event более структурированным, чтобы упростить дальнейшую работу с ним («первый и необходимый шаг для возможности автоматизировать его анализ»).

Среди проблем, решаемых этими изменениями:

  • сейчас события отправляют слишком много сообщений (например, невозможность планирования пода генерирует событие каждые несколько секунд);
  • семантика событий не всегда ясна (например, нет разграничения причин для генерации события и причин для принятия каких-либо действий, связанных с событием);
  • повышенная нагрузка на кластер из-за событий в случае каких-то проблем (например, пользователь создал сильно больше подов, чем способен выдержать кластер, что приводит к повторяющимся ошибкам их планирования);

Сравнение старых и новых объектов Event:

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

В деталях всё это описано в design-proposals: events-redesign [7]. Текущий статус — альфа-версия.

Admission webhooks

Добавлена [8] бета-версия механизма под названием admission webhooks, позволяющего изменять и/или принимать и отвергать запросы к API. Он относится к этапу контроля допуска (admission control) и срабатывает на последних шагах обработки запросов перед их сохранением в базу данных (etcd). По своей сути эти webhooks похожи на initializers (о них мы писали в переводной статье «Что происходит в Kubernetes при запуске kubectl run? Часть 1 [9]»), однако:

  • распространяются на все действия (создание, модификация, удаление);
  • выполняются синхронно (т.е. длительные задержки недопустимы);
  • объекты, для которых выполняются хуки, недоступны до момента их исполнения.

Пример использования admission webhooks из документации — проверка одного поля объекта и установка значения для его другого поля. Другой пример — автоматическое добавление служебного контейнера (допустим, выполняющего бэкап) по аннотации пода. Например, у нас есть под с MySQL, с одним контейнером (в котором сама MySQL), и у этого пода указана специальная аннотация. Когда мы создаем под, запрос приходит в Kubernetes API, который отправляет запрос в наше приложение через admission webhook, а приложение видит запрос, видит, что создается под, видит свою специальную аннотацию и делает просто rewrite — добавляет в под второй контейнер.

Подробное описание admission webhooks опубликовано здесь [10].

Workload API

Workload API был представлен в прошлом релизе Kubernetes и объединил в себе интерфейсы, относящиеся к «рабочим нагрузкам»: DaemonSet, Deployment, ReplicaSet, StatefulSet. Для них была выделена отдельная группа API под названием apps, и с выпуском K8s 1.9 все эти изменения получили стабильный статус.

Основные изменения в Workload API, представленные в релизах Kubernetes 1.8 и 1.9, обобщены в документации проекта [11].

Другое

  • В состояние StatefulSetDaemonSet) добавлена [12] поддержка условий [13], что делает их совместимыми с другими контроллерами категории core/v1.
  • Флаг --chunk-size={SIZE} добавлен в kubectl get, а поддержка ограничения данных, выводимых API (API chunking), в целом получила статус бета-версии.

Хранилища

Out-of-Tree Volume Plugins (CSI)

Имеющиеся плагины томов входят в состав Kubernetes: их называют «in-tree», поскольку весь код включён в основной репозиторий проекта, а в скомпилированном виде они распространяются в составе бинарников K8s. У такого подхода есть очевидный минус: поддержка сторонних хранилищ их производителями/разработчиками зависит от циклов релизов Kubernetes (кроме того, весь исходный код должен быть Open Source). Отчасти эта проблема решается плагином Flexvolume [14], однако данный механизм не гарантирует обратной совместимости и (при установке драйвера) требует развёртывания своих файлов в определенные места на узлах и мастерах.

Новый же подход получил название Out-of-Tree CSI Volume Plugins [15] (CSI — это Container Storage Interface, определяющий, как системы оркестровки контейнеров могут использовать сторонние хранилища). Он призван реализовать полноценный API в Kubernetes, который позволяет:

  • создавать тома «вне дерева» (репозитория Kubernetes);
  • не требовать включения скомпилированного кода в бинарные файлы K8s;
  • не требовать прямого доступа к машинам с Kubernetes для деплоя этих плагинов (драйверов).

Авторами предложен следующий рекомендуемый механизм для деплоя драйверов CSI в Kubernetes:

Kubernetes 1.9: обзор основных новшеств - 3

Разъяснения по этой схеме и подробности о проекте в целом опубликованы в этом документе [16]. Статус реализации в Kubernetes 1.9 — альфа-версия.

Запуск mount внутри подов

Фича под названием Containerized mounts [17] привносит в Kubernetes возможность запуска утилит монтирования на подах, а не на хостовой машине. Таким образом, хостовая система может оставаться минимальным дистрибутивом GNU/Linux без стороннего ПО: для создания Ceph RBD (/usr/bin/rbd), монтирования GlusterFS (mount.glusterfs) и т.п., — а все утилиты для работы с томами (операции provision/delete, attach/detach, mount/unmount) помещаются в поды.

Подробности об этой возможности опубликованы в design-proposals: containerized-mounter-pod [18]. Текущий статус — альфа-версия.

Изменение размера томов

Базовая поддержка [19] операции resize для существующих PV (PersistentVolume) появилась в Kubernetes 1.8. К 1.9 она так и не достигла бета-версии, однако заметный прогресс налицо: добавлена поддержка изменения размера для файловых систем, а вместе с ней — для томов GCE, EBS, Cinder, а также Ceph RBD [20]. Бета-версия ожидается к релизу 1.10.

Другое

  • Удаление PersistentVolumeClaims, используемых какими-либо подами, теперь предотвращается [21] (альфа-версия).
  • Опции volumeMode и volumeDevice для PV (PersistentVolume), позволяющие [22] напрямую использовать блочные raw-устройства вместо файловой системы (альфа-версия).

Сети

Поддержка IPv6

Реализована [23] базовая поддержка IPv6, предоставляющая «все возможности Kubernetes в сети IPv6 вместо IPv4». На данный момент эта реализация находится в альфа-версии и включает в себя:

  • поддержку развёртывания кластеров Kubernetes в режиме «только IPv6»;
  • поддержку деплоя кластера с IPv6 через kubeadm;
  • поддержку K8s control plane и data plane;
  • поддержку бэкенда iptables kube-proxy с использованием ip6tables;
  • использование сборки CNI 0.6.0 для IPv6-сети у подов;
  • поддержку IPv6 в kube-dns через SRV-записи;
  • ограничения: из плагинов CNI были проверены только bridge и local-ipam; отсутствие поддержки HostPorts; сетевая маска для пода/кластера должна быть /66 или больше.

Другое

  • В kubeadm добавлен [24] экспериментальный режим, в котором CoreDNS используется вместо kube-dns. Подробнее о прогрессе проекта CoreDNS мы писали здесь [25].
  • Режим IPVS в kube-proxy, впервые представленный в K8s 1.8, перешёл в статус беты.

Прочие компоненты и изменения

Планировщик

Механизм освобождения ресурсов кластера (pod preemption) был улучшен благодаря поддержке PodDisruptionBudget [26] и nominated pods [27]. Кроме того, в планировщик добавлена поддержка нового типа очереди, основанной [28] на приоритетах (первыми будут планироваться поды с наивысшим приоритетом).

При использовании [29] hostPort [30] у подов появилась [31] возможность прослушивать один и тот же порт на разных IP-адресах.

Аутентификация и безопасность

Важное новшество от SIG Auth — ClusterRole Aggregation [32] для возможности добавлять права (permissions) уже существующим, т.е. встроенным в RBAC, ролям (admin, edit, view).

Также можно отметить, что:

  • в правила политики RBAC (PolicyRules) добавлена [33] поддержка формата */subresource — например, */scale будет включать в себя replicationcontroller/scale;
  • в PodSecurityPolicy [34] проведены заметные улучшения, включающие многократный рост производительности [35] при использовании большого числа политик в кластере (авторизация теперь происходит только для валидных для пода политик, а не всех политик кластера) и поддержку [36] дополнений K8s [37].

CLI

Название фичи kubectl diff [38] говорит за себя: это новая команда, позволяющая просматривать различия между локально описанным объектом Kubernetes и текущим состоянием реального объекта (в кластере). Текущий статус — альфа-версия.

В kubeadm upgrade apply добавлена опция --etcd-upgrade, выполняющая обновление etcd в подах до версии, которая официально поддерживается целевым релизом Kubernetes (3.1.10 в случае K8s 1.9).

У kubeadm появилась [39] поддержка Kubelet Dynamic Configuration, что означает возможность выката конфигураций kubelet на работающий кластер (сама фича впервые появилась [40] в прошлой версии Kubernetes и сохраняет статус альфа-версии с перспективой повышения до беты в K8s 1.10).

Windows

  • Через kubeadm в кластер теперь можно добавлять [41] рабочие узлы с Windows.
  • У kubelet появилась [42] поддержка указания путей монтирования в формате Windows, а не только абсолютных путей Linux, как это было раньше.

OpenStack

Улучшена интеграция с облачной платформой:

  • добавлена поддержка Cinder v3 API и исправлено определение версии Cinder;
  • OpenStack LBaaS v2 Provider стал настраиваемым;
  • для балансировки нагрузки теперь может использоваться OpenStack Octavia v2 (не только Neutron LBaaS v2);
  • расширена поддержка групп безопасности OpenStack.

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

  • Валидация сторонних ресурсов, определённых через Custom Resource Definition (CRD), получила статус бета-версии, а также добавлен [43] образец CRD-контроллера.
  • В hyperkube [44] (бинарный файл, включающий в себя все серверные компоненты Kubernetes) добавлен [45] cloud-controller-manager.
  • Обновление cAdvisor до 0.28.1 добавило поддержку мониторинга containerd.
  • AppArmor теперь можно отключить, выставив профиль unconfined.
  • При запуске kubelet больше не проверяется зависимость от Docker.
  • Формат логов контейнеров в CRI научился разбивать длинные строки на несколько, а в fluentd появилась поддержка логов в формате CRI.

Совместимость

  • Поддерживаемая версия etcd — 3.1.10 (в Kubernetes 1.8 была 3.0.17).
  • Проверенные версии Docker — от 1.11.2 до 1.13.1 и 17.03.x.
  • Версия Go — 1.9.2 (вместо 1.8.3), минимально поддерживаемая — 1.9.1.
  • Версия CNI — 0.6.0.

P.S.

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

Автор: distol

Источник [49]


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

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

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

[1] текущему плану: https://github.com/kubernetes/features/blob/master/release-1.9/release-1.9.md

[2] прошлый раз: https://habrahabr.ru/company/flant/blog/338230/

[3] K8s 1.9 Release Notes: https://docs.google.com/document/d/1veHHyDH9VoNTwP6yy9u2Q7Jj1hnBJGVPv3NPHInImgU/edit#

[4] Kubernetes Features OSS tracking board: https://docs.google.com/spreadsheets/d/1WmMJmqLvfIP8ERqgLtkKuE_Q2sVxX8ZrEcNxlVIJnNc/edit#gid=0

[5] CHANGELOG-1.9: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md

[6] реализованы: https://github.com/kubernetes/features/issues/383

[7] events-redesign: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/events-redesign.md

[8] Добавлена: https://github.com/kubernetes/features/issues/492

[9] Что происходит в Kubernetes при запуске kubectl run? Часть 1: https://habrahabr.ru/company/flant/blog/342658/

[10] здесь: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/admission-control-webhooks.md

[11] документации проекта: https://kubernetes.io/docs/reference/workloads-18-19/

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

[13] условий: https://kubernetes.io/docs/api-reference/v1.8/#deploymentcondition-v1beta2-apps

[14] Flexvolume: https://github.com/kubernetes/community/blob/master/contributors/devel/flexvolume.md

[15] Out-of-Tree CSI Volume Plugins: https://github.com/kubernetes/features/issues/178

[16] этом документе: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md

[17] Containerized mounts: https://github.com/kubernetes/features/issues/278

[18] containerized-mounter-pod: https://github.com/jsafrane/community/blob/69c780f8b40dbe7014bdc1d5af9282f2dfdc75a0/contributors/design-proposals/storage/containerized-mounter-pod.md

[19] поддержка: https://github.com/kubernetes/features/issues/284

[20] Ceph RBD: https://github.com/kubernetes/kubernetes/pull/52767

[21] предотвращается: https://github.com/kubernetes/features/issues/498

[22] позволяющие: https://github.com/kubernetes/features/issues/351

[23] Реализована: https://github.com/kubernetes/features/issues/508

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

[25] здесь: https://habrahabr.ru/company/flant/blog/344098/

[26] PodDisruptionBudget: https://github.com/kubernetes/kubernetes/pull/56178

[27] nominated pods: https://github.com/kubernetes/kubernetes/pull/55933

[28] основанной: https://github.com/kubernetes/kubernetes/pull/55109

[29] использовании: https://kubernetes.io/docs/concepts/configuration/overview/#services

[30] hostPort: https://kubernetes.io/docs/api-reference/v1.8/#containerport-v1-core

[31] появилась: https://github.com/kubernetes/website/pull/5931/files

[32] ClusterRole Aggregation: https://github.com/kubernetes/features/issues/502

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

[34] PodSecurityPolicy: https://kubernetes.io/docs/concepts/policy/pod-security-policy/

[35] рост производительности: https://github.com/kubernetes/kubernetes/pull/55643

[36] поддержку: https://github.com/kubernetes/kubernetes/pull/55509

[37] дополнений K8s: https://kubernetes.io/docs/concepts/cluster-administration/addons/

[38] kubectl diff: https://github.com/kubernetes/features/issues/491

[39] появилась: https://github.com/kubernetes/kubernetes/pull/55803

[40] появилась: https://github.com/kubernetes/features/issues/281

[41] можно добавлять: https://github.com/kubernetes/kubernetes/pull/53553

[42] появилась: https://github.com/kubernetes/kubernetes/pull/51240

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

[44] hyperkube: https://github.com/kubernetes/kubernetes/tree/master/cluster/images/hyperkube

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

[46] Docker 17.06 и Kubernetes 1.7: ключевые новшества: https://habrahabr.ru/company/flant/blog/332160/

[47] Наш опыт с Kubernetes в небольших проектах: https://habrahabr.ru/company/flant/blog/331188/

[48] Инфраструктура с Kubernetes как доступная услуга: https://habrahabr.ru/company/flant/blog/341760/

[49] Источник: https://habrahabr.ru/post/344220/?utm_campaign=344220