- PVSM.RU - https://www.pvsm.ru -
В конце марта состоялся релиз Kubernetes 1.10 [1]. Поддерживая нашу традицию рассказывать подробности о наиболее значимых изменениях в очередном релизе Kubernetes, публикуем этот обзор, подготовленный на основе CHANGELOG-1.10 [2], а также многочисленных issues, pull requests и design proposals. Итак, что же нового приносит K8s 1.10?
Mount propagation [3] — возможность контейнеров подключать тома как rslave
, чтобы примонтированные каталоги хоста были видны внутри контейнера (значение HostToContainer
), или как rshared
, чтобы примонтированные каталоги контейнера были видны на хосте (значение Bidirectional
). Статус — бета-версия (документация [4] на сайте). Не поддерживается в Windows.
Добавлена возможность создания локальных постоянных хранилищ (Local Persistent Storage [5]), т.е. PersistentVolumes
(PVs) теперь могут быть не только сетевыми томами, но и основываться на локально подключённых дисках. Нововведение преследует две цели: а) улучшить производительность (у локальных SSD скорость лучше, чем у сетевых дисков), б) обеспечить возможность использования более дешёвых хранилищ на железных (bare metal) инсталляциях Kubernetes. Эти работы введутся вместе с созданием Ephemeral Local Storage, ограничения/лимиты [6] в котором (впервые представленные в K8s 1.8 [7]) также получили улучшения в очередном релизе — объявлены бета-версией и по умолчанию теперь включены.
Стало доступным (в бета-версии) «планирование томов с учётом топологии» (Topology Aware Volume Scheduling [8]), идея которого сводится к тому, что стандартный планировщик Kubernetes знает (и учитывает) ограничения топологии томов, а в процессе привязки PersistentVolumeClaims
(PVCs) к PVs учитываются решения планировщика. Реализовано это таким образом, что под теперь может запрашивать PVs, которые должны быть совместимы с другими его ограничениями: требованиями к ресурсам, политиками affinity/anti-affinity. При этом планирование подов, не использующих PVs с ограничениями, должно происходить с прежней производительностью. Подробности — в design-proposals [9].
Среди прочих улучшений в поддержке томов / файловых систем:
volumeMode
, а также поддержка блочных томов появилась [13] в плагине GCE PD;
Наконец, были добавлены [15] (и объявлены стабильными) дополнительные метрики, говорящие о внутреннем состоянии подсистемы хранения в Kubernetes и предназначенные для отладки, а также получения расширенного представления о состоянии кластера. Например, теперь для каждого тома (по volume_plugin
) можно узнать общее время на операции mount/umount и attach/detach, общее время privision'а и удаления, а также количество томов в ActualStateofWorld
и DesiredStateOfWorld
, bound/unbound PVCs и PVs, количество используемых подами PVCs и др. Подробнее — см. документацию [16].
Kubelet получил возможность настройки через версионируемый конфигурационный файл (вместо традиционного способа с флагами в командной строке), имеющий структуру KubeletConfiguration
. Чтобы Kubelet подхватил конфиг, необходимо запускать его с флагом --config
(подробности см. в документации [17]). Такой подход называется рекомендуемым, поскольку упрощает разворачивание узлов и управление конфигурациями. Это стало возможным благодаря появлению группы API под названием kubelet.config.k8s.io
, которая для релиза Kubernetes 1.10 имеет статус бета-версии. Пример конфигурационного файла для Kubelet:
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
evictionHard:
memory.available: "200Mi"
С помощью новой опции в спецификации пода, shareProcessNamespace
в PodSpec
, контейнеры теперь могут использовать общее для пода пространство имён для процессов (PID namespace). Ранее этой возможности не было из-за отсутствия необходимой поддержки [18] в Docker, что привело к появлению дополнительного API, который с тех пор используется некоторыми образами контейнеров… Теперь всё унифицировали [19], сохранив обратную совместимость. Результат реализации — поддержка трёх режимов разделения пространств имён PID в Container Runtime Interface (CRI): для каждого контейнера (т.е. свой namespace у каждого контейнера), для пода (общий namespace для контейнеров пода), для узла. Статус готовности — альфа.
Другое значимое изменение в CRI — появление поддержки Windows Container Configuration. До сих пор в CRI можно было конфигурировать только Linux-контейнеры, однако в спецификации исполняемой среды OCI (Open Container Initiative, Runtime Specification [20]) описаны и особенности других платформ — в частности, Windows [21]. Теперь в CRI поддерживаются [22] ограничения по ресурсам памяти и процессора для Windows-контейнеров (альфа-версия).
Кроме того, статуса бета-версии достигли три разработки Resource Management Working Group:
Количество процессов, запущенных в поде, теперь можно ограничивать [26] с помощью параметра --pod-max-pids
для консольной команды kubelet. Реализация имеет статус альфа-версии и требует включения фичи SupportPodPidsLimit
.
Благодаря тому, что в containerd 1.1 появилась родная поддержка CRI v1alpha2, в Kubernetes 1.10 с containerd 1.1 можно работать напрямую, без необходимости в «посреднике» cri-containerd (подробнее мы о нём писали в конце этой статьи [27]). В CRI-O тоже обновили версию CRI до v1alpha2, а в сам CRI (Container Runtime Interface) добавили поддержку указания GID контейнера в LinuxSandboxSecurityContext
и в LinuxContainerSecurityContext
(в дополнение к UID) — поддержка реализована для dockershim и имеет статус альфа-версии.
Опция с использованием CoreDNS вместо kube-dns достигла статуса бета-версии. В частности, это принесло [28] возможность миграции на CoreDNS при апгрейде с помощью kubeadm кластера, использующего kube-dns: в этом случае kubeadm сгенерирует конфигурацию CoreDNS (т.е. Corefile
) на основе ConfigMap
из kube-dns.
Традиционно /etc/resolv.conf
на поде управляется kubelet, а данные этого конфига генерируются на основе pod.dnsPolicy
. В Kubernetes 1.10 (в статусе бета-версии) представлена [29] поддержка конфигурации resolv.conf
для пода. Для этого в PodSpec
добавлено поле dnsParams
, которое позволяет переписывать имеющиеся настройки DNS. Подробнее — в design-proposals [30]. Иллюстрация использования dnsPolicy: Custom
с dnsParams
:
# Pod spec
apiVersion: v1
kind: Pod
metadata: {"namespace": "ns1", "name": "example"}
spec:
...
dnsPolicy: Custom
dnsParams:
nameservers: ["1.2.3.4"]
search:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: 2
- name: edns0
В kube-proxy добавлена [31] опция, позволяющая определять диапазон IP-адресов для NodePort
, т.е. инициировать фильтрацию допустимых значений с помощью --nodeport-addresses
(со значением по умолчанию 0.0.0.0/0
, т.е. пропускать всё, чему соответствует нынешнее поведение NodePort
). Предусмотрена реализация [32] в kube-proxy для iptables, Linux userspace, IPVS, Window userspace, winkernel. Статус — альфа-версия.
Добавлены новые методы аутентификации (альфа-версия):
Кроме того, стабильный статус получила [36] возможность ограничения доступа узлов к определённым API (с помощью режима авторизации Node
и admission-плагина NodeRestriction
) с целью выдавать им разрешение только на ограниченное число объектов и связанных с ними секретов.
Достигнут прогресс в переработке вывода, показываемого командами kubectl get
и kubectl describe
. Глобальная задача инициативы [37], получившей в Kubernetes 1.10 статус бета-версии, заключается в том, что получение столбцов для табличного отображения данных должно происходить на стороне сервера (а не клиента), — это делается с целью улучшить пользовательский интерфейс при работе с расширениями. Начавшаяся ранее (в K8s 1.8) работа на серверной стороне доведена до уровня беты, а также были проведены [38] основные изменения на стороне клиента.
В kubectl port-forward добавлена возможность [39] использования имени ресурса для выбора подходящего пода (и флаг --pod-running-timeout
для ожидания, пока хотя бы один под будет запущен), а также поддержка [40] указания сервиса для проброса порта (например: kubectl port-forward svc/myservice 8443:443
).
Новые сокращённые имена для команд kubectl: cj
вместо CronJobs
, crds
— CustomResourceDefinition
. Например, стала доступна команда kubectl get crds
.
PVCProtection
), «защищающая» от возможного удаления PVCs, которые активно используются подами, переименована в Storage Protection
и доведена [44] до бета-версии.Читайте также в нашем блоге:
Автор: Dmitry Stolyarov
Источник [50]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/277406
Ссылки в тексте:
[1] Kubernetes 1.10: https://kubernetes.io/blog/2018/03/27/kubernetes-1.10-stabilizing-storage-security-networking/
[2] CHANGELOG-1.10: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md
[3] Mount propagation: https://github.com/jsafrane/community/blob/7a2b2f7d88b50ee7e83dcca79dc96fac96988084/contributors/design-proposals/propagation.md
[4] документация: https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation
[5] Local Persistent Storage: https://github.com/vishh/community/blob/ba62a3f6cb9a301e95c4b64b9052455bdac9a3fe/contributors/design-proposals/local-storage-overview.md#persistent-local-storage
[6] ограничения/лимиты: https://github.com/kubernetes/features/issues/361
[7] K8s 1.8: https://habrahabr.ru/company/flant/blog/338230/
[8] Topology Aware Volume Scheduling: https://github.com/kubernetes/features/issues/490
[9] design-proposals: https://github.com/msau42/community/blob/6e486a390fc73ff1deb2441abf2c5838e568d438/contributors/design-proposals/storage/volume-topology-scheduling.md
[10] возможностью: https://github.com/kubernetes/kubernetes/pull/58916
[11] поддержка: https://github.com/kubernetes/kubernetes/pull/55866
[12] добавлена: https://github.com/kubernetes/kubernetes/pull/58625
[13] появилась: https://github.com/kubernetes/kubernetes/pull/58710
[14] возможность: https://github.com/kubernetes/kubernetes/pull/58794
[15] были добавлены: https://github.com/kubernetes/features/issues/496
[16] документацию: https://github.com/gnufied/community/blob/1a6217c00d01f4f24efb36bfc942df9592542e46/contributors/design-proposals/storage/additional-volume-metrics.md
[17] документации: https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/
[18] необходимой поддержки: https://github.com/moby/moby/pull/22481
[19] унифицировали: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/pod-pid-namespace.md
[20] Runtime Specification: https://github.com/opencontainers/runtime-spec
[21] Windows: https://github.com/opencontainers/runtime-spec/blob/master/config-windows.md
[22] поддерживаются: https://github.com/JiangtianLi/community/blob/6d08a8213318d63d8ab49fe326afdb6b49037e33/contributors/design-proposals/node/cri-windows.md
[23] CPU Manager: https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/
[24] Huge Pages: https://kubernetes.io/docs/tasks/manage-hugepages/scheduling-hugepages/
[25] Device Plugin: https://kubernetes.io/docs/concepts/cluster-administration/device-plugins/
[26] можно ограничивать: https://github.com/kubernetes/kubernetes/pull/57973
[27] этой статьи: https://habrahabr.ru/company/flant/blog/340010/
[28] принесло: https://github.com/kubernetes/website/pull/7638/files#diff-e1afcdac8d5e8458274b3c481c5ebcdaR33
[29] представлена: https://github.com/kubernetes/features/issues/504
[30] design-proposals: https://github.com/bowei/community/blob/eb79043a77170cc4e340d47f2835de5fb75d0d31/contributors/design-proposals/network/pod-resolv-conf.md
[31] добавлена: https://github.com/kubernetes/features/issues/539
[32] реализация: https://github.com/m1093782566/community/blob/beb68d448e09c307a3ac24146b7165e3fa2bcf02/contributors/design-proposals/network/nodeport-ip-range.md#kube-proxy-implementation-suport
[33] реализовали: https://github.com/kubernetes/features/issues/541
[34] исполняемых плагинов: https://github.com/ericchiang/community/blob/2bfa7e1e624a5c87cbd1d07566e617563e2280fd/contributors/design-proposals/auth/kubectl-exec-plugins.md
[35] получения: https://github.com/mikedanese/community/blob/5f9d2c45bd7dc45367eaae5dafb206609fd14c88/contributors/design-proposals/auth/bound-service-account-tokens.md
[36] получила: https://github.com/kubernetes/features/issues/279
[37] инициативы: https://github.com/kubernetes/features/issues/515
[38] были проведены: https://github.com/kubernetes/kubernetes/issues/58536
[39] возможность: https://github.com/kubernetes/kubernetes/pull/59705
[40] поддержка: https://github.com/kubernetes/kubernetes/pull/59809
[41] API Aggregation: https://github.com/kubernetes/features/issues/263
[42] могут запускаться: https://github.com/kubernetes/kubernetes/pull/60144
[43] поддержка изоляции: https://github.com/kubernetes/kubernetes/pull/58751
[44] доведена: https://github.com/kubernetes/kubernetes/pull/59052
[45] поддержки Azure: https://github.com/kubernetes/features/issues/514
[46] Kubernetes 1.9: обзор основных новшеств: https://habrahabr.ru/company/flant/blog/344220/
[47] Четыре релиза 1.0 от CNCF и главные анонсы про Kubernetes с KubeCon 2017: https://habrahabr.ru/company/flant/blog/344098/
[48] Docker 17.06 и Kubernetes 1.7: ключевые новшества: https://habrahabr.ru/company/flant/blog/332160/
[49] Инфраструктура с Kubernetes как доступная услуга: https://habrahabr.ru/company/flant/blog/341760/
[50] Источник: https://habrahabr.ru/post/353114/?utm_source=habrahabr&utm_medium=rss&utm_campaign=353114
Нажмите здесь для печати.