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

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

Вчера, 25 марта, состоялся [1] очередной релиз Kubernetes — 1.18. По сложившейся для нашего блога традиции, мы рассказываем о наиболее значимых изменениях в новой версии.

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

Информация, использованная для подготовки этого материала, взята из официального анонса, таблицы Kubernetes enhancements tracking [2], CHANGELOG-1.18 [3], обзоров от SUSE [4] и Sysdig [5], а также соответствующих issues, pull requests, Kubernetes Enhancement Proposals (KEP)…

Релиз Kubernetes 1.18 получил свой официальный логотип, суть которого сводится к сравнению проекта с Большим адронным коллайдером. Подобно БАК, что стал результатом работы тысяч учёных со всего мира, Kubernetes объединил вокруг себя тысячи разработчиков из сотен организаций, и все они работают над общим делом: «улучшением облачных вычислений во всех аспектах».

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

Тем временем, энтузиасты из команды SUSE подготовили облако слов, созданное на основе записей release notes к 3412 коммитам, сделанным для релиза K8s 1.18. И оно получилось таким:

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

Теперь — о том, что же стоит за этими словами, в более понятном для пользователей виде.

Планировщик

Главное новшество здесь — это профили планирования [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].

Настраиваемая скорость масштабирования в HPA

Больше года в печи 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'ы.

kubectl

Добавлена [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, использование которой объявят устаревшим.

Для многих сетевых фич был повышен статус готовности:

  • стабильным стал плагин NodeLocal DNS Cache [33], улучшающий производительность работы DNS благодаря использованию агента для DNS-кэша на узлах кластера;
  • стабильным объявлено и поле AppProtocol [34], определяющее прикладной протокол для каждого порта сервиса (ресурсы ServicePort и EndpointPort);
  • поддержка IPv6 [35] признана достаточно стабильной, чтобы перевести её в бета-версию;
  • по умолчанию теперь активирован (в рамках бета-версии) и EndpointSlices API [36], выступающий как более масштабируемая и расширяемая замена обычным Endpoints.

Хранилища

В альфа-версии представлена [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]):

  • До сих пор JWT-токены для Kubernetes service accounts (KSA) аутентифицировались только в Kubernetes API. В альфа-версии появилась [47] возможность использовать сторонние системы аутентификации. Для этого в API-сервер добавлен discovery-документ, совместимый с OIDC (OpenID Connect) и содержащий публичные ключи. Существующие системы аутентификации по OIDC (т.е. службы вне K8s-кластера) могут использовать такие ключи для валидации KCA-токенов, снижая нагрузку на API-сервер. Подробности — в KEP [48].
  • Альфа-версия [49] Priority and Fairness для API (KEP [50]) — нового обработчика для более тонкого контролирования ограничения запросов к API-серверу (речь про max-in-flight). В качестве реализации предлагается продвинутая система приоритетов. В ней определяются разные типы запросов (через объекты 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:.*
  • Объявлен стабильным CertificateSigningRequest API [51], предлагающий программный интерфейс для автоматизации запроса и получения x509-сертификатов от Certificate Authority. Он был представлен ещё в K8s 1.4 и получил статус бета-версии в 1.6.
  • Ряд заметных улучшений в работе с ОС Windows: поддержка CRI-ContainerD [52] (альфа-версия), реализация RuntimeClass [53] (альфа-версия), поддержка CSI-драйверов [54] через CSI proxy (альфа-версия), стабильные версии поддержки GMSA [55] (Group Managed Service Account) и RunAsUserName [56].

Изменения в зависимостях:

  • версия CoreDNS в составе kubeadm — 1.6.7;
  • cri-tools 1.17.0;
  • CNI (Container Networking Interface) 0.8.5, Calico 3.8.4;
  • используемая версия Go — 1.13.8.

Что устарело?

  • API Server не обслуживает [57] устаревшие API: все ресурсы с apps/v1beta1 и extensions/v1beta1 должны перейти на apps/v1, также стоит обратить внимание на частности с ресурсами daemonsets, deployments, replicasets, networkpolicies, podsecuritypolicies;
  • endpoint для метрик /metrics/resource/v1alpha1 не обслуживается [58] — вместо него теперь /metrics/resource;
  • все генераторы команды kubectl run убраны [59] кроме единственного, отвечающего за генерацию pod'а.

P.S.

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

Автор: 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