- PVSM.RU - https://www.pvsm.ru -
Сегодня, в среду, состоится [1] очередной релиз Kubernetes — 1.16. По сложившейся для нашего блога традиции, вот уже в юбилейный — десятый — раз мы рассказываем о наиболее значимых изменениях в новой версии.
Информация, использованная для подготовки этого материала, взята из таблицы Kubernetes enhancements tracking [2], CHANGELOG-1.16 [3] и сооветствующих issues, pull requests, а также Kubernetes Enhancement Proposals (KEP). Итак, поехали!..
По-настоящему большое число заметных нововведений (в статусе альфа-версии) представлено на стороне узлов K8s-кластеров (Kubelet).
Во-первых, представлены так называемые «эфемерные контейнеры [4]» (Ephemeral Containers), призванные упростить процессы отладки в pod'ах. Новый механизм позволяет запускать специальные контейнеры, которые стартуют в пространстве имён существующих pod'ов и живут непродолжительное время. Их предназначение — взаимодействие с другими pod'ами и контейнерами в целях решения каких-либо проблем и отладки. Для этой возможности реализована новая команда kubectl debug
, схожая по своей сути с kubectl exec
: только вместо запуска процесса в контейнере (как в случае exec
) она запускает контейнер в pod'е. Например, такая команда подсоединит новый контейнер к pod'у:
kubectl debug -c debug-shell --image=debian target-pod -- bash
Подробности об эфемерных контейнерах (и примеры их использования) можно найти в соответствующем KEP [5]. Текущая реализация (в K8s 1.16) — альфа-версия, а среди критериев её перевода в бета-версию значится «тестирование Ephemeral Containers API на протяжении не менее 2 релизов [Kubernetes]».
NB: По своей сути и даже названию фича напоминает уже существующий плагин kubectl-debug [6], о котором мы уже писали [7]. Предполагается, что с появлением эфемерных контейнеров развитие отдельного внешнего плагина прекратится.
Другое новшество — PodOverhead
[8] — призвано предоставить механизм подсчёта накладных расходов на pod'ы, которые могут сильно отличаться в зависимости от используемой исполняемой среды (runtime). В качестве примера авторы этого KEP [9] приводят Kata Containers, которые требуют запуска гостевого ядра, агента kata, init-системы и т.п. Когда overhead становится таким большим, его нельзя игнорировать, а значит — требуется способ учитывать его для дальнейшего квотирования, планирования и т.п. Для его реализации в PodSpec
добавлено поле Overhead *ResourceList
(сопоставляется с данными в RuntimeClass
, если таковой используется).
Ещё одно заметное нововведение — менеджер топологии узла (Node Topology Manager), призванный унифицировать подход к тонкой настройке распределения аппаратных ресурсов для различных компонентов в Kubernetes. Эта инициатива вызвана растущей потребностью различных современных систем (из области телекоммуникаций, машинного обучения, финансовых услуг и т.п.) в высокопроизводительных параллельных вычислениях и минимизации задержек при исполнении операций, для чего они используют продвинутые возможности CPU и аппаратного ускорения. Такие оптимизации в Kubernetes до сих пор достигались благодаря разрозненным компонентам (CPU manager, Device manager, CNI), а теперь им добавят единый внутренний интерфейс, который унифицирует подход и упростит подключение новых аналогичных — так называемых topology-aware — компонентов на стороне Kubelet. Подробности — в соответствующем KEP [10].
Схема компонентов Topology Manager
Следующая фича — проверка контейнеров во время их запуска (startup probe [11]). Как известно, для контейнеров, что долго запускаются, затруднительно получить актуальный статус: их либо «убивают» ещё до реального начала функционирования, либо они на долгое время попадают в deadlock. Новая проверка (включается через feature gate под названием StartupProbeEnabled
) отменяет — точнее, откладывает — действие любых других проверок до того момента, когда pod закончил свой запуск. По этой причине фичу изначально называли pod-startup liveness-probe holdoff [12]. Для pod'ов, что долго стартуют, можно проводить опрос состояния в относительно короткие временные интервалы.
Кроме того, сразу в статусе бета-версии представлено улучшение для RuntimeClass, добавляющее поддержку «гетерогенных кластеров». C RuntimeClass Scheduling [13] теперь вовсе не обязательно каждому узлу иметь поддержку каждого RuntimeClass'а: для pod'ов можно выбирать RuntimeClass, не думая о топологии кластера. Раньше для достижения этого — чтобы pod'ы оказывались на узлах с поддержкой всего им нужного — приходилось назначать соответствующие правила к NodeSelector и tolerations. В KEP [14] рассказывается о примерах использования и, конечно же, подробностях реализации.
Две значимые сетевые фичи, что появились впервые (в альфа-версии) в Kubernetes 1.16 — это:
Пример вывода IP-адресов двух видов (IPv4 и IPv6) в списке pod'ов:
kube-master# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-controller 1/1 Running 0 20m fd00:db8:1::2,192.168.1.3 kube-minion-1
kube-master#
EndpointSlice
, каждый из которых по умолчанию имеет не более 100 endpoint'ов (значение настраивается). В EndpointSlice API предусмотрят и возможности для его будущего развития: поддержки множества IP-адресов у каждого pod'а, новых состояний для endpoint'ов (не только Ready
и NotReady
), динамического subsetting для endpoint'ов.
До бета-версии продвинулся представленный в прошлом релизе finalizer [18], названный service.kubernetes.io/load-balancer-cleanup
и прикрепляемый к каждому сервису с типом LoadBalancer
. В момент удаления такого сервиса он предотвращает фактическое удаление ресурса, пока не завершена «зачистка» всех соответствующих ресурсов балансировщика.
Настоящая «веха стабилизации» зафиксирована в области API-сервера Kubernetes и взаимодействия с ним. Во многом это случилось благодаря переводу в статус stable не нуждающихся в особом представлении CustomResourceDefinitions [19] (CRD), что имели статус бета-версии со времён далёкого Kubernetes 1.7 (а это июнь 2017 года!). Такая же стабилизация пришла и к связанным с ними фичам:
/status
и /scale
для CustomResources;Ещё один механизм, давно ставший привычным для администраторов Kubernetes: admission webhook [24] — тоже долгое время пребывал в статусе беты (с K8s 1.9) и теперь объявлен стабильным.
Две другие фичи достигли бета-версии: server-side apply [25] и watch bookmarks [26].
А единственным значимым нововведением в альфа-версии стал отказ [27] от SelfLink
— специального URI, представляющего указанный объект и являющегося частью ObjectMeta
и ListMeta
(т.е. частью любого объекта в Kubernetes). Зачем от него отказываются? Мотивация «по-простому» звучит [28] как отсутствие настоящих (непреодолимых) причин для того, чтобы это поле по-прежнему существовало. Более формальные причины — оптимизировать производительность (убрав ненужное поле) и упростить работу generic-apiserver, который вынужден обрабатывать такое поле особым образом (это единственное поле, которое устанавливается прямо перед сериализацией объекта). Настоящее «устаревание» (в рамках бета-версии) SelfLink
произойдет к версии Kubernetes 1.20, а окончательное — 1.21.
Основная работа в области storage, как и в прошлых релизах, наблюдается в области поддержки CSI [29]. Главными изменениями здесь стали:
Схема реализации CSI-плагинов в Kubernetes для Windows
Появившаяся в прошлой версии Kubernetes функция клонирования томов [33] (использование существующих PVC в качестве DataSource
для создания новых PVC) тоже теперь получила статус бета-версии.
Два заметных изменения в планировании (оба в альфа-версии):
EvenPodsSpreading
[34] — возможность использовать для «честного распределения» нагрузок pod'ы вместо логических единиц приложения (вроде Deployment и ReplicaSet) и регулировки этого распределения (как жёсткого требования или как мягкого условия, т.е. приоритета). Фича расширит имеющиеся возможности распределения планируемых pod'ов, ныне ограниченные опциями PodAffinity
и PodAntiAffinity
, предоставив администраторам более тонкий контроль в этом вопросе, а значит — лучшую высокую доступность и оптимизированное потребление ресурсов. Подробности — в KEP [35].
Планирование pod'ов: до использования best fit policy (напрямую через default scheduler) и с её использованием (через scheduler extender)
Кроме того, представлена [38] возможность создавать свои плагины для планировщика вне основного дерева разработки Kubernetes (out-of-tree).
Также в релизе Kubernetes 1.16 можно отметить инициативу по приведению [39] имеющихся метрик в полный порядок, а если точнее — в соответствие с официальными предписаниями [40] к инструментации K8s. Они по большому счёту опираются на соответствующую документацию Prometheus [41]. Несыстоковки же образовались по разным причинам (например, некоторые метрики были попросту созданы ещё до того, как текущие инструкции появились), и разработчики решили, что настало время привести всё к единому стандарту, «в соответствие с остальной экосистемой Prometheus». Текущая реализация этой инициативы носит статус альфа-версии, который будет последовательно повышаться в последующих версиях Kubernetes до беты (1.17) и стабильного (1.18).
Кроме того, можно отметить следующие изменения:
RunAsUserName
для Windows-контейнеров (альфа-версия), улучшением [44] поддержки Group Managed Service Account (gMSA) до бета-версии, поддержкой [45] mount/attach для томов vSphere.Accept-Encoding: gzip
в заголовке, получают сжатый в GZIP ответ, если его размер превышал 128 Кб. Клиенты на Go автоматически поддерживают сжатие (отправляют нужный заголовок), так что сразу заметят снижение трафика. (Для других языков могут потебоваться небольшие модификации.)k8s.io/client-go/metadata.Client
[48] — для «обобщённого» доступа к объектам. Он предназначен для того, чтобы легко получать метаданные (т.е. подраздел metadata
) из ресурсов кластера и осуществлять с ними операции из разряда сбора мусора и квотирования.init
, join
и upgrade
. Подробнее о том, как пользоваться флагом --experimental-kustomize
, см. в KEP [51].readyz
[52], — позволяющий экспортировать информацию о его готовности (readiness). Также у API-сервера появился флаг --maximum-startup-sequence-duration
, позволяющий регулировать его перезапуски.service.beta.kubernetes.io/azure-pip-name
для указания публичного IP у балансировщика нагрузки;LoadBalancerName
и LoadBalancerResourceGroup
.DescribeInstances
.Читайте также в нашем блоге:
Автор: Dmitry Stolyarov
Источник [68]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/330415
Ссылки в тексте:
[1] состоится: https://github.com/kubernetes/sig-release/tree/master/releases/release-1.16#tldr
[2] таблицы Kubernetes enhancements tracking: https://docs.google.com/spreadsheets/d/1txj0SuCJGm_uDCcJJDx_IjrfhlSnW-thtfQY91oXRLo/edit#gid=0
[3] CHANGELOG-1.16: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.16.md
[4] эфемерные контейнеры: https://github.com/kubernetes/enhancements/issues/277
[5] соответствующем KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190212-ephemeral-containers.md
[6] kubectl-debug: https://github.com/aylei/kubectl-debug
[7] уже писали: https://habr.com/ru/company/flant/blog/436112/
[8] PodOverhead
: https://github.com/kubernetes/enhancements/issues/688
[9] этого KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md
[10] соответствующем KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/0035-20190130-topology-manager.md
[11] startup probe: https://github.com/kubernetes/enhancements/issues/950
[12] pod-startup liveness-probe holdoff: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190221-livenessprobe-holdoff.md
[13] RuntimeClass Scheduling: https://github.com/kubernetes/enhancements/issues/894
[14] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/runtime-class-scheduling.md
[15] Поддержка: https://github.com/kubernetes/enhancements/issues/563
[16] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20180612-ipv4-ipv6-dual-stack.md
[17] EndpointSlice API: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20190603-EndpointSlice-API.md
[18] finalizer: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20190423-service-lb-finalizer.md
[19] CustomResourceDefinitions: https://github.com/kubernetes/enhancements/issues/95
[20] «подресурсы» (subresources): https://github.com/kubernetes/enhancements/issues/571
[21] преобразование: https://github.com/kubernetes/enhancements/issues/598
[22] представленные недавно: https://github.com/kubernetes/enhancements/issues/575
[23] возможность: https://github.com/kubernetes/enhancements/issues/692
[24] admission webhook: https://github.com/kubernetes/enhancements/issues/492
[25] server-side apply: https://github.com/kubernetes/enhancements/issues/555
[26] watch bookmarks: https://github.com/kubernetes/enhancements/issues/956
[27] отказ: https://github.com/kubernetes/enhancements/issues/1164
[28] звучит: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190711-remove-selflink.md
[29] поддержки CSI: https://habr.com/ru/company/flant/blog/465417/
[30] появилась: https://github.com/kubernetes/enhancements/issues/1122
[31] изменения размера CSI-томов: https://github.com/kubernetes/enhancements/issues/556
[32] CSI Inline Volume Support: https://github.com/kubernetes/enhancements/issues/596
[33] функция клонирования томов: https://github.com/kubernetes/enhancements/issues/989
[34] EvenPodsSpreading
: https://github.com/kubernetes/enhancements/issues/895
[35] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190221-even-pods-spreading.md
[36] bin packing: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE%D0%B1_%D1%83%D0%BF%D0%B0%D0%BA%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B2_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B
[37] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190311-resource_bin_packing_priority_function.md
[38] представлена: https://github.com/kubernetes/kubernetes/pull/78162
[39] приведению: https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20181106-kubernetes-metrics-overhaul.md
[40] официальными предписаниями: https://github.com/kubernetes/community/blob/master/contributors/devel/instrumentation.md
[41] документацию Prometheus: https://prometheus.io/docs/practices/instrumentation/
[42] появлением: https://github.com/kubernetes/enhancements/issues/995
[43] возможностью: https://github.com/kubernetes/enhancements/issues/1043
[44] улучшением: https://github.com/kubernetes/enhancements/issues/689
[45] поддержкой: https://github.com/kubernetes/kubernetes/pull/80911
[46] Переработанный: https://github.com/kubernetes/kubernetes/pull/77449
[47] Стало возможным: https://github.com/kubernetes/kubernetes/pull/74526
[48] k8s.io/client-go/metadata.Client
: https://github.com/kubernetes/kubernetes/pull/77819
[49] теперь можно: https://github.com/kubernetes/enhancements/issues/1179
[50] добавили: https://github.com/kubernetes/enhancements/issues/1177
[51] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/20190722-Advanced-configurations-with-kubeadm-(Kustomize).md
[52] readyz
: https://github.com/kubernetes/kubernetes/pull/78458
[53] зон доступности: https://github.com/kubernetes/enhancements/issues/586
[54] cross resource group: https://github.com/kubernetes/enhancements/issues/604
[55] поддержка аутентификации: https://github.com/kubernetes/kubernetes/pull/80841
[56] аннотация: https://github.com/kubernetes/kubernetes/pull/81213
[57] возможность: https://github.com/kubernetes/kubernetes/pull/81054
[58] поддержка: https://github.com/kubernetes/kubernetes/pull/79552
[59] оптимизированы: https://github.com/kubernetes/kubernetes/pull/78140
[60] мигрирует: https://github.com/kubernetes/kubernetes/pull/78033
[61] сделали: https://github.com/kubernetes/kubernetes/pull/79722
[62] прекратил: https://github.com/kubernetes/kubernetes/pull/80037
[63] Cluster Autoscaler 1.16.0: https://github.com/kubernetes/autoscaler/releases/tag/cluster-autoscaler-1.16.0
[64] Kubernetes 1.15: обзор основных новшеств: https://habr.com/ru/company/flant/blog/456084/
[65] Kubernetes 1.14: обзор основных новшеств: https://habr.com/ru/company/flant/blog/445196/
[66] Kubernetes 1.13: обзор основных новшеств: https://habr.com/ru/company/flant/blog/432208/
[67] Kubernetes 1.12: обзор основных новшеств: https://habr.com/ru/company/flant/blog/424331/
[68] Источник: https://habr.com/ru/post/467477/?utm_source=habrahabr&utm_medium=rss&utm_campaign=467477
Нажмите здесь для печати.