- PVSM.RU - https://www.pvsm.ru -
Вчера, 25 марта, состоялся [1] очередной релиз Kubernetes — 1.18. По сложившейся для нашего блога традиции, мы рассказываем о наиболее значимых изменениях в новой версии.
Информация, использованная для подготовки этого материала, взята из официального анонса, таблицы Kubernetes enhancements tracking [2], CHANGELOG-1.18 [3], обзоров от SUSE [4] и Sysdig [5], а также соответствующих issues, pull requests, Kubernetes Enhancement Proposals (KEP)…
Релиз Kubernetes 1.18 получил свой официальный логотип, суть которого сводится к сравнению проекта с Большим адронным коллайдером. Подобно БАК, что стал результатом работы тысяч учёных со всего мира, Kubernetes объединил вокруг себя тысячи разработчиков из сотен организаций, и все они работают над общим делом: «улучшением облачных вычислений во всех аспектах».
Тем временем, энтузиасты из команды SUSE подготовили облако слов, созданное на основе записей release notes к 3412 коммитам, сделанным для релиза K8s 1.18. И оно получилось таким:
Теперь — о том, что же стоит за этими словами, в более понятном для пользователей виде.
Главное новшество здесь — это профили планирования [6] (Scheduling Profiles). Связано оно с тем, что чем более неоднородными становятся рабочие нагрузки в кластере, тем скорее возникает потребность в разных подходах к их планированию.
Для решения этой проблемы авторы предлагают, чтобы планировщик использовал разные конфигурации, назначаемые на имя планировщика и называемые профилями. Стартуя, kube-scheduler просматривает все доступные профили и сохраняет их в реестр. Если профилей в конфигурации нет, выбирается вариант по умолчанию (default-scheduler
). После того, как pod'ы попадают в очередь, kube-scheduler выполняет их планирование с учётом выбранного планировщика.
Сами политики планирования основываются на предикатах (PodFitsResources
, PodMatchNodeSelector
, PodToleratesNodeTaints
и т.п.) и приоритетах (SelectorSpreadPriority
, InterPodAffinityPriority
, MostRequestedPriority
, EvenPodsSpreadPriority
и т.п.). В реализации сразу предусмотрена система плагинов, чтобы все профили добавлялись через специальный фреймворк.
Текущая структура конфигурации (вскоре будет изменена):
type KubeSchedulerConfiguration struct {
...
SchedulerName string
AlgorithmSource SchedulerAlgorithmSource
HardPodAffinitySymmetricWeight
Plugins *Plugins
PluginConfig []PluginConfig
...
}
… и пример настройки:
profiles:
- schedulerName: 'default-scheduler'
pluginConfig:
- name: 'InterPodAffinity'
- args:
hadPodAffinityWeight: <value>
К следующему релизу K8s ожидается перевод фичи в бета-версию, а ещё через два — стабилизация. Подробнее о профилях для планировщика см. в соответствующем KEP [7].
Другое новшество, появившееся в статусе альфа-версии, — настраиваемое по умолчанию [8] правило для равномерного распределения pod'ов (Even Pod Spreading). В настоящий момент правила определяются в PodSpec
и привязываются к pod'ам, а теперь стало возможным задавать глобальную настройку на уровне кластера. Подробности — в KEP [9].
В то же время сама фича Pod Topology Spread [10] (её feature gate — EvenPodsSpread
), позволяющая равно распределять pod'ы по кластеру категории multi-zone, переведена в статус бета-версии.
Кроме того, объявлено о стабилизации Taint Based Eviction [11], призванной добавлять taints на узлы при наступлении определённых условий. Впервые фича появилась в уже далёком релизе K8s 1.8 [12], а статус бета-версии получила в 1.13 [13].
Больше года в печи Kubernetes enhancements томится занятная фича под названием Configurable scale velocity for HPA [14], т.е. настраиваемая скорость горизонтального масштабирования. (К слову её разработку инициировал наш соотечественник [15].) В новом релизе она была доведена до первой стадии массового использования — стала доступна в альфа-версии.
Как известно, Horizontal Pod Autoscaler (HPA) в Kubernetes масштабирует число pod'ов у любого ресурса, поддерживающего подресурс scale
, основываясь на потреблении CPU или других метриках. Новая возможность позволяет контролировать скорость, с которой это масштабирование происходит, причём в обе стороны. До сих пор её можно было регулировать весьма ограничено (см., например, глобальный для кластера параметр --horizontal-pod-autoscaler-downscale-stabilization-window
).
Основная мотивация к введению настраиваемой скорости масштабирования — возможность разделения рабочих нагрузок кластера по их важности для бизнеса, позволив одним приложениям (обрабатывающим самый критичный трафик) иметь максимальную скорость увеличения в размере и невысокую скорость сворачивания (т.к. может случиться новый всплеск нагрузки), а другим — масштабироваться по иным критериям (для экономии средств и т.п.).
Предложенное решение — для конфигураций HPA добавлен объект behavior
, позволяющий определять правила для контролирования масштабирования в обе стороны (scaleUp
и scaleDown
). Например, конфигурация:
behavior:
scaleUp:
policies:
- type: percent
value: 900%
… приведёт к тому, что число запущенных в настоящий момент pod'ов будет увеличиваться на 900%. Т.е., если приложение стартует как один pod, в случае необходимости масштабирования оно начнёт расти как 1 → 10 → 100 → 1000.
Другие примеры и детали по реализации — см. в KEP [16].
Прогресс в поддержке HugePages (общий KEP по фиче [17]): в альфа-версии реализована [18] поддержка этих страниц на уровне контейнеров и возможность запрашивать страницы разного размера.
Менеджер топологии узла (Node Topology Manager [19]), призванный унифицировать подход к тонкой настройке распределения аппаратных ресурсов для различных компонентов в Kubernetes, переведён в статус бета-версии.
Также статус бета-версии получила представленная в K8s 1.16 фича PodOverhead [20], предлагающая механизм подсчёта накладных расходов на pod'ы.
Добавлена [21] альфа-версия команды kubectl debug (её KEP [22]), которая развила концепцию «эфемерных контейнеров [23]». Они были впервые представлены в K8s 1.16 с целью упростить отладку в pod'ах. Для этого в нужном pod'е запускается временный (т.е. живущий непродолжительное время) контейнер, содержащий в себе необходимые инструменты для отладки. Как мы уже писали, эта команда по своей сути идентична существовавшему до сих пор плагину kubectl-debug (его обзор [24]).
Иллюстрация работы kubectl debug
:
% kubectl help debug
Execute a container in a pod.
Examples:
# Start an interactive debugging session with a debian image
kubectl debug mypod --image=debian
# Run a debugging session in the same namespace as target container 'myapp'
# (Useful for debugging other containers when shareProcessNamespace is false)
kubectl debug mypod --target=myapp
Options:
-a, --attach=true: Automatically attach to container once created
-c, --container='': Container name.
-i, --stdin=true: Pass stdin to the container
--image='': Required. Container image to use for debug container.
--target='': Target processes in this container name.
-t, --tty=true: Stdin is a TTY
Usage:
kubectl debug (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]
Use "kubectl options" for a list of global command-line options (applies to all commands).
Другая команда — kubectl diff, — впервые появившаяся ещё в K8s 1.9 [25] и получившая статус бета-версии в 1.13, наконец-то объявлена [26] стабильной. Как понятно из названия, она позволяет сравнивать конфигурации кластеров. По случаю стабилизации фичи у неё появился KEP [27], а также была обновлена [28] вся соответствующая документация на сайте Kubernetes.
Кроме того, флагу kubectl --dry-run добавили [29] поддержку разных значений (client
, server
, none
), что позволяет пробовать исполнение команды только на стороне клиента или сервера. Для её реализации на стороне сервера реализована [30] поддержка основных команд включая create
, apply
, patch
и другие.
Началось [31] перемещение ресурса Ingress из текущей группы API (extensions.v1beta1
) в networking.v1beta1
с последующей стабилизацией в виде v1
. Для этого запланировано проведение ряда изменений (KEP [32]). На данный момент — в рамках бета-версии в K8s 1.18 — Ingress получил два значимых новшества:
pathType
, позволяющее определять, по какому принципу будет производиться сопоставление пути (Exact
, Prefix
или ImplementationSpecific
; последнее поведение определяется в IngressClass
);IngressClass
и новое (неизменяемое) поле Class
в определении IngressSpec
, указывающее на то, какой котроллер реализует ресурс Ingress. Эти изменения приходят на смену аннотации kubernetes.io/ingress.class
, использование которой объявят устаревшим.Для многих сетевых фич был повышен статус готовности:
AppProtocol
[34], определяющее прикладной протокол для каждого порта сервиса (ресурсы ServicePort
и EndpointPort
);
В альфа-версии представлена [37] основа для создания томов с предварительно загруженными на них данными — Generic Data Populators (KEP [38]). В качестве реализации предлагается ослабить валидацию поля DataSource
с тем, чтобы источниками данных могли быть объекты произвольных типов.
Перед bind-монтированием тома в контейнер права на все его файлы меняются в соответствии со значением fsGroup
. Эта операция может сломать работу некоторых приложений (например, популярных СУБД), а также занимать очень много времени (для больших томов — более 1 Тб). Новое поле PermissionChangePolicy
для PersistentVolumeClaimVolumeSource
позволяет [39] определять, требуется ли менять владельца для содержимого тома. Текущая реализация — альфа-версия, подробности — в KEP [40].
Для объектов Secrets
и ConfigMaps
добавлено [41] новое поле immutable
, делающее их неизменяемыми. Как правило, эти объекты используются в pod'ах как файлы. Любые изменения в этих файлах быстро (примерно через минуту) распространяются на все pod'ы, примонтировавшие файлы. Таким образом, неудачное обновление секрета или ConfigMap'а может привести к сбою всего приложения.
Авторы фичи заявляют, что даже в случае обновления приложений рекомендуемым способом — через rolling upgrades — возможны сбои, вызванные неудачными обновлениями существующих секретов/ConfigMap'ов. Более того, сам процесс обновления этих объектов в запущенных pod'ах сложен с точки зрения производительности и масштабируемости (каждый kubelet вынужден постоянно следить за каждым уникальным секретом/CM).
В текущей реализации сделано так, что после того, как ресурс отмечен как неизменяемый, это изменение невозможно откатить. Потребуется не только удалить объект и создать его снова, но и пересоздать pod'ы, использующие удалённый секрет. Версия — альфа, подробности — KEP [42].
Стабильными объявлены:
Среди других новшеств в Kubernetes 1.18 (более полный перечень см. в CHANGELOG [3]):
FlowSchema
) и им назначаются ресурсы (через объекты RequestPriority
). Иллюстрация конфигурации для обработки пользовательских запросов через kubectl
:
kind: RequestPriority
meta:
name: workload-high
spec:
assuredConcurrencyShares: 30
queues: 128
handSize: 6
queueLengthLimit: 100
kind: FlowSchema
meta:
name: workload-high
spec:
requestPriority:
name: workload-high
flowDistinguisher:
source: namespace
# no transformation in this case
match:
- and: # users using kubectl
- notPatternMatch:
field: user
pattern: system:serviceaccount:.*
Изменения в зависимостях:
apps/v1beta1
и extensions/v1beta1
должны перейти на apps/v1
, также стоит обратить внимание на частности с ресурсами daemonsets
, deployments
, replicasets
, networkpolicies
, podsecuritypolicies
;/metrics/resource/v1alpha1
не обслуживается [58] — вместо него теперь /metrics/resource
;kubectl run
убраны [59] кроме единственного, отвечающего за генерацию pod'а.Читайте также в нашем блоге:
Автор: Dmitry Stolyarov
Источник [64]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/350796
Ссылки в тексте:
[1] состоялся: https://kubernetes.io/blog/2020/03/25/kubernetes-1-18-release-announcement/
[2] таблицы Kubernetes enhancements tracking: https://docs.google.com/spreadsheets/d/1RtCvByYdcqWc6I_A1cKgeXT2tBS7SyHGvSt_DWXz270/edit
[3] CHANGELOG-1.18: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md
[4] SUSE: https://www.suse.com/c/whats-new-in-kubernetes-v1-18-0/
[5] Sysdig: https://sysdig.com/blog/whats-new-kubernetes-1-18/
[6] профили планирования: https://github.com/kubernetes/enhancements/issues/1451
[7] соответствующем KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20200114-multi-scheduling-profiles.md
[8] настраиваемое по умолчанию: https://github.com/kubernetes/enhancements/issues/1258
[9] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20190926-default-even-pod-spreading.md
[10] Pod Topology Spread: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
[11] Taint Based Eviction: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#taint-based-evictions
[12] K8s 1.8: https://habr.com/ru/company/flant/blog/338230/
[13] 1.13: https://habr.com/ru/company/flant/blog/432208/
[14] Configurable scale velocity for HPA: https://github.com/kubernetes/enhancements/issues/853
[15] наш соотечественник: https://github.com/gliush
[16] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/20190307-configurable-scale-velocity-for-hpa.md
[17] общий KEP по фиче: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190129-hugepages.md
[18] реализована: https://github.com/kubernetes/enhancements/issues/1539
[19] Node Topology Manager: https://kubernetes.io/docs/tasks/administer-cluster/topology-manager/
[20] PodOverhead: https://kubernetes.io/docs/concepts/configuration/pod-overhead/
[21] Добавлена: https://github.com/kubernetes/enhancements/issues/1441
[22] её KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cli/20190805-kubectl-debug.md
[23] эфемерных контейнеров: https://github.com/kubernetes/enhancements/issues/277
[24] его обзор: https://habr.com/ru/company/flant/blog/436112/
[25] K8s 1.9: https://habr.com/ru/company/flant/blog/344220/
[26] объявлена: https://github.com/kubernetes/enhancements/pull/1460
[27] появился KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cli/20200115-kubectl-diff.md
[28] была обновлена: https://github.com/kubernetes/kubernetes/issues/86525
[29] добавили: https://github.com/kubernetes/kubernetes/pull/87580
[30] реализована: https://github.com/kubernetes/kubernetes/pull/87714
[31] Началось: https://github.com/kubernetes/enhancements/issues/1453
[32] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20190125-ingress-api-group.md
[33] NodeLocal DNS Cache: https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/
[34] AppProtocol
: https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol
[35] поддержка IPv6: https://github.com/kubernetes/enhancements/issues/508
[36] EndpointSlices API: https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/
[37] представлена: https://github.com/kubernetes/enhancements/issues/1495
[38] KEP: https://github.com/bswartz/enhancements/blob/933a044fa4efc137cd6a6479c96cbf627a4e92cc/keps/sig-storage/20200120-generic-data-populators.md
[39] позволяет: https://github.com/kubernetes/enhancements/issues/695
[40] KEP: https://github.com/mattsmithdatera/enhancements/blob/master/keps/sig-storage/20190117-SkipVolumeOwnershipChange.md
[41] добавлено: https://github.com/kubernetes/enhancements/issues/1412
[42] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/20191117-immutable-secrets-configmaps.md
[43] клонирование: https://github.com/kubernetes/enhancements/issues/989
[44] возможность: https://github.com/kubernetes/features/issues/351
[45] поддержка: https://github.com/kubernetes/enhancements/issues/565
[46] передача: https://github.com/kubernetes/enhancements/issues/603
[47] появилась: https://github.com/kubernetes/enhancements/issues/1393
[48] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/20190730-oidc-discovery.md
[49] Альфа-версия: https://github.com/kubernetes/enhancements/issues/1040
[50] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/20190228-priority-and-fairness.md
[51] CertificateSigningRequest API: https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/20190607-certificates-api.md
[52] поддержка CRI-ContainerD: https://github.com/kubernetes/enhancements/issues/1001
[53] реализация RuntimeClass: https://github.com/kubernetes/enhancements/issues/1301
[54] поддержка CSI-драйверов: https://github.com/kubernetes/enhancements/issues/1122#issuecomment-575928270
[55] поддержки GMSA: https://github.com/kubernetes/enhancements/issues/689
[56] RunAsUserName: https://github.com/kubernetes/enhancements/issues/1043
[57] не обслуживает: https://github.com/kubernetes/kubernetes/pull/85903
[58] не обслуживается: https://github.com/kubernetes/kubernetes/pull/86282
[59] убраны: https://github.com/kubernetes/kubernetes/pull/87077
[60] Kubernetes 1.17: обзор основных новшеств: https://habr.com/ru/company/flant/blog/476998/
[61] Kubernetes 1.16: обзор основных новшеств: https://habr.com/ru/company/flant/blog/467477/
[62] Kubernetes 1.15: обзор основных новшеств: https://habr.com/ru/company/flant/blog/456084/
[63] Kubernetes 1.14: обзор основных новшеств: https://habr.com/ru/company/flant/blog/445196/
[64] Источник: https://habr.com/ru/post/493284/?utm_source=habrahabr&utm_medium=rss&utm_campaign=493284
Нажмите здесь для печати.