Včeraj, 9. decembra, potekal naslednja izdaja Kubernetesa - 1.17. Po tradiciji, ki se je razvila za naš blog, govorimo o najpomembnejših spremembah v novi različici.
Podatki, uporabljeni za pripravo tega gradiva, so vzeti iz uradne objave, Tabele za sledenje izboljšav Kubernetes, DNEVNIK SPREMEMB-1.17 in sorodna vprašanja, zahteve za vlečenje in predloge za izboljšavo Kubernetes (KEP). Torej kaj je novega?..
Usmerjanje, ki upošteva topologijo
Skupnost Kubernetes je dolgo čakala na to funkcijo - Usmerjanje storitev, ki upošteva topologijo. Če KEP izvira iz oktobra 2018 in uradno Izboljšave — Pred 2 leti, običajne težave (kot je) - in še nekaj let starejši...
Splošna zamisel je zagotoviti možnost izvajanja "lokalnega" usmerjanja za storitve, ki se nahajajo v Kubernetesu. "Lokalnost" v tem primeru pomeni "isto topološko raven" (raven topologije), ki je lahko:
vozlišče identično za storitve,
isto strežniško omaro,
isto regijo
isti ponudnik oblaka,
...
Primeri uporabe te funkcije:
prihranek prometa v namestitvah v oblaku z več območji razpoložljivosti (multi-AZ) - glej. sveža ilustracija na primeru prometa iz iste regije, vendar različnih AZ v AWS;
manjša zakasnitev delovanja/boljša prepustnost;
razdeljena storitev, ki ima lokalne informacije o vozlišču v vsakem drobcu;
postavitev fluentd (ali analogov) na isto vozlišče z aplikacijami, katerih dnevniki se zbirajo;
Za podrobnosti o tem, kako funkcija deluje in kako jo že lahko uporabljate, preberite ta članek od enega od avtorjev.
Podpora za dvojni sklad IPv4/IPv6
Pomemben napredek fiksno v drugi omrežni funkciji: hkratna podpora za dva sklada IP, ki je bila prvič predstavljena l K8s 1.16. Zlasti nova izdaja je prinesla naslednje spremembe:
v kube-proxy izvajati možnost hkratnega delovanja v obeh načinih (IPv4 in IPv6);
в Pod.Status.PodIPspojavil podpora za API navzdol (istočasno kot v /etc/hosts zdaj zahtevajo, da gostitelj doda naslov IPv6);
podpora za dvojni sklad KIND (Kubernetes IN Docker) in kubeadm;
posodobljeni testi e2e.
Ilustracija z uporabo dvojnega sklada IPV4/IPv6 v KIND
Napredek pri CSI
Razglašeno za stabilno topološka podpora za shranjevanje na osnovi CSI, ki je bilo prvič predstavljeno l K8s 1.12.
Pobuda za selitev vtičnikov glasnosti v CSI - Migracija CSI - dosežena različica beta. Ta funkcija je ključnega pomena za prevajanje obstoječih vtičnikov za shranjevanje (v drevesu) na sodoben vmesnik (CSI, zunaj drevesa) neviden končnim uporabnikom Kubernetes. Skrbniki gruče bodo morali samo omogočiti migracijo CSI, po kateri bodo obstoječi viri in delovne obremenitve s stanjem še naprej »samo delovali« ... vendar z uporabo najnovejših gonilnikov CSI namesto zastarelih, vključenih v jedro Kubernetes.
Trenutno je migracija za gonilnike AWS EBS pripravljena v različici beta (kubernetes.io/aws-ebs) in GCE PD (kubernetes.io/gce-pd). Napovedi za ostala skladišča so naslednje:
Govorili smo o tem, kako je "tradicionalna" podpora za shranjevanje v K8 prišla v CSI ta članek. In temu je posvečen prehod migracije CSI na stanje beta ločena objava na blogu projekta.
Poleg tega je druga pomembna funkcionalnost v kontekstu CSI, ki izvira (izvedba alfa) v K1.17s 8, dosegla stanje beta (tj. privzeto omogočeno) v izdaji Kubernetes 1.12 – ustvarjanje posnetkov in okrevanje po njih. Med spremembami Kubernetes Volume Snapshot na poti do izdaje beta:
razdelitev stranske prikolice CSI z zunanjim posnetkom na dva krmilnika,
dodana skrivnost za brisanje (skrivnost izbrisa) kot opombo k vsebini posnetka nosilca,
nov finalizator (finalizator) da preprečite brisanje objekta API posnetka, če obstajajo preostale povezave.
V času izdaje 1.17 funkcijo podpirajo trije gonilniki CSI: gonilnik GCE Persistent Disk CSI, gonilnik Portworx CSI in gonilnik NetApp Trident CSI. Več podrobnosti o njegovi izvedbi in uporabi najdete v ta publikacija na blogu.
Oznake ponudnika oblaka
To samodejno označi dodeljena ustvarjenim vozliščem in nosilcem glede na uporabljenega ponudnika oblaka, so v Kubernetesu na voljo kot različica beta že zelo dolgo – od izdaje K8s 1.2 (april 2016!). Glede na njihovo tako dolgo razširjeno uporabo razvijalci odločil, da je čas, da funkcijo razglasite za stabilno (GA).
Zato so bili vsi ustrezno preimenovani (po topologiji):
... vendar so še vedno na voljo pod starimi imeni (zaradi združljivosti za nazaj). Vsem skrbnikom pa priporočamo, da preidejo na trenutne oznake. Povezana dokumentacija K8s je posodobljen.
Motivacija za izvajanje te funkcije (glede na KEP) je:
Medtem ko je mogoče Kubernetes razmestiti ročno, je de facto (če ne de jure) standard za to operacijo uporaba kubeadm. Priljubljena orodja za upravljanje sistemov, kot je Terraform, se za uvajanje Kubernetes zanašajo na kubeadm. Načrtovane izboljšave API-ja Cluster vključujejo sestavljiv paket za zagon Kubernetes s kubeadm in cloud-init.
Brez strukturiranega izhoda lahko tudi na prvi pogled najbolj neškodljive spremembe pokvarijo Terraform, Cluster API in drugo programsko opremo, ki uporablja rezultate kubeadm.
Naši takojšnji načrti vključujejo podporo (v obliki strukturiranega izhoda) za naslednje ukaze kubeadm:
alpha certs
config images list
init
token create
token list
upgrade plan
version
Ilustracija odgovora JSON na ukaz kubeadm init -o json:
Na splošno je izdaja Kubernetes 1.17 potekala pod geslom "Stabilnost" To je olajšalo dejstvo, da je v njem veliko funkcij (njihovo skupno število je 14) prejel status GA. Med njimi:
"zaščita finalizatorja" (Zaščita finalizatorja) za izravnalnike obremenitve (preverjanje ustreznih virov storitve pred brisanjem virov LoadBalancer);
optimizacija kube-apiserver v zmogljivosti pri delu z več urami, ki spremljajo enake nize objektov – doseženo z izogibanjem ponavljajoči se serializaciji istih objektov za vsakega opazovalca.
Druge spremembe
Celoten seznam novosti v Kubernetesu 1.17 seveda ni omejen na zgoraj navedene. Tukaj je nekaj drugih (in za popolnejši seznam glejte KANGELOG):
Funkcija, predstavljena v zadnji izdaji, je dosegla različico beta RunAsUserName za okna;
podobna sprememba doletel API EndpointSlice (tudi od K8s 1.16), vendar za zdaj ta rešitev za izboljšanje zmogljivosti/razširljivosti API-ja Endpoint ni privzeto omogočena;