
Тази нощ е новият релиз на Kubernetes — . Според традицията на нашия блог, ви разказваме за основните промени в новата версия на този забележителен продукт с отворен код.
Информацията, използвана за подготовката на този материал, е взета от , и съответните issues, pull requests, Kubernetes Enhancement Proposals (KEP).
Да започнем с важното въведение от SIG cluster-lifecycle: динамични отказоустойчиви клъстери Kubernetes (или, по-точно, self-hosted HA deployments) вече чрез познатите (в контекста на клъстери с един възел) команди kubeadm (init и присъединете се). В кратце, за това:
- сертификатите, използвани от клъстера, се прехвърлят в секрети;
- за да може клъстерът etcd да работи вътре в K8s-клъстера (т.е. за да се елиминира съществуващата досега външна зависимост), е използван ;
- документират се препоръчителните настройки за външния балансатор на натоварването, който осигурява отказоустойчива конфигурация (в бъдеще се планира възможност за отказ и от тази зависимост, но не в този етап).

Архитектура на HA-клъстера Kubernetes, създаден с kubeadm
Можете да се запознаете с подробности за реализацията в . Тази функция наистина беше дългоочаквана: алфа-версията се очакваше още в K8s 1.9, но появи само сега.
API
Екип apply и въобще декларативно управление на обектите от kubectl в apiserver. Самите разработчици кратко обясняват решението си с това, че kubectl apply е основна част от работата с конфигурации в Kubernetes, но „бълбука от бъгове и трудно се коригира“, поради което тази функционалност трябва да бъде приведена в нормално състояние и прехвърлена в control plane. Прости и ясни примери за съществуващите днес проблеми:

Подробности за реализацията — в . Текущата готовност — алфа-версия (преминаването към бета е планирано за следващия релиз на Kubernetes).
В алфа-версията стана достъпно използването на схемата OpenAPI v3 за създаване и публикуване на OpenAPI-документация за CustomResources (CR), използвани за валидация (на страна на сървъра) на ресурси K8s, определени от потребителя (CustomResourceDefinition, CRD). Публикуването на OpenAPI за CRD позволява на клиентите (например, kubectl) да извършват валидация на своята страна (в рамките на kubectl create и kubectl apply) и да предоставят документация по схемата (kubectl explain). Подробности — в .
Съществувалите преди лога с флаг O_APPEND (а не O_TRUNC) за да се избегне загуба на логове в определени ситуации и за удобство на truncate на логовете с външни утилити за ротация.
Също така в контекста на Kubernetes API можем да споменем, че в PodSandbox и PodSandboxStatus полето runtime_handler за отчитане на информация за RuntimeClass в pod'а (повече за него четете в текста за , където този клас се появи като алфа-версия), а в Admission Webhooks възможността да се определя, какви версии AdmissionReview те поддържат. Накрая, в правилата на Admission Webhooks сега обхвата на тяхното приложение с namespace и рамки на клъстера.
Складовете
, които имаха статус бета-версия от версия , стабилни (GA): този feature gate вече не се изключва и ще бъде премахнат в Kubernetes 1.17.
използването на променливи среда, известни като (например, името на pod'а) за имената на директории, монтирани като , получи развитие — под формата на ново поле subPathExpr, с помощта на което сега се определя нужното име на директория. Първоначално функцията се появи в Kubernetes 1.11, но и за 1.14 остана в статус на алфа-версия.
Както и в предходната версия на Kubernetes, много значими промени са представени за активно развиващия се CSI (Container Storage Interface):
CSI
Стана достъпна (в рамките на алфа-версия) промяна на размера за CSI-томове.За нейната употреба е необходимо да се включи feature gate с името ExpandCSIVolumes, а също и наличието на поддръжка за тази операция в конкретния CSI-драйвер.
Още една функция за CSI в алфа-версия — да се ссылае директно (т.е. без използване на PV/PVC) на CSI-томове в рамките на спецификацията на pod'ов. Това отстранява ограничението за използване на CSI само като отдалечени хранилища за данни, отваряйки за тях вратата към света на За употреба () е необходимо да се включи CSIInlineVolume feature gate.
Направи се напредък и във „вътрешността“ на Kubernetes, свързана с CSI, която не е толкова забележима за крайни потребители (системни администратори)… В момента разработчиците са принудени да поддържат две версии на всеки плъгин за хранилище: един — „по стария начин“, в рамките на кодовата база K8s (in-tree), а вторият — в рамките на новия CSI (повече за него четете, например, в ). Това предизвиква разбираеми неудобства, които трябва да бъдат отстранени с напредъка на CSI като такова. Просто да се обяви за остаряла (deprecated) API на вътрешни (in-tree) плъгини не е възможно заради .
Всичко това доведе до това, че алфа версиите достигнаха вътрешния код на плъгините, реализирани като in-tree, в CSI плъгини, благодарение на което притесненията на разработчиците ще бъдат сведени до поддръжка на една версия на техните плъгини, а съвместимостта със старите API ще бъде запазена и те могат да бъдат обявени за остарели по обичайния сценарий. Очаква се, че до следващото издание на Kubernetes (1.15) ще бъде проведена миграция на всички плъгини на облачните доставчици, реализацията ще получи статус на бета версия и ще бъде активирана в инсталациите K8s по подразбиране. Подробности вижте в . Последствието от тази миграция също стана от ограниченията за обемите, определяни от конкретни облачни доставчици (AWS, Azure, GCE, Cinder).
Освен това, поддръжката на блоковите устройства с CSI (CSIBlockVolume) в бета версия.
Възли / Kubelet
Представена е алфа версия на в Kubelet, предназначен за предаване на метрики за основните ресурси. По принцип, ако преди Kubelet получаваше статистика за използването на контейнери от cAdvisor, то сега тези данни постъпват от контейнерната среда чрез CRI (Container Runtime Interface), но съвместимостта с работата със старите версии на Docker е запазена. По-рано събраната в Kubelet статистика се предаваше чрез REST API, а сега за това се използва endpoint, разположен на адрес /metrics/resource/v1alpha1. Дългосрочната стратегия на разработчиците е да минимизират набора от метрики, предоставяни от Kubelet. Струва си да се спомене, че самите тези метрики не „основни метрики“, а „метрики на ресурсите“, и описват като „первокласни ресурси, като CPU и памет“.
Интересен нюанс: въпреки очевидното предимство в производителността на gRPC endpoint в сравнение с различни случаи на употреба на формата Prometheus (резултат от едно от benchmark-ите вижте по-долу), авторите предпочетоха текстовия формат Prometheus заради явното лидерство на тази мониторингова система в общността.
"gRPC не е съвместим с основните мониторингови пайплайни. Endpoint обаче ще бъде полезен само за предоставяне на метрики в Metrics Server или компоненти за мониторинг, които се интегрират директно с него. При използване на кеширане в Metrics Server производителността на текстовия формат Prometheus е достатъчно добра за нас, за да предпочетем Prometheus, а не gRPC, предвид широчината на Prometheus в общността. Когато форматът OpenMetrics стане по-стабилен, ще можем да се доближим до производителността на gRPC с формата на базата на proto.

Едно от сравнителните тестове за производителност при използване на форматите gRPC и Prometheus в новия endpoint на Kubelet за метрики. Повече графики и други подробности можете да намерите в .
Сред другите промени:
- Kubelet сега (веднъж) контейнерите в неизвестно състояние (unknown) преди операциите по рестартиране и изтриване.
- При използване на сега за init-контейнера същата информация, както и за обикновения контейнер.
- Kubelet
usageNanoCoresот статистическия доставчик CRI, а за възли и контейнери в Windows мрежова статистика. - Информация за операционната система и архитектурата сега се записва в етикетите
kubernetes.io/osиkubernetes.io/archна Node обектите (преведено от бета версия в GA). - Възможността да се посочва конкретна системна група потребители за контейнери в pod’a (
RunAsGroup, се появи в ) до бета версия (включена по подразбиране). - du и find, използвани в cAdvisor, с Go реализации.
CLI
В cli-runtime и kubectl флагът -k за интеграция с (между другото, разработката му вече се провежда в отделно хранилище), т.е. за обработка на допълнителни YAML файлове от специални директории за kustomization (подробности за тяхното използване вижте в ):

Пример за просто използване на файла (възможно е и по-сложно прилагане на kustomize в рамките на )
Освен това:
- новата команда
kubectl create cronjob, чийто наименование говори само за себе си. - В
kubectl logsсега можете флагове-f(--followза стрийминг на логове) и-l(--selectorза label query). - kubectl да копираме файлове, избирани с помощта на wild card.
- В екипа
kubectl waitфлаг--allза избор на всички ресурси в името на конкретния тип ресурси.
Други
Стабилен (GA) статус получиха следните възможности:
- , използван в спецификацията на pod’a за определяне на допълнителни условия, които се вземат предвид в готовността на pod’a;
- Поддръжка за големи страници (feature gate на име );
- ;
- PriorityClass API, .
Други промени, представени в Kubernetes 1.14:
- Политиката RBAC по подразбиране вече не дава достъп до API
discoveryиaccess-reviewна потребители без удостоверяване (unauthenticated). - Официалната поддръжка на CoreDNS само за Linux, затова при използване на kubeadm за внедряване на (CoreDNS) в клъстера, възлите трябва да работят само под Linux (това ограничение се прилага чрез nodeSelectors).
- Конфигурацията на CoreDNS по подразбиране сега вместо proxy. Освен това, в CoreDNS readinessProbe, предотвратяваща балансирането на натоварването към съответните (не готови за обслужване) pod’ове.
- В kubeadm, на етапите
initилиupload-certs, да се качват сертификати, нужни за свързване на новия control-plane към секретния kubeadm-certs (използва се флаг--experimental-upload-certs). - За Windows инсталации се появи алфа версия gMSA (Group Managed Service Account) — специални акаунти в Active Directory, които могат да се използват и от контейнери.
- За GCE mTLS криптиране между etcd и kube-apiserver.
- Актуализации в използвания/зависимия софтуер: Go 1.12.1, CSI 1.1, CoreDNS 1.3.1, поддръжка на Docker 18.09 в kubeadm, а минималната поддържана версия на Docker API стана 1.26.
P.S.
Прочетете също в нашия блог:
- «»;
- «»;
- «»;
- «».
Източник: habr.com
