Учора, 9 снежня, адбыўся чарговы рэліз Kubernetes - 1.17. Па традыцыі, якая склалася для нашага блога, мы расказваем пра найбольш значныя змены ў новай версіі.
Інфармацыя, выкарыстаная для падрыхтоўкі гэтага матэрыялу, узята з афіцыйнага анонсу, табліцы Kubernetes enhancements tracking, CHANGELOG-1.17 і адпаведных issues, pull requests, а таксама Kubernetes Enhancement Proposals (KEP). Такім чынам, што новага?
Маршрутызацыя з улікам тапалогіі
Вось ужо доўгі час у супольнасці Kubernetes чакалі гэтай фічы. Topology-aware service routing. Калі КЭП па ёй бярэ свой пачатак у кастрычніку 2018-га, а афіцыйны ўзмацненне - 2 гады таму, то звычайныя issues (накшталт гэтага) — і зусім старэйшыя яшчэ на некалькі гадоў…
Агульная ідэя зводзіцца да таго, каб даць магчымасць рэалізоўваць "лакальную" маршрутызацыю для сэрвісаў, якія знаходзяцца ў Kubernetes. «Лакальнасць» у дадзеным выпадку азначае «той жа самы тапалагічны ўзровень» (topology level), якім можа з'яўляцца:
аднолькавы для сэрвісаў вузел,
тая ж самая серверная стойка,
той жа самы рэгіён,
той жа самы хмарны правайдэр,
...
Прыклады выкарыстання такой фічы:
эканомія на трафіку ў хмарных усталёўках са мноствам зон даступнасці (multi-AZ) - гл. свежую ілюстрацыю на прыкладзе трафіку аднаго рэгіёна, але розных AZ у AWS;
меншыя затрымкі ў прадукцыйнасці/лепшая прапускная здольнасць;
шардыраваны сэрвіс, які мае лакальную інфармацыю аб вузле ў кожным шардзе;
размяшчэнне fluentd (або аналагаў) на адзін вузел з праграмамі, логі якіх збіраюцца;
Падрабязнасці аб тым, як фіча ўладкована і як ёй ужо можна скарыстацца, чытайце ў гэтым артыкуле ад аднаго з аўтараў.
Падтрымка падвойнага стэка IPv4/IPv6
Значны прагрэс зафіксаваны у іншай сеткавай фічы: адначасовай падтрымцы двух IP-стэкаў, што была ўпершыню прадстаўлена ў K8s 1.16. У прыватнасці, новы рэліз прынёс наступныя змены:
у kube-proxy рэалізавана магчымасць адначасовай працы ў абодвух рэжымах (IPv4 і IPv6);
в Pod.Status.PodIPsз'явілася падтрымка downward API (адначасова з гэтым у /etc/hosts зараз патрабуюць для хаста дадаваць і IPv6-адрас);
падтрымка двух стэкаў у вЫГЛЯД (Kubernetes IN Docker) і кубеадм;
абноўленыя e2e-тэсты.
ілюстрацыя выкарыстання падвойнага стэка IPV4/IPv6 у KIND
Ініцыятыва па міграцыі плагінаў тамоў на CSI - CSI Migration - дасягнула бэта-версіі. Гэтая фіча крытычная для таго, каб перавесці існуючыя плагіны сховішчаў. (in-tree) на сучасны інтэрфейс (CSI, out-of-tree) неўзаметку для канчатковых карыстальнікаў Kubernetes. Адміністратарам кластараў будзе дастаткова актываваць CSI Migration, пасля чаго існуючыя stateful-рэсурсы і працоўныя нагрузкі будуць па-ранейшаму "проста працаваць"… але ўжо з выкарыстаннем актуальных CSI-драйвераў замест састарэлых, якія ўваходзяць у ядро Kubernetes.
На дадзены момант у статуце бэта-версіі гатова міграцыя для драйвераў AWS EBS (kubernetes.io/aws-ebs) і GCE PD (kubernetes.io/gce-pd). Прагнозы па іншых сховішчах такія:
Аб тым, як "традыцыйная" падтрымка сховішчаў у K8s прыйшла да CSI, мы распавядалі ў гэтым артыкуле. А пераходу міграцыі CSI у статут бэта-версіі прысвечана асобная публікацыя у блогу праекта.
Акрамя таго, статуту бэта-версіі (т.е. уключэнні па змаўчанні) у рэлізе Kubernetes 1.17 дасягнула іншая значная функцыянальнасць у кантэксце CSI, якая бярэ свой пачатак (альфа-рэалізацыю) у K8s 1.12, — стварэнне снапшотаў і аднаўленне з іх. Сярод змен, зробленых у Kubernetes Volume Snapshot на шляху да бэта-рэлізу:
разбіўка sidecar'а CSI external-snapshotter на два кантролера,
дададзены сакрэт на выдаленне (deletion secret) як анатацыя да змесціва снапшота тома,
новы фіналізатар (finalizer) для прадухілення выдалення API-аб'екта снапшота пры наяўнасці пакінутых сувязяў.
На момант рэлізу 1.17/XNUMX фіча падтрымліваецца ў трох CSI-драйвераў: GCE Persistent Disk CSI Driver, Portworx CSI Driver і NetApp Trident CSI Driver. Падрабязней пра яе рэалізацыю і выкарыстанне можна прачытаць у гэтай публікацыі у блогу.
Cloud Provider Labels
Лэйблы, якія аўтаматычна прызначаюцца на ствараныя вузлы і тамы ў залежнасці ад выкарыстоўванага хмарнага правайдэра., былі даступныя ў Kubernetes як бэта-версія ўжо вельмі даўно – пачынаючы з рэлізу K8s 1.2 (красавік 2016 года!). Улічваючы іх шырокае прымяненне так доўга, распрацоўшчыкі вырашылі, Што надышоў час аб'явіць фічу стабільнай (GA).
Таму ўсе яны былі перайменаваны адпаведным чынам (па тапалогіях):
… але па-ранейшаму даступныя і па сваіх старых назвах (для зваротнай сумяшчальнасці). Зрэшты, усім адміністратарам рэкамендуецца пераходзіць на актуальныя лэйблы. Адпаведная дакументацыя K8s была абноўлена.
Матывацыя да рэалізацыі гэтай фічы (згодна КЭП) такая:
Хоць Kubernetes і можа быць разгорнуты ўручную, стандартам дэ-факта (калі не дэ-юрэ) для гэтай аперацыі з'яўляецца выкарыстанне kubeadm. Папулярныя прылады кіравання сістэмамі накшталт Terraform абапіраюцца на kubeadm для дэплою Kubernetes. Запланаваныя паляпшэнні ў Cluster API складаюцца з кампанаваны пакет для bootstrapping'а Kubernetes з kubeadm і cloud-init.
Без структураванай высновы нават самыя бяскрыўдныя на першы погляд змены могуць зламаць Terraform, Cluster API і іншы софт, які выкарыстоўвае вынікі працы kubeadm.
У бліжэйшых планах значыцца падтрымка (у выглядзе структураванай высновы) для наступных каманд kubeadm:
alpha certs
config images list
init
token create
token list
upgrade plan
version
Ілюстрацыя JSON-адказу на каманду kubeadm init -o json:
Наогул жа, рэліз Kubernetes 1.17 адбыўся пад дэвізам.стабільнасць». Таму спрыяў той факт, што вельмі многія фічы ў ім (іх агульная колькасць - 14) атрымалі статус GA. Сярод такіх:
"абарона фіналізатара" (Finalizer Protection) для балансавальнікаў нагрузкі (праверка адпаведных рэсурсаў Service'а перад выдаленнем рэсурсаў LoadBalancer'а);
аптымізацыя kube-apiserver у прадукцыйнасці пры працы са мноствам watches, якія назіраюць за ідэнтычнымі наборамі аб'ектаў, - дасягаецца дзякуючы пазбягаю паўторнай серыялізацыі адных і тых жа аб'ектаў для кожнага watcher'а.
Іншыя змены
Поўны спіс навін у Kubernetes 1.17, вядома, не абмяжоўваецца пералічанымі вышэй. Вось некаторыя іншыя з іх (а для больш поўнага пераліку - гл. ЗМЯНЕННЕ):
аналагічная змена спасцігла EndpointSlice API (таксама з K8s 1.16), аднак пакуль гэтае рашэнне для паляпшэння прадукцыйнасці/маштабаванасці Endpoint API не актываванае па змаўчанні;