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

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

В конце марта состоялся релиз Kubernetes 1.10 [1]. Поддерживая нашу традицию рассказывать подробности о наиболее значимых изменениях в очередном релизе Kubernetes, публикуем этот обзор, подготовленный на основе CHANGELOG-1.10 [2], а также многочисленных issues, pull requests и design proposals. Итак, что же нового приносит K8s 1.10?

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

Хранилища

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].

Среди прочих улучшений в поддержке томов / файловых систем:

  • улучшения в Ceph RBD с возможностью [10] использования клиента rbd-nbd (на основе популярной библиотеки librbd) в pkg/volume/rbd;
  • поддержка [11] монтирования Ceph FS через FUSE;
  • в плагине для AWS EBS добавлена [12] поддержка блочных томов и volumeMode, а также поддержка блочных томов появилась [13] в плагине GCE PD;
  • возможность [14] изменения размера тома даже в тех случаях, когда он примонтирован.

Наконец, были добавлены [15] (и объявлены стабильными) дополнительные метрики, говорящие о внутреннем состоянии подсистемы хранения в Kubernetes и предназначенные для отладки, а также получения расширенного представления о состоянии кластера. Например, теперь для каждого тома (по volume_plugin) можно узнать общее время на операции mount/umount и attach/detach, общее время privision'а и удаления, а также количество томов в ActualStateofWorld и DesiredStateOfWorld, bound/unbound PVCs и PVs, количество используемых подами PVCs и др. Подробнее — см. документацию [16].

Kubelet, узлы и управление ими

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:

  1. CPU Manager [23] (назначение подам конкретных ядер процессора — подробнее о нём писали в статье про K8s 1.8 [7]);
  2. Huge Pages [24] (возможность использования подами 2Mi и 1Gi Huge Pages, что актуально для приложений, потребляющих большие объёмы памяти);
  3. Device Plugin [25] (фреймворк для вендоров, позволяющий объявлять в kubelet ресурсы: например, от GPU, NIC, FPGA, InfiniBand и т.п. — без необходимости модифицировать основной код Kubernetes).

Количество процессов, запущенных в поде, теперь можно ограничивать [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. Статус — альфа-версия.

Аутентификация

Добавлены новые методы аутентификации (альфа-версия):

  1. внешние клиентские провайдеры: отвечая на давние запросы пользователей K8s на exec-based plugins, в kubectl (client-go) реализовали [33] поддержку исполняемых плагинов [34], которые могут получать аутентификационные данные исполнением произвольной команды и чтением её вывода (плагин GCP тоже может быть настроен на вызов команд, отличных от gcloud). Один из вариантов применения — облачные провайдеры смогут создавать собственные системы аутентификации (вместо использования стандартных механизмов Kubernetes);
  2. TokenRequest API для получения [35] токенов JWT (JSON Web Tokens), привязанных к клиентам (audience) и времени.

Кроме того, стабильный статус получила [36] возможность ограничения доступа узлов к определённым API (с помощью режима авторизации Node и admission-плагина NodeRestriction) с целью выдавать им разрешение только на ограниченное число объектов и связанных с ними секретов.

CLI

Достигнут прогресс в переработке вывода, показываемого командами 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, crdsCustomResourceDefinition. Например, стала доступна команда kubectl get crds.

Другие изменения

  • API Aggregation [41], т.е. агрегация пользовательских apiservers с основным API в Kubernetes, получил стабильный статус и официально готов к использованию в production.
  • Kubelet и kube-proxy теперь могут запускаться [42] как родные службы в Windows. Добавлена поддержка Windows Service Control Manager (SCM) и экспериментальная поддержка изоляции [43] с Hyper-V для подов с единственным контейнером.
  • Функция Persistent Volume Claim Protection (PVCProtection), «защищающая» от возможного удаления PVCs, которые активно используются подами, переименована в Storage Protection и доведена [44] до бета-версии.
  • Альфа-версия поддержки Azure [45] в cluster-autoscaler.

Совместимость

  • Поддерживаемая версия etcd — 3.1.12. При этом etcd2 в качестве бэкенда объявлена устаревшей, её поддержка будет удалена в релизе Kubernetes 1.13.
  • Проверенные версии Docker — от 1.11.2 до 1.13.1 и 17.03.x (не изменились с релиза K8s 1.9).
  • Версия Go — 1.9.3 (вместо 1.9.2), минимально поддерживаемая — 1.9.1.
  • Версия CNI — 0.6.0.

P.S.

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

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