Kubernetes 1.14: агляд асноўных навін

Kubernetes 1.14: агляд асноўных навін

Гэтай ноччу адбудзецца чарговы рэліз Kubernetes - 1.14. Па якая склалася для нашага блога традыцыі, распавядаем аб ключавых зменах у новай версіі гэтага выдатнага Open Source-прадукта.

Інфармацыя, выкарыстаная для падрыхтоўкі гэтага матэрыялу, узята з табліцы Kubernetes enhancements tracking, CHANGELOG-1.14 і суадносных issues, pull requests, Kubernetes Enhancement Proposals (KEP).

Пачнём з важнага ўвядзення ад SIG cluster-lifecycle: дынамічныя адмоваўстойлівыя кластары Kubernetes (а калі выяўляцца больш дакладна, то self-hosted HA deployments) зараз можна ствараць з дапамогай звыклых (у кантэксце кластараў з адным вузлом) каманд kubeadm (init и join). Калі сцісла, то для гэтага:

  • выкарыстоўваныя кластарам сертыфікаты пераносяцца ў сакрэты;
  • для магчымасці выкарыстання кластара etcd ўнутры K8s-кластара (г.зн. збавення ад існавалай да гэтага часу знешняй залежнасці) задзейнічаны etcd-operator;
  • дакументуюцца рэкамендуемыя настройкі для знешняга балансавальніка нагрузкі, які забяспечвае адмоваўстойлівасць канфігурацыю (у далейшым плануецца магчымасць адмовы і ад гэтай залежнасці, але не на дадзеным этапе).

Kubernetes 1.14: агляд асноўных навін
Архітэктура HA-кластара Kubernetes, створанага з kubeadm

З падрабязнасцямі аб рэалізацыі можна азнаёміцца ​​ў design proposal. Гэтая фіча была па-сапраўднаму доўгачаканай: альфа-версія чакалася яшчэ ў K8s 1.9, але з'явілася толькі зараз.

API

Каманда apply ды ўвогуле дэкларатыўнае кіраванне аб'ектамі вынесены з kubectl у apiserver. Самі распрацоўшчыкі коратка тлумачаць сваё рашэнне тым, што kubectl apply - фундаментальная частка працы з канфігурацыямі ў Kubernetes, аднак «поўная багаў і складана паддаецца выпраўленням», у сувязі з чым гэтую функцыянальнасць неабходна прывесці да нармальнага ўвазе і перанесці ў control plane. Простыя і наглядныя прыклады існуючых сёння праблем:

Kubernetes 1.14: агляд асноўных навін

Падрабязнасці аб рэалізацыі - у КЭП. Бягучая гатоўнасць - альфа-версія (прасоўванне да бэты запланавана на наступны рэліз 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'е (падрабязней пра яго чытайце ў тэксце пра рэліз Kubernetes 1.12, дзе гэты клас і з'явіўся як альфа-версія), а ў Admission Webhooks рэалізавана магчымасць вызначаць, якія версіі AdmissionReview яны падтрымліваюць. Нарэшце, у правілах Admission Webhooks зараз можна абмяжоўваць маштабы іх ужывання namespace'амі і рамкамі кластара.

Сховішчы

PersistentLocalVolumes, якія мелі статус бэта-версіі з рэлізу K8s 1.10, абвешчаныя стабільнымі (GA): гэты feature gate больш не адключаецца і будзе выдалены ў Kubernetes 1.17.

Магчымасць выкарыстання зменных асяроддзі так званага Downward API (напрыклад, імя pod'а) для назваў дырэкторый, якія мантуюцца як subPath, атрымала развіццё - у выглядзе новага поля subPathExpr, з дапамогай якога зараз і вызначаецца патрэбнае імя дырэкторыі. Першапачаткова фіча з'явілася ў Kubernetes 1.11, але і для 1.14 засталася ў статуце альфа-версіі.

Як і ў мінулы рэліз Kubernetes, шмат значных змен прадстаўлена для актыўна які развіваецца CSI (Container Storage Interface):

CSI

Стала даступнай (у рамках альфа-версіі) падтрымка змены памеру для CSI-томаў. Для яе выкарыстання спатрэбіцца ўключыць feature gate пад назвай ExpandCSIVolumes, а таксама наяўнасць падтрымкі гэтай аперацыі ў канкрэтным CSI-драйверы.

Яшчэ адна фіча для CSI у альфа-версіі магчымасць спасылацца напрамую (г.зн. без выкарыстання PV/PVC) на CSI-томы ў рамках спецыфікацыі pod'ов. Гэта здымае абмежаванне на выкарыстанне CSI як выключна выдаленых сховішчаў даных, адчыняючы для іх дзверы ў свет local ephemeral volumes. Для выкарыстання (прыклад з дакументацыі) неабходна ўключыць CSIInlineVolume feature gate.

Вызначыўся прагрэс і ва «ўнутранасцях» Kubernetes, злучаных з CSI, якія не так прыкметныя канчатковым карыстачам (сістэмным адміністратарам)… У сапраўдны момант распрацоўнікі змушаныя падтрымліваць дзве версіі кожнага плагіна сховішчы: адзін — «на стары лад», усярэдзіне кодавай базы K8s (in -tree), а другі - у рамках новага CSI (падрабязней пра яго чытайце, напрыклад, у тут). Гэта выклікае зразумелыя нязручнасці, якія неабходна ўхіліць па меры стабілізацыі CSI як такога. Проста ўзяць і абвясціць састарэлымі (deprecated) API унутраных (in-tree) убудоў не ўяўляецца магчымым з-за адпаведнай палітыкі Kubernetes.

Усё гэта прывяло да таго, што альфа-версіі дасягнуў працэс міграцыі ўнутранага кода плагінаў, Якія рэалізуюцца як in-tree, у CSI plugins, дзякуючы чаму клопаты распрацоўнікаў будуць зведзены да падтрымкі адной версіі іх убудоў, а сумяшчальнасць са старымі API захаваецца і іх можна будзе абвясціць састарэлымі па звычайным сцэнары. Чакаецца, што да наступнага рэлізу Kubernetes (1.15) будзе праведзена міграцыя ўсіх убудоў хмарных правайдэраў, рэалізацыя атрымае статут бэта-версіі і будзе актываваная ва ўсталёўках K8s па змаўчанні. Падрабязнасці гл. у design proposal. Следствам гэтай міграцыі таксама стаў адмова ад абмежаванняў для тамоў, вызначаных пэўнымі хмарнымі правайдэрамі (AWS, Azure, GCE, Cinder).

Акрамя таго, падтрымка блокавых прылад з CSI (CSIBlockVolume) праведзена у бэта-версію.

Вузлы / Kubelet

Прадстаўлена альфа-версія новага endpoint у Kubelet, прызначанага для аддачы метрык па асноўных рэсурсах. Наогул кажучы, калі раней Kubelet атрымліваў статыстыку па выкарыстанні кантэйнераў з cAdvisor, то зараз гэтыя дадзеныя паступаюць з выкананага асяроддзя кантэйнера праз CRI (Container Runtime Interface), аднак захавана і сумяшчальнасць для працы са старымі версіямі Docker. Раней сабраная ў Kubelet статыстыка аддавалася праз REST API, а зараз для гэтага выкарыстоўваецца endpoint, размешчаны па адрасе /metrics/resource/v1alpha1. Доўгатэрміновая ж стратэгія распрацоўшчыкаў заключаецца у тым, каб мінімізаваць набор метрык, якія прадстаўляюцца Kubelet. Дарэчы, самі гэтыя метрыкі зараз называюць не "core metrics", а "resource metrics", і апісваюць як "first-class resources, such as cpu, and memory".

Вельмі забаўны нюанс: нягледзячы на ​​відавочную перавагу ў прадукцыйнасці gRPC endpoint у параўнанні з рознымі выпадкамі выкарыстання фармату Prometheus (вынік аднаго з benchmark'аў гл. ніжэй), аўтары аддалі перавагу тэкставы фармат Prometheus з-за відавочнага лідэрства гэтай сістэмы маніторынгу ў супольнасці.

gRPC не сумяшчальны з асноўнымі пайплайнамі маніторынгу. Endpoint ж будзе карысны толькі для пастаўкі метрык у Metrics Server або кампаненты маніторынгу, якія інтэгруюцца напрамую з ім. Пры выкарыстанні кэшавання ў Metrics Server прадукцыйнасць тэкставага фармату Prometheus дастаткова добрая для нас, каб аддаць перавагу Prometheus, а не gRPC, улічваючы шырокую распаўсюджанасць Prometheus у супольнасці. Калі фармат OpenMetrics стане больш стабільным, мы зможам наблізіцца да папулярнасці gRPC з дапамогай фармату на аснове proto».

Kubernetes 1.14: агляд асноўных навін
Адзін з параўнальных тэстаў прадукцыйнасці выкарыстання фарматаў gRPC і Prometheus у новым endpoint'е Kubelet для метрык. Больш графікаў і іншыя падрабязнасці можна знайсці ў КЭП.

Сярод іншых змен:

  • Kubelet цяпер (аднойчы) спрабуе спыніць кантэйнеры ў невядомым стане (unknown) перад аперацыямі рэстарту і выдаленні.
  • Пры выкарыстанні PodPresets зараз init-кантэйнеру дадаецца тая ж інфармацыя, што і звычайнаму кантэйнеру.
  • кубелет пачаў выкарыстоўваць usageNanoCores з правайдэра статыстыкі CRI, а для вузлоў і кантэйнераў у Windows дададзена сеткавая статыстыка.
  • Інфармацыя аб аперацыйнай сістэме і архітэктуры зараз запісваецца ў лэйблы kubernetes.io/os и kubernetes.io/arch аб'ектаў Node (перакладзена з бэты ў GA).
  • Магчымасць указання канкрэтнай сістэмнай групы карыстальнікаў для кантэйнераў у pod'е (RunAsGroup, з'явілася ў K8s 1.11) прасунулася да бэта-версіі (уключана па змаўчанні).
  • du і find, якія выкарыстоўваюцца ў cAdvisor, заменены на Go-рэалізацыі.

CLI

У cli-runtime і kubectl дададзены сцяг -k для інтэграцыі з kustomize (дарэчы, яго распрацоўка зараз вядзецца ў асобным рэпазітары), г.зн. для апрацоўкі дадатковых YAML-файлаў з спецыяльных дырэкторый kustomization (падрабязнасці аб іх выкарыстанні гл. КЭП):

Kubernetes 1.14: агляд асноўных навін
Прыклад простага выкарыстання файла kustomization (магчыма і больш складанае прымяненне kustomize ў рамках накладанняў)

Акрамя таго:

  • Дададзена новая каманда kubectl create cronjob, назва якога гаворыць за сябе.
  • В kubectl logs зараз можна спалучаць сцягі -f (--follow для стрымінгу логаў) і -l (--selector для label query).
  • кубектль навучылі капіяваць файлы, якія выбіраюцца з дапамогай wild card.
  • У каманду kubectl wait дадалі сцяг --all для выбару ўсіх рэсурсаў у прасторы імёнаў названага тыпу рэсурсаў.

Іншыя

Стабільны (GA) статус атрымалі наступныя магчымасці:

  • ReadinessGate, які выкарыстоўваецца ў спецыфікацыі pod'а для вызначэння дадатковых умоў, якія ўлічваюцца ў гатоўнасці pod'а;
  • Падтрымка вялікіх старонак (feature gate пад назвай HugePages);
  • CustomPodDNS;
  • PriorityClass API, Pod Priority & Preemption.

Іншыя змены, прадстаўленыя ў Kubernetes 1.14:

  • Палітыка RBAC па змаўчанні больш не дае доступу да API discovery и access-review карыстальнікам без аўтэнтыфікацыі (unauthenticated).
  • Афіцыйная падтрымка CoreDNS забяспечваецца толькі для Linux, таму пры выкарыстанні kubeadm для яго (CoreDNS) разгортванні ў кластары вузлы павінны працаваць толькі ў Linux (для гэтага абмежавання выкарыстоўваюцца nodeSelectors).
  • Канфігурацыя CoreDNS па змаўчанні зараз выкарыстоўвае убудова forward замест проксі. Акрамя таго, у 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.

PS

Чытайце таксама ў нашым блогу:

Крыніца: habr.com

Дадаць каментар