
Днес, в сряда, отново издание на Kubernetes — 1.16. Според традицията на нашия блог, за десети път ние разказваме за най-значимите промени в новата версия.
Информацията, използвана за подготовката на този материал, е взета от , и съответните issues, pull requests, както и предложения за подобрения в Kubernetes (KEP). Така че, да започнем!..
Възли
Наистина голямо число забележителни нововъведения (в статуса alpha) е представено от страната на възлите на K8s клъстери (Kubelet).
На първо място, представени са така наречените «» (Ephemeral Containers), предназначени да опростят процесите на отстраняване на грешки в pod-овете. Новият механизъм позволява стартирането на специални контейнери, които стартират в пространството на имената на съществуващите pod-ове и живеят кратко време. Те имат за цел взаимодействие с други pod-ове и контейнери с цел решаване на проблеми и отстраняване на грешки. За тази възможност е реализирана нова команда kubectl debug, която по същество е подобна на kubectl exec: само че вместо да стартира процес в контейнера (както е при exec) тя стартира контейнер в pod-а. Например, такава команда ще свърже нов контейнер с pod-а:
kubectl debug -c debug-shell --image=debian target-pod -- bashПодробности за ефимерните контейнери (и примери за тяхната употреба) можете да намерите в . Текущата реализация (в K8s 1.16) е версия alpha, а сред критериите за нейното прехвърляне в версия beta фигурира „teстване на Ephemeral Containers API за поне 2 издания [Kubernetes]“.
NB: По своя същност и дори по название функцията напомня вече съществуващия плъгин , за който ние . Предполага се, че с появата на ефимерните контейнери развитието на отделен външен плъгин ще спре.
Друго нововъведение — — е предназначено да предостави механизъм за изчисляване на разходите за pod-овете, които могат да се отличават значително в зависимост от използваната изпълнителна среда (runtime). Като пример авторите подават Kata Containers, които изискват стартирането на гостово ядро, агента kata, init-система и т.н. Когато overhead става толкова голям, че не може да бъде игнориран, необходим е начин да се отчита за по-нататъшно квотиране, планиране и т.н. За неговата реализация в PodSpec добавено поле Overhead *ResourceList (съответства на данните в RuntimeClass, ако такъв е използван).
Още едно забележимо нововъведение — мениджър на топологията на възела (Node Topology Manager), предназначен да унифицира подхода към финото настройване на разпределението на хардуерните ресурси за различните компоненти в Kubernetes. Тази инициатива е продиктувана от нарастващата нужда на различни съвременни системи (от сферата на телекомуникациите, машинното обучение, финансовите услуги и т.н.) от високопроизводителни паралелни изчисления и минимизиране на забавянията при изпълнение на операции, за което те използват напредналите възможности на CPU и хардуерното ускорение. Такива оптимизации в Kubernetes досега бяха постигани благодарение на разпръснати компоненти (CPU мениджър, устройствен мениджър, CNI), а сега ще добавят единен вътрешен интерфейс, който ще унифицира подхода и ще улесни свързването на нови подобни — т.нар. topology-aware — компоненти на страна на Kubelet. Подробности — в .

Схема на компонентите на Topology Manager
Следващата функция — проверка на контейнерите по време на стартирането им (). Както е известно, за контейнерите, които стартират дълго, е трудно да се получи актуален статус: те или се „убиват“ преди действителното начало на функционирането, или дълго време остават в deadlock. Новата проверка (включва се чрез feature gate с името StartupProbeEnabled) отменя — по-точно, отлага — действието на всякакви други проверки до момента, в който pod завърши своето стартиране. По тази причина функцията първоначално беше наречена . За pod-ове, които стартират дълго, може да се извършва опрос на състоянието в относително кратки времеви интервали.
Освен това, веднага в бета-статус е представено подобрение за RuntimeClass, което добавя поддръжка на „хетерогенни клъстери“. С сега вече не е необходимо всеки възел да има поддръжка на всеки RuntimeClass: за pod-ове може да се избира RuntimeClass, без да се мисли за топологията на клъстера. По-рано, за да се постигне това — за да се оказват pod-овете на възли с поддръжка на всичко, което им е нужно — се налагаше назначаване на съответните правила на NodeSelector и tolerations. В се разказва за примери за употреба и, разбира се, подробности за реализиране.
Мрежа
Две значими мрежови функции, които се появяват за първи път (в алфа-версия) в Kubernetes 1.16 — това е:
- двойна мрежова стек - IPv4/IPv6 и съответстващото му "разбиране" на ниво pod’ове, възли, услуги. Тя включва взаимодействието между pod’ови с IPv4-to-IPv4 и IPv6-to-IPv6, с pod’ове към външни услуги, еталонни реализации (в рамките на плъгини Bridge CNI, PTP CNI и Host-Local IPAM), както и обратно съвместимост с Kubernetes клъстери, работещи само с IPv4 или IPv6. Подробности за реализацията - в .
Пример за извеждане на IP адреси от два вида (IPv4 и IPv6) в списъка с pod’ове:
kube-master# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-controller 1/1 Running 0 20m fd00:db8:1::2,192.168.1.3 kube-minion-1 kube-master# - Нов API за Endpoint — . Той решава проблемите на съществуващия Endpoint API, свързани с производителност/масштабируемост, които засягат различни компоненти в control-plane (apiserver, etcd, endpoints-controller, kube-proxy). Новият API ще бъде добавен в API групата Discovery и ще може да обслужва десетки хиляди backend endpoint’а на всяка услуга в клъстера, състоящ се от хиляди възли. За целта всяка услуга се изобразява в N обекта
EndpointSlice, всеки от които по подразбиране има не повече от 100 endpoint’а (настройваемо значение). В EndpointSlice API ще се предвидят и възможности за неговото бъдещо развитие: поддръжка на множество IP адреси за всеки pod, нови състояния за endpoint’ите (не самоГотовиНеГотов), динамично подмножество за endpoint’ите.
До бета версия напредна представеният в миналия релиз , наречен service.kubernetes.io/load-balancer-cleanup и прикрепен към всяка услуга с тип LoadBalancer. При изтриването на такава услуга тя предотвратява фактическото изтриване на ресурса, докато "почистването" на всички съответстващи ресурси на балансировчика не бъде завършено.
API Machinery
Истинска "етапна стабилизация" е фиксирана в областта на API сървъра на Kubernetes и взаимодействието с него. В много отношения това стана възможно благодарение на прехода в статус stable на не нуждаещите се в особено представяне (CRD), които имаха статус бета версия от времето на отдалечен Kubernetes 1.7 (а това е юни 2017 година!). Същата стабилизация дойде и за свързаните с тях функции:
- с
/statusи/scaleза CustomResources; - версии за CRD, основано на външен webhook;
- (в K8s 1.15) стойности по подразбиране (defaulting) и автоматично изтриване на полета (pruning) за CustomResources;
- прилагане на схемата OpenAPI v3 за създаване и публикуване на OpenAPI документация, използвана за валидиране на CRD ресурси на сървърната страна.
Още един механизъм, който отдавна е познат на администраторите на Kubernetes: — също така дълго време беше в статус на бета (от K8s 1.9) и сега е обявен за стабилен.
Две други функции достигнаха бета версия: и .
А единственото значимо нововъведение в алфа версията беше от — специален URI, представляващ посочения обект и част от ObjectMeta ListMeta и (т.е. част от всеки обект в Kubernetes). Защо се отказват от него? Мотивацията „по-просто“ звучи ще се случи с версия на Kubernetes 1.20, а окончателното — 1.21. — специален URI, представляващ посочения обект и част от Основната работа в областта на storage, както и в предишните версии, се наблюдава в областта на
Съхранение на данни
подкрепата на CSI за първи път (в алфа версията)
- подкрепа на CSI плъгини за работни възли с Windows : актуален начин за работа с хранилища и тук ще замени in-tree плъгини в ядрото на Kubernetes и FlexVolume плъгини от Microsoft на база Powershell;Схемата за реализация на CSI плъгини в Kubernetes за Windows

промяна на размера на CSI томовете - възможност за аналогичното „повишение“ (от алфа до бета версия) достигна възможността за използване на CSI за създаване на локални ефимерни томове (
- CSI Inline Volume Support).
функция за клониране на томове DataSource за създаване на нови PVC) също сега получи статус на бета версия. Планиращ
Два забележителни изменения в планирането (и двете в алфа версия):
EvenPodsSpreading
- да се използват за „честно разпределение“ на натоварванията pod’ове вместо логически единици на приложението. където е възможно. (подобно на Deployment и ReplicaSet) и регулирането на това разпределение (като строго изискване или като мека условие, т.е. приоритет). Функцията ще разшири съществуващите възможности за разпределение на планираните pod’ове, които в момента са ограничени от опциите
PodAffinityиPodAntiAffinity, предоставяйки на администраторите по-фин контрол по този въпрос, а следователно — по-добра висока достъпност и оптимизирана консумация на ресурси. Подробности — в . - Използване BestFit Policy в RequestedToCapacityRatio Priority Function по време на планирането на pod’ове, което ще позволи да се прилагат («опаковане в контейнери») както за основните ресурси (процесор, памет), така и за разширените (като GPU). По-подробно вижте в .

Планиране на pod’ове: преди да се използва best fit policy (директно чрез default scheduler) и с нейното използване (чрез scheduler extender)
Освен това, възможността за създаване на собствени плъгини за планировщика извън основното дърво за разработка на Kubernetes (out-of-tree).
Други промени
Също така в релиза на Kubernetes 1.16 можем да отбележим инициативата по на съществуващите метрики в пълен ред, а по-скоро — в съответствие с към инструментацията K8s. Те по същество разчитат на съответната . Несъответствията произлязоха по различни причини (например, някои метрики бяха създадени още преди появата на настоящите инструкции), и разработчиците решиха, че е време да се приведат всичко в единен стандарт, «в съответствие с останалата екосистема на Prometheus». Настоящата реализация на тази инициатива носи статут на алфа-версия, който постепенно ще бъде повишен в последващите версии на Kubernetes до бета (1.17) и стабилна (1.18).
Освен това, можем да отбележим следните промени:
- Развитие на поддръжката за Windows с утилитата Kubeadm за тази ОС (алфа-версия),
RunAsUserNameза Windows-контейнери (алфа-версия), поддръжката на Group Managed Service Account (gMSA) до бета-версия, mount/attach за томове vSphere. - механизъм за компресиране на данни в API отговори. Преди това за тези цели се използваше HTTP-филтър, който налагаше редица ограничения, пречещи на включването му по подразбиране. Сега работи «прозрачно компресиране на заявките»: клиентите, които изпращат
Accept-Encoding: gzipв заглавието получават компресиран отговор в GZIP, ако размерът му е над 128 Кб. Клиентите на Go автоматично поддържат компресия (изпращат необходимия заглавен ред), така че веднага ще забележат намаляване на трафика. (За други езици може да са необходими малки модификации.) - масштабиране на HPA от/до нула pod-а на базата на външни метрики. Ако мащабирането се извършва на базата на обекти/външни метрики, то когато работните натоварвания не се използват, може автоматично да се мащабира до 0 реплики, за да се спестят ресурси. Особено полезна тази функция трябва да се окаже в случаи, когато worker-ите изискват ресурси от GPU, а броят на различните видове бездействуващи worker-и надвишава броя на наличните GPU.
- Нов клиент — — за „общ достъп“ до обекти. Той е проектиран да улеснява получаването на метаданни (т.е. подраздел
metadata) от ресурсите на клъстера и да извършва операции, като събиране на боклук и квотиране. - Събиране на Kubernetes без остарели („вградени“ в in-tree) облачни доставчици (алфа версия).
- В утилитата kubeadm експериментална (алфа версия) възможност за прилагане на патчи kustomize по време на операции
init,joinиupgrade. Подробности за това как да се използва флагът--experimental-kustomize, вижте в . - Нов endpoint за apiserver — , — позволяващ експортиране на информация за неговата готовност (readiness). Също така, API-серверът получи флаг
--maximum-startup-sequence-duration, който регулира неговите перезапуски. - Две функции за Azure бяха обявени за стабилни: поддръжка на (Availability Zones) и (RG). Освен това в Azure бяха добавени:
- AAD и ADFS;
-
service.beta.kubernetes.io/azure-pip-nameза посочване на публичен IP адрес на балансировщика на натоварването; - за настройки
LoadBalancerNameиLoadBalancerResourceGroup.
- AWS получи за EBS в Windows и API-визовете EC2
DescribeInstances. - Kubeadm вече сам конфигурацията на CoreDNS при обновление на версията на CoreDNS.
- Бинарниците etcd в съответния Docker образ world-executable, което позволява стартиране на този образ без необходимост от права root. Освен това, образът за миграция на etcd поддръжка на версия etcd2.
- В премина на използване на distroless като основен образ, подобри производителността и добави нови облачни доставчици (DigitalOcean, Magnum, Packet).
- Актуализации в използвания/зависимото софтуерно осигуряване: Go 1.12.9, etcd 3.3.15, CoreDNS 1.6.2.
P.S.
Прочетете също в нашия блог:
- «»;
- «»;
- «»;
- «».
Източник: habr.com


