
Dnes, ve středu, další vydání Kubernetes — 1.16. Podle tradice našeho blogu již po desáté představujeme nejvýznamnější změny v nové verzi.
Informace použité k přípravě tohoto materiálu byly převzaty z , a příslušných issues, pull requests a také Kubernetes Enhancement Proposals (KEP). Tak tedy, jdeme na to!..
Uzly
Opravdu velký počet pozoruhodných novinek (ve stavu alfa verze) je prezentován na straně uzlů K8s klastrů (Kubelet).
Nejprve byly představeny takzvané «» (Ephemeral Containers), které mají usnadnit procesy ladění v podech. Nový mechanismus umožňuje spouštění speciálních kontejnerů, které se spouštějí v jmenném prostoru existujících podů a žijí jen krátkou dobu. Jejich účelem je interakce s ostatními podmi a kontejnery za účelem řešení problémů a ladění. Pro tuto funkci byla implementována nová příkazová řádka kubectl debug, která je v podstatě podobná kubectl exec: jen místo spuštění procesu v kontejneru (jak je tomu u exec) spouští kontejner v podu. Například takový příkaz připojí nový kontejner k podu:
kubectl debug -c debug-shell --image=debian target-pod -- bashPodrobnosti o efemérních kontejnerech (a příklady jejich použití) lze nalézt v . Aktuální implementace (v K8s 1.16) je alfa verze a mezi kritérii jejího převodu do beta verze je uvedeno „testování Ephemeral Containers API po dobu nejméně 2 vydání [Kubernetes]“.
NB: V podstatě a dokonce i podle názvu funkce připomíná již existující plugin , o kterém jsme . Předpokládá se, že s příchodem efemérních kontejnerů se vývoj samostatného externího pluginu zastaví.
Další novinkou je — který má poskytnout mechanismus pro výpočet režijních nákladů na pod, které se mohou výrazně lišit v závislosti na používaném běhovém prostředí (runtime). Jako příklad autoři uvádějí Kata Containers, které vyžadují spuštění hostitelského jádra, agenta kata, init systému atd. Když se režie stává tak vysokou, že ji nelze ignorovat, je třeba způsob, jak ji zohlednit pro další kvótování, plánování atd. Pro její implementaci bylo do PodSpec přidáno pole Overhead *ResourceList (je přiřazeno k datům v RuntimeClass, pokud se používá).
Další výraznou novinkou je správce topologie uzlu (Node Topology Manager), který má za cíl sjednotit přístup k jemnému ladění rozdělení hardwarových zdrojů pro různé komponenty v Kubernetes. Tato iniciativa je reakcí na rostoucí potřebu různých moderních systémů (v oblasti telekomunikací, strojového učení, finančních služeb atd.) po vysoce výkonných paralelních výpočtech a minimalizaci latencí během provádění operací, pro které využívají pokročilé schopnosti CPU a hardwarové akcelerace. Takové optimalizace v Kubernetes byly dosud dosahovány díky rozptýleným komponentům (CPU manager, Device manager, CNI), a nyní bude přidán jednotný vnitřní rozhraní, které sjednotí přístup a usnadní připojení nových podobných – takzvaných topology-aware – komponent na straně Kubelet. Podrobnosti najdete v .

Schéma komponentů Topology Manager
Další funkcí je kontrola kontejnerů při jejich spuštění (). Jak bylo známo, pro kontejnery, které se dlouho spouštějí, je obtížné získat aktuální stav: buď jsou "zabity" ještě před skutečným začátkem fungování, nebo na dlouhou dobu uvíznou v deadlocku. Nová kontrola (aktivuje se přes feature gate s názvem StartupProbeEnabled) zruší – nebo lépe řečeno, odloží – provádění jakýchkoli dalších kontrol do doby, kdy pod dokončil svůj start. Z tohoto důvodu byla funkce původně nazvána . Pro pod’y, které se dlouho startují, je možné provádět dotazy o stavu v relativně krátkých časových intervalech.
Kromě toho je ihned ve statusu beta-version k dispozici vylepšení pro RuntimeClass, které přidává podporu „heterogenních klastrů“. S nyní není nutné, aby každý uzel měl podporu každého RuntimeClass’u: pro pod’y lze vybírat RuntimeClass, aniž by se přemýšlelo o topologii klastru. Dříve bylo třeba pro dosažení tohoto cíle – aby pod’y byly na uzlech, které podporují vše, co potřebují – přidávat odpovídající pravidla do NodeSelector a tolerations. V se popisují příklady použití a samozřejmě podrobnosti implementace.
Síť
Dvě významné síťové funkce, které poprvé vznikly (v alfa verzi) v Kubernetes 1.16 – jsou:
- dvojitého síťového zásobníku – IPv4/IPv6 — a odpovídající jeho «pochopení» na úrovni podů, uzlů a služeb. Zahrnuje interakci IPv4-to-IPv4 a IPv6-to-IPv6 mezi pody, z podů do externích služeb, referenční implementace (v rámci pluginů Bridge CNI, PTP CNI a Host-Local IPAM), a také zpětnou kompatibilitu s кластерами Kubernetes, které fungují pouze přes IPv4 nebo IPv6. Podrobnosti implementace — v .
Příklad výstupu IP adres dvou typů (IPv4 a IPv6) v seznamu 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# - Nové API pro Endpoint — . Řeší problémy stávajícího Endpoint API s výkonem/škálovatelností, což ovlivňuje různé komponenty v control-plane (apiserver, etcd, endpoints-controller, kube-proxy). Nové API bude přidáno do API skupiny Discovery a bude schopno obsluhovat desítky tisíc backend endpointů na každé službě v clusterech, které se skládají z tisíců uzlů. Každá Služba bude mapována do N objektů
EndpointSlice, z nichž každý má ve výchozím nastavení maximálně 100 endpointů (hodnota je konfigurovatelná). V EndpointSlice API jsou zahrnuty i možnosti pro jeho budoucí rozvoj: podpora mnoha IP adres pro každý pod, nové stavy pro endpointy (nejenReadyaNotReady), dynamické subsetování pro endpointy.
Do beta verze postoupil prezentovaný v minulém vydání , nazvaný service.kubernetes.io/load-balancer-cleanup a připojený ke každé službě typu LoadBalancer. Při odstranění takové služby zabrání skutečnému odstranění zdroje, dokud není dokončeno „úklid“ všech souvisejících zdrojů vyrovnávače zatížení.
API Machinery
Skutečný „milník stabilizace“ byl zaznamenán v oblasti API serveru Kubernetes a jeho interakce. K tomu do značné míry přispělo převedení do stavu stable nepotřebujících zvláštní prezentaci (CRD), které měly stav beta od dob vzdáleného Kubernetes 1.7 (a to je červen 2017!). Stejná stabilizace přišla i k souvisejícím funkcím:
- s
/statusa/scalepro CustomResources; - verzí pro CRD, založená na externím webhooku;
- (v K8s 1.15) výchozí hodnoty (defaulting) a automatické odstranění polí (pruning) pro CustomResources;
- aplikace schéma OpenAPI v3 pro vytváření a publikaci OpenAPI dokumentace, která se používá k validaci CRD zdrojů na straně serveru.
Další mechanismus, který se stal známým pro správce Kubernetes: — který dlouhou dobu zůstal v beta verzi (s K8s 1.9) a nyní byl prohlášen za stabilní.
Dvě další funkce se dostaly do beta verze: a .
A jedinou významnou novinkou v alpha verzi bylo od SelfLink — speciální URI představující daný objekt a tvořící součást ObjectMeta a ListMeta (tj. součást jakéhokoli objektu v Kubernetes). Proč se od něj ustupuje? Motivace „zjednodušeně“ jako absence skutečných (nepřekonatelných) důvodů, proč by toto pole mělo i nadále existovat. Formálnější důvody — optimalizace výkonu (odstraněním nepotřebného pole) a zjednodušení práce generic-apiserveru, který musí toto pole zpracovávat zvláštním způsobem (je to jediné pole, které se nastavuje těsně před serializací objektu). Skutečné „zastarání“ (v rámci beta verze) SelfLink nastane s verzí Kubernetes 1.20, a konečné — 1.21.
Ukládání dat
Hlavní práce v oblasti storage, stejně jako v předchozích vydáních, se soustředí na . Hlavními změnami zde bylo:
- poprvé (v alpha verzi) podpora CSI pluginů pro pracovní uzly s Windows: moderní způsob práce s úložišti, který nahradí in-tree pluginy v jádře Kubernetes a FlexVolume pluginy od Microsoftu založené na Powershellu;

Schéma implementace CSI pluginů v Kubernetes pro Windows - možnost , představená už v K8s 1.12, dosáhla beta verze;
- analogického „zvýšení“ (z alpha na beta verzi) dosáhla možnost použití CSI pro vytváření lokálních efemérních svazků ().
Fnukce klonování svazků, která se objevila v předchozí verzi Kubernetes DataSource pro vytváření nových PVC) také nyní získala status beta verze. Dvě významné změny v plánování (obe jsou v alpha verzi):
Plánovač
EvenPodsSpreading
- použít pro „férové rozložení“ zátěže pody místo logických jednotek aplikace (jako Deployment a ReplicaSet) a regulaci tohoto rozložení (jako tvrdou podmínku nebo jako měkkou podmínku, tj. prioritu). Funkce rozšíří stávající možnosti rozložení plánovaných podů, které jsou nyní omezeny volbami PodAffinity
PodAntiAffinityaPodAntiAffinity, což poskytuje správcům jemnější kontrolu v této oblasti, což znamená lepší vysokou dostupnost a optimalizovanou spotřebu zdrojů. Podrobnosti najdete v . - Použití Politika BestFit v Funkce priority RequestedToCapacityRatio během plánování podů, což umožní aplikovat („balení do kontejnerů“) jak pro základní zdroje (procesor, paměť), tak i pro rozšířené (například GPU). Více informací najdete v .

Plánování podů: před použitím politiky best fit (přímo přes výchozí plánovač) a s jejím použitím (přes rozšiřovač plánovače)
Kromě toho, možnost vytvářet vlastní pluginy pro plánovač mimo hlavní vývojovou větev Kubernetes (out-of-tree).
Další změny
Také v verzi Kubernetes 1.16 lze zaznamenat iniciativu pro existujících metrik do pořádku, nebo přesněji — do souladu s pro instrumentaci K8s. Ty se ve velké míře opírají o odpovídající . Nesrovnalosti vznikly z různých důvodů (například některé metriky byly jednoduše vytvořeny ještě před tím, než se objevily aktuální pokyny), a vývojáři se rozhodli, že nastal čas sjednotit všechno na jeden standard, "v souladu s ostatními ekosystémy Prometheus". Aktuální implementace této iniciativy má status alfa verze, který bude postupně zvyšován ve dalších verzích Kubernetes na beta (1.17) a stabilní (1.18).
Kromě toho lze zaznamenat následující změny:
- Rozvoj podpory Windows s nástroje Kubeadm pro tento operační systém (verze alfa),
RunAsUserNamepro Windows kontejnery (verze alfa), podporu Group Managed Service Account (gMSA) do beta verze, mount/attach pro svazky vSphere. - mechanismus komprese dat v odpovědích API. Dříve se k těmto účelům používal HTTP filtr, který měl řadu omezení, bránících jeho povolení ve výchozím nastavení. Nyní funguje "průhledná komprese požadavků": klienti, kteří posílají
Accept-Encoding: gzipv hlavičce, dostanou zkomprimovanou odpověď ve formátu GZIP, pokud její velikost překročila 128 kB. Klienti na Go automaticky podporují kompresi (odesílají potřebnou hlavičku), takže si okamžitě všimnou snížení provozu. (Pro jiné jazyky mohou být potřeba drobné úpravy.) - škálování HPA z/do nulových podů na základě externích metrikPokud je škálování prováděno na základě objektů/externích metrik, je možné při nečinnosti pracovních zátěží automaticky zmenšit počet replik na 0, aby se ušetřily zdroje. Tato funkce bude zvlášť užitečná v případech, kdy pracovníci požadují GPU zdroje a počet různých typů nečinných pracovníků překračuje dostupné GPU.
- Nový klient — — pro „generalizovaný“ přístup k objektům. Je určen pro snadný přístup k metadatům (tj. podřízené
metadata) z prostředků clusteru a provádění operací, jako je úklid a kvótování. - Sběr Kubernetes bez zastaralých („vestavěných“ do in-tree) cloudových poskytovatelů (beta verze).
- Do nástroje kubeadm byla přidána experimentální (beta verze) možnost aplikovat kustomizované patche při operacích
init,připojitaupgrade. Podrobnosti o použití příznaku--experimental-kustomize, viz . - Nový endpoint pro apiserver — , — který umožňuje exportovat informace o jeho připravenosti (readiness). Také api-server dostal příznak
--maximum-startup-sequence-duration, který umožňuje regulovat jeho restartování. - Dvě funkce pro Azure byly vyhlášeny za stabilní: podpora (Availability Zones) a (RG). Kromě toho byla do Azure přidána podpora:
- AAD a ADFS;
-
service.beta.kubernetes.io/azure-pip-namepro určení veřejné IP u vyrovnávače zatížení; - nastavení
LoadBalancerNameaLoadBalancerResourceGroup.
- AWS nyní nabízí pro EBS ve Windows a API volání EC2
DescribeInstances. - Kubeadm nyní sám konfiguraci CoreDNS při aktualizaci verze CoreDNS.
- Binárky etcd ve správném Docker obraze world-executable, což umožňuje spouštět tento obraz bez nutnosti práv root. Navíc obraz migrace etcd podporuje verzi etcd2.
- V přešel na používání distroless jako základního obrazu, zlepšil výkon, přidal nové cloudové poskytovatele (DigitalOcean, Magnum, Packet).
- Aktualizace v používaném/závislém softwaru: Go 1.12.9, etcd 3.3.15, CoreDNS 1.6.2.
P.S.
Přečtěte si také náš blog:
- «»;
- «»;
- «»;
- «».
Zdroj: habr.com


