- PVSM.RU - https://www.pvsm.ru -
Вчера, 9 декабря, состоялся [1] очередной релиз Kubernetes — 1.17. По сложившейся для нашего блога традиции, мы рассказываем о наиболее значимых изменениях в новой версии.
Информация, использованная для подготовки этого материала, взята из официального анонса, таблицы Kubernetes enhancements tracking [2], CHANGELOG-1.17 [3] и соответствующих issues, pull requests, а также Kubernetes Enhancement Proposals (KEP). Итак, что нового?..
Вот уже долгое время в сообществе Kubernetes ждали этой фичи — Topology-aware service routing. Если KEP [4] по ней берёт своё начало в октябре 2018-го, а официальный enhancement [5] — 2 года назад, то обычные issues (вроде этого [6]) — и вовсе старше ещё на несколько лет…
Общая идея сводится к тому, чтобы предоставить возможность реализовывать «локальную» маршрутизацию для сервисов, находящихся в Kubernetes. «Локальность» в данном случае означает «тот же самый топологический уровень» (topology level), коим может являться:
Примеры использования такой фичи:
Такую маршрутизацию, «знающую» о топологии, ещё называют подобием network affinity — по аналогии с node affinity [8], pod affinity/anti-affinity [9] или появившимся не так давно [10] Topology-Aware Volume Scheduling [11] (или Volume Provisioning [12]). Текущий уровень реализации ServiceTopology
в Kubernetes — альфа-версия.
Подробности о том, как фича устроена и как ей уже можно воспользоваться, читайте в этой статье [13] от одного из авторов.
Значительный прогресс зафиксирован [14] в другой сетевой фиче: одновременной поддержке двух IP-стеков, что была впервые представлена в K8s 1.16 [15]. В частности, новый релиз принёс следующие изменения:
Pod.Status.PodIPs
появилась [17] поддержка downward API (одновременно с этим в /etc/hosts
теперь требуют для хоста добавлять и IPv6-адрес);
Иллюстрация [20] использования двойного стека IPV4/IPv6 в KIND
Объявлена стабильной поддержка топологий [21] для хранилищ на базе CSI, впервые представленная в K8s 1.12 [21].
Инициатива по миграции плагинов томов на CSI — CSI Migration [22] — достигла бета-версии. Эта фича критична для того, чтобы перевести существующие плагины хранилищ (in-tree) на современный интерфейс (CSI, out-of-tree) незаметно для конечных пользователей Kubernetes. Администраторам кластеров будет достаточно активировать CSI Migration, после чего существующие stateful-инсталляции и рабочие нагрузки будут по-прежнему «просто работать», но уже с использованием актуальных CSI-драйверов вместо устаревших, входящих в ядро Kubernetes.
На данный момент в статусе бета-версии готова миграция для драйверов AWS EBS (kubernetes.io/aws-ebs
) и GCE PD (kubernetes.io/gce-pd
). Прогнозы по другим хранилищам таковы:
О том, как «традиционная» поддержка хранилищ в K8s пришла к CSI, мы рассказывали в этой статье [23]. А переходу миграции CSI в статус бета-версии посвящена отдельная публикация [24] в блоге проекта.
Кроме того, статуса бета-версии (т.е. включения по умолчанию) в релизе Kubernetes 1.17 достигла другая значимая функциональность в контексте CSI, берущая своё начало (альфа-реализацию) в K8s 1.12, — создание снапшотов [25] и восстановление из них. Среди изменений, произведённых в Kubernetes Volume Snapshot на пути к бета-релизу: разбивка sidecar'а CSI external-snapshotter на два контроллера, добавлен секрет на удаление (deletion secret) как аннотация к содержимому снапшота тома, новый финализатор (finalizer) для предотвращения удаления API-объекта снапшота при наличии оставшихся связей.
На момент релиза 1.17 фича поддерживается у следующих CSI-драйверов: GCE Persistent Disk CSI Driver, Portworx CSI Driver и NetApp Trident CSI Driver. Подробнее о её реализации и использовании можно прочитать в этой публикации [26] в блоге.
Лейблы, которые автоматически назначаются на создаваемые узлы и тома в зависимости от используемого облачного провайдера, были доступны в Kubernetes как бета-версия уже очень давно — начиная с релиза K8s 1.2 (апрель 2016 года). Учитывая их широкое применение так долго, разработчики решили [27], что настало время объявить фичу стабильной (GA).
Посему все они были переименованы соответствующим образом (по топологиям):
beta.kubernetes.io/instance-type
→ node.kubernetes.io/instance-type
failure-domain.beta.kubernetes.io/zone
→ topology.kubernetes.io/zone
failure-domain.beta.kubernetes.io/region
→ topology.kubernetes.io/region
… но по-прежнему доступны и по своим старым названиям (для обратной совместимости), однако всем администраторам рекомендуется переходить на актуальные лейблы. Соответствующая документация [28] K8s была обновлена.
В формате альфа-версии впервые представлен структурированный вывод для утилиты kubeadm [29]. Поддерживаемые форматы: JSON, YAML, Go-шаблон.
Мотивация к реализации этой фичи (согласно KEP [30]) такова:
Хоть Kubernetes и может быть развёрнут вручную, стандартом де-факто (если не де-юре) для этой операции является использование kubeadm. Популярные инструменты управления системами вроде Terraform опираются на kubeadm для деплоя Kubernetes. Запланированные улучшения в Cluster API включают в себя компонуемый пакет для bootstrapping'а Kubernetes с kubeadm и cloud-init.
Без структурированного вывода даже самые безобидные на первый взгляд изменения могут сломать Terraform, Cluster API и другой софт, использующий результаты работы kubeadm.
В ближайших планах значится поддержка (в виде структурированного вывода) для следующих команд:
alpha certs
config images list
init
token create
token list
upgrade plan
version
Иллюстрация JSON-ответа на команду kubeadm init -o json
:
{
"node0": "192.168.20.51:443",
"caCrt": "sha256:1f40ff4bd1b854fb4a5cf5d2f38267a5ce5f89e34d34b0f62bf335d74eef91a3",
"token": {
"id": "5ndzuu.ngie1sxkgielfpb1",
"ttl": "23h",
"expires": "2019-05-08T18:58:07Z",
"usages": [
"authentication",
"signing"
],
"description": "The default bootstrap token generated by 'kubeadm init'.",
"extraGroups": [
"system:bootstrappers:kubeadm:default-node-token"
]
},
"raw": "Rm9yIHRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSAia3ViZWFkbSBpbml0IiBjb21tYW5kLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2FrdXR6LzdhNjg2ZGU1N2JmNDMzZjkyZjcxYjZmYjc3ZDRkOWJhI2ZpbGUta3ViZWFkbS1pbml0LW91dHB1dC1sb2c="
}
Вообще же, релиз Kubernetes 1.17 был выпущен под девизом «Стабильность». Тому способствовал тот факт, что очень многие фичи в нём (их общее количество — 14) получили статус GA. Среди таковых:
TaintNodesByCondition
[31]), появившаяся в K8s 1.8 [32];resourceVersion
) уже были обработаны watch'ем;ScheduleDaemonSetPods
— планирование pod'ов в DaemonSet [36] с помощью kube-scheduler (вместо контроллера DaemonSet);subPath
;Полный список новшеств в Kubernetes 1.17, конечно, не ограничивается перечисленными выше. Вот некоторые другие из них (а для более полного перечня — см. CHANGELOG [3]):
RunAsUserName
для Windows [41];--reserved-cpus
[43] — позволяет явно определять список CPU, зарезервированных для системы;kubectl logs
добавлен [44] новый флаг --prefix
, добавлящий название pod'а и контейнера источника к каждой строке лога;label.Selector
добавили [45] RequiresExactMatch
;Читайте также в нашем блоге:
Автор: Dmitry Stolyarov
Источник [51]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/339478
Ссылки в тексте:
[1] состоялся: https://kubernetes.io/blog/2019/12/09/kubernetes-1-17-release-announcement/
[2] таблицы Kubernetes enhancements tracking: https://docs.google.com/spreadsheets/d/1ebKGsYB1TmMnkx86bR2ZDOibm5KWWCs_UjV3Ys71WIs/edit#gid=0
[3] CHANGELOG-1.17: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.17.md
[4] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/20181024-service-topology.md
[5] enhancement: https://github.com/kubernetes/enhancements/issues/536
[6] этого: https://github.com/kubernetes/kubernetes/issues/7433
[7] свежую иллюстрацию: https://www.lastweekinaws.com/blog/aws-cross-az-data-transfer-costs-more-than-aws-says/
[8] node affinity: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity
[9] pod affinity/anti-affinity: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity
[10] не так давно: https://habr.com/ru/company/flant/blog/353114/
[11] Topology-Aware Volume Scheduling: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/volume-topology-scheduling.md
[12] Volume Provisioning: https://kubernetes.io/blog/2018/10/11/topology-aware-volume-provisioning-in-kubernetes/
[13] этой статье: https://imroc.io/posts/kubernetes/service-topology-en/
[14] зафиксирован: https://github.com/kubernetes/enhancements/issues/563#issuecomment-536636707
[15] K8s 1.16: https://habr.com/ru/company/flant/blog/467477/
[16] реализована: https://github.com/kubernetes/kubernetes/pull/79576
[17] появилась: https://github.com/kubernetes/kubernetes/pull/83123
[18] KIND: https://github.com/kubernetes-sigs/kind/pull/692
[19] kubeadm: https://github.com/kubernetes/kubeadm/issues/1612
[20] Иллюстрация: https://github.com/kubernetes-sigs/kind/blob/8377cd8fd99c35fb4cc123793687d30bfb7a002e/site/content/docs/user/quick-start.md#dual-stack-clusters
[21] поддержка топологий: https://habr.com/ru/company/flant/blog/424331/
[22] CSI Migration: https://github.com/kubernetes/enhancements/issues/625
[23] этой статье: https://habr.com/ru/company/flant/blog/465417/
[24] отдельная публикация: https://kubernetes.io/blog/2019/12/09/kubernetes-1-17-feature-csi-migration-beta/
[25] создание снапшотов: https://github.com/kubernetes/enhancements/issues/177
[26] этой публикации: https://kubernetes.io/blog/2019/12/09/kubernetes-1-17-feature-cis-volume-snapshot-beta/
[27] решили: https://github.com/kubernetes/enhancements/issues/837
[28] Соответствующая документация: https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/#nodekubernetesioinstance-type
[29] структурированный вывод для утилиты kubeadm: https://github.com/kubernetes/enhancements/issues/1053
[30] KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/kubeadm/20190506-kubeadm-machine-output.md
[31] TaintNodesByCondition
: https://github.com/kubernetes/enhancements/issues/382
[32] K8s 1.8: https://habr.com/ru/company/flant/blog/338230/
[33] Watch Bookmarks: https://github.com/kubernetes/enhancements/issues/956
[34] значения по умолчанию: https://github.com/kubernetes/enhancements/issues/575
[35] разделяемые между контейнерами: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
[36] планирование pod'ов в DaemonSet: https://github.com/kubernetes/enhancements/issues/548
[37] динамические лимиты: https://github.com/kubernetes/enhancements/issues/554
[38] поддержка переменных окружения: https://github.com/kubernetes/enhancements/issues/559
[39] перенос Kubelet heartbeats: https://github.com/kubernetes/enhancements/issues/589
[40] Finalizer Protection: https://github.com/kubernetes/enhancements/issues/980
[41] RunAsUserName
для Windows: https://github.com/kubernetes/enhancements/issues/1043
[42] постигло: https://github.com/kubernetes/kubernetes/pull/85365
[43] --reserved-cpus
: https://github.com/kubernetes/kubernetes/pull/83592
[44] добавлен: https://github.com/kubernetes/kubernetes/pull/76471
[45] добавили: https://github.com/kubernetes/kubernetes/pull/85048
[46] теперь запускаются: https://github.com/kubernetes/kubernetes/pull/82347
[47] hyperkube: https://github.com/kubernetes/kubernetes/tree/master/cluster/images/hyperkube
[48] Kubernetes 1.15: обзор основных новшеств: https://habr.com/ru/company/flant/blog/456084/
[49] Kubernetes 1.14: обзор основных новшеств: https://habr.com/ru/company/flant/blog/445196/
[50] Kubernetes 1.13: обзор основных новшеств: https://habr.com/ru/company/flant/blog/432208/
[51] Источник: https://habr.com/ru/post/476998/?utm_source=habrahabr&utm_medium=rss&utm_campaign=476998
Нажмите здесь для печати.