Ieri, 9 decembrie, următoarea versiune a Kubernetes - 1.17. Conform tradiției care s-a dezvoltat pentru blogul nostru, vorbim despre cele mai semnificative schimbări în noua versiune.

Informațiile folosite la pregătirea acestui material sunt preluate din anunțul oficial, , și probleme conexe, solicitări de extragere și propuneri de îmbunătățire Kubernetes (KEP). Deci ce este nou?..
Rutare conștientă de topologie
Comunitatea Kubernetes așteaptă această funcție de mult timp - Rutarea serviciului conștient de topologie. dacă își are originea în octombrie 2018, iar oficial — Acum 2 ani, problemele obișnuite (ca ) - și încă câțiva ani mai în vârstă...
Ideea generală este de a oferi posibilitatea de a implementa rutarea „locală” pentru serviciile care locuiesc în Kubernetes. „Localitatea” în acest caz înseamnă „același nivel topologic” (nivel de topologie), care poate fi:
- nod identic pentru servicii,
- același rack de server,
- aceeași regiune
- același furnizor de cloud,
- ...
Exemple de utilizare a acestei funcții:
- economii de trafic în instalațiile cloud cu zone de disponibilitate multiple (multi-AZ) - vezi. folosind exemplul de trafic din aceeași regiune, dar AZ-uri diferite în AWS;
- latență de performanță mai mică/performanță mai bună;
- un serviciu sharded care are informații locale despre nodul din fiecare shard;
- plasarea fluentd (sau analogilor) pe același nod cu aplicațiile ale căror loguri sunt colectate;
- ...
O astfel de rutare, care „știe” despre topologie, se mai numește și afinitate de rețea - prin analogie cu , sau a apărut (și ). Nivelul actual de implementare ServiceTopology în Kubernetes - versiunea alfa.
Pentru detalii despre cum funcționează funcția și despre cum o puteți utiliza deja, citiți de la unul dintre autori.
Suport IPv4/IPv6 dual stack
Progres semnificativ într-o altă caracteristică de rețea: suport simultan pentru două stive IP, care a fost introdus pentru prima dată în . În special, noua versiune a adus următoarele modificări:
- în kube-proxy posibilitatea de funcționare simultană în ambele moduri (IPv4 și IPv6);
- в
Pod.Status.PodIPssuport pentru API descendent (în același timp cu în/etc/hostsacum solicită gazdei să adauge o adresă IPv6); - suport dual stack (Kubernetes IN Docker) și ;
- teste e2e actualizate.

folosind dual stack IPV4/IPv6 în NATUR
Progresul CSI
Declarat stabil pentru stocarea bazată pe CSI, introdus pentru prima dată în .
Inițiativa pentru migrarea pluginurilor de volum la CSI - - a ajuns la versiunea beta. Această caracteristică este critică pentru a traduce pluginurile de stocare existente (în copac) la o interfață modernă (CSI, în afara arborelui) invizibil pentru utilizatorii finali Kubernetes. Administratorii de clustere vor trebui doar să activeze migrarea CSI, după care resursele și încărcăturile de lucru existente vor continua să „funcționeze”... dar folosind cele mai recente drivere CSI în loc de cele învechite incluse în nucleul Kubernetes.
În acest moment, migrarea pentru driverele AWS EBS este gata în versiunea beta (kubernetes.io/aws-ebs) și GCE PD (kubernetes.io/gce-pd). Prognozele pentru alte spații de depozitare sunt următoarele:

Am vorbit despre modul în care suportul de stocare „tradițional” în K8 a ajuns la CSI . Iar tranziția migrației CSI la statutul beta este dedicată pe blogul proiectului.
În plus, o altă funcționalitate semnificativă în contextul CSI, care își are originea (implementarea alfa) în K1.17s 8, a ajuns la starea beta (adică activată implicit) în versiunea Kubernetes 1.12 - și recuperarea de la ele. Printre modificările aduse Kubernetes Volume Snapshot în drumul spre lansarea beta:
- împărțirea sidecar-ului cu instantaneu extern CSI în două controlere,
- secret adăugat pentru ștergere (secretul de ștergere) ca adnotare la conținutul unui instantaneu de volum,
- noul finalizator (finalizator) pentru a preveni ștergerea obiectului API instantaneu dacă mai există conexiuni.
La momentul lansării 1.17, caracteristica este acceptată de trei drivere CSI: driverul GCE Persistent Disk CSI, driverul Portworx CSI și driverul NetApp Trident CSI. Mai multe detalii despre implementarea și utilizarea sa pot fi găsite în pe blog.
Etichetele furnizorilor de cloud
Etichetează automat atribuite nodurilor și volumelor create în funcție de furnizorul de cloud utilizat, au fost disponibile în Kubernetes ca versiune beta de foarte mult timp - de la lansarea K8s 1.2 (aprilie 2016!). Având în vedere utilizarea lor pe scară largă pentru atât de mult timp, dezvoltatorii , că este timpul să declarăm caracteristica stabilă (GA).
Prin urmare, toate au fost redenumite în consecință (după topologie):
-
beta.kubernetes.io/instance-type→node.kubernetes.io/instance-type -
failure-domain.beta.kubernetes.io/zone→topology.kubernetes.io/zone -
failure-domain.beta.kubernetes.io/region→topology.kubernetes.io/region
... dar sunt încă disponibile sub numele lor vechi (pentru compatibilitate inversă). Cu toate acestea, tuturor administratorilor li se recomandă să treacă la etichetele actuale. K8s a fost actualizat.
Ieșire structurată a kubeadm
Prezentat în versiune alfa pentru prima dată . Formate acceptate: șablon JSON, YAML, Go.
Motivația pentru implementarea acestei caracteristici (conform ) este:
În timp ce Kubernetes poate fi implementat manual, standardul de facto (dacă nu de jure) pentru această operațiune este utilizarea kubeadm. Instrumentele populare de gestionare a sistemelor, cum ar fi Terraform, se bazează pe kubeadm pentru implementarea Kubernetes. Îmbunătățirile planificate ale API-ului Cluster includ un pachet composabil pentru bootstrapping Kubernetes cu kubeadm și cloud-init.
Fără rezultate structurate, chiar și cele mai inofensive modificări la prima vedere pot distruge Terraform, Cluster API și alte software-uri care utilizează rezultatele kubeadm.
Planurile noastre imediate includ suport (sub formă de ieșire structurată) pentru următoarele comenzi kubeadm:
-
alpha certs -
config images list -
init -
token create -
token list -
upgrade plan -
version
Ilustrație a unui răspuns JSON la o comandă kubeadm init -o json:
{
"node0": "192.168.20.51:443",
"caCrt": "sha256:1f40ff4bd1b854fb4a5cf5d2f38267a5ce5f89e34d34b0f62bf335d74eef91a3",
"token": {
"id": "5ndzuu.ngie1sxkgielfpb1",
"ttl": "23h",
"expires": "2019-05-08T18:58:07Z",
"usages": [
"authentication",
"signing"
],
"description": "The default bootstrap token generated by 'kubeadm init'.",
"extraGroups": [
"system:bootstrappers:kubeadm:default-node-token"
]
},
"raw": "Rm9yIHRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSAia3ViZWFkbSBpbml0IiBjb21tYW5kLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2FrdXR6LzdhNjg2ZGU1N2JmNDMzZjkyZjcxYjZmYjc3ZDRkOWJhI2ZpbGUta3ViZWFkbS1pbml0LW91dHB1dC1sb2c="
}Stabilizarea altor inovații
În general, lansarea Kubernetes 1.17 a avut loc sub motto-ul „stabilitate" Acest lucru a fost facilitat de faptul că multe caracteristici din acesta (numărul lor total este 14) a primit statutul GA. Printre ei:
- „marcarea” nodurilor în funcție de anumite condiții (), aparut in ;
- - un nou tip de evenimente care au o etichetă că toate obiectele sunt până la o anumită versiune (
resourceVersion) au fost deja procesate de ceas; - (implicit) pentru Resurse personalizate;
- în spațiile de nume ale procesului pod;
-
ScheduleDaemonSetPods- folosind kube-scheduler (în loc de controlerul DaemonSet); - asupra numărului de volume în funcție de tipul nodului;
- pentru nume de directoare montate ca
subPath; - la un API de închiriere specializat;
- „protecția finalizatorului” () pentru echilibratori de încărcare (verificarea resurselor Service corespunzătoare înainte de a șterge resursele LoadBalancer);
- în performanță atunci când se lucrează cu mai multe ceasuri monitorizarea seturi identice de obiecte - obținut prin evitarea serializării repetate a acelorași obiecte pentru fiecare observator.
Alte modificări
Lista completă a inovațiilor din Kubernetes 1.17, desigur, nu se limitează la cele enumerate mai sus. Iată câteva altele (și pentru o listă mai completă, vezi ):
- Caracteristica prezentată în ultima versiune a ajuns în versiunea beta ;
- schimbare similară API-ul EndpointSlice (tot din K8s 1.16), totuși, deocamdată, această soluție de îmbunătățire a performanței/scalabilității API-ului Endpoint nu este activată implicit;
- Pod-urile sunt acum critice pentru funcționarea clusterului nu numai în spațiile de nume
kube-system(pentru detalii, consultați documentația pentru ); - opțiune nouă pentru kubelet - — vă permite să definiți în mod explicit lista CPU-urilor rezervate pentru sistem;
- pentru
kubectl logssteag nou--prefix, adăugând numele podului și al containerului sursă la fiecare linie a jurnalului; - в
label.SelectorRequiresExactMatch; - toate containerele în kube-dns cu mai puține privilegii;
- separat într-un depozit GitHub separat și nu va mai fi inclus în versiunile Kubernetes;
- mult kube-proxy pentru porturi non-UDP.
Modificări de dependență:
- Versiunea CoreDNS inclusă în kubeadm este 1.6.5;
- Versiunea crictl actualizată la v1.16.1;
- CSI 1.2.0;
- etcd 3.4.3;
- Ultima versiune Docker testată, actualizată la 19.03;
- Versiunea Go minimă necesară pentru a construi Kubernetes 1.17 este 1.13.4.
PS
Citește și pe blogul nostru:
- «»;
- «»;
- «»;
- «".
Sursa: www.habr.com
