
Oggi, mercoledì, è stato rilasciato un nuovo aggiornamento di Kubernetes — 1.16. Secondo la tradizione del nostro blog, per la decima volta raccontiamo le modifiche più significative della nuova versione.
Le informazioni utilizzate per preparare questo materiale provengono da , e le relative issue, pull request e Kubernetes Enhancement Proposals (KEP). Quindi, cominciamo!..
Nodi
Un numero notevole di nuove funzionalità (in stato alpha) è stato introdotto per i nodi dei cluster K8s (Kubelet).
Innanzitutto, sono stati presentati i cosiddetti «» (Ephemeral Containers), progettati per semplificare i processi di debugging nei pod.Il nuovo meccanismo consente di avviare contenitori speciali, che si avviano nello spazio dei nomi dei pod esistenti e vivono per un breve periodo. Il loro scopo è interagire con altri pod e contenitori per risolvere eventuali problemi e per il debugging. Per questa funzionalità è stata implementata una nuova comando kubectl debug, simile a kubectl exec: solo che invece di avviare un processo nel contenitore (come nel caso exec) avvia un contenitore nel pod. Ad esempio, il seguente comando collegherà un nuovo contenitore al pod:
kubectl debug -c debug-shell --image=debian target-pod -- bashPuoi trovare dettagli sui container effimeri (e esempi del loro utilizzo) in . L'attuale implementazione (in K8s 1.16) è in versione alpha e tra i criteri per la sua transizione in versione beta c'è «testare l'API dei container effimeri per almeno 2 rilasci [Kubernetes]».
NB: Fondamentalmente, la funzionalità ricorda un plugin già esistente , di cui noi . Si prevede che con l'arrivo dei container effimeri lo sviluppo di un plugin esterno separato si interrompa.
Un'altra novità è — progettata per fornire un meccanismo per il calcolo dei costi sui pod, che possono variare notevolmente a seconda dell'ambiente di esecuzione utilizzato (runtime). Come esempio, gli autori citano Kata Containers, che richiedono l'avvio di un kernel guest, di un agente kata, di un sistema init, ecc. Quando il sovraccarico diventa così elevato, non può essere ignorato, il che significa che è necessario un modo per considerarlo per ulteriori quote, pianificazioni, ecc. Per la sua implementazione, in PodSpec è stato aggiunto il campo Overhead *ResourceList (corrispondente ai dati in RuntimeClass, se applicabile).
Un'altra innovazione significativa è manager della topologia del nodo (Node Topology Manager), progettato per unificare l'approccio alla configurazione fine della distribuzione delle risorse hardware per diversi componenti in Kubernetes. Questa iniziativa è stata motivata dalla crescente necessità di vari sistemi moderni (nel campo delle telecomunicazioni, dell'apprendimento automatico, dei servizi finanziari, ecc.) di calcoli paralleli ad alte prestazioni e di minimizzazione delle latenze durante l'esecuzione delle operazioni, per cui sfruttano le avanzate capacità della CPU e dell'accelerazione hardware. Tali ottimizzazioni in Kubernetes sono state finora raggiunte attraverso componenti disparati (CPU manager, Device manager, CNI), e ora verrà introdotto un'interfaccia interna unificata che standardizzerà l'approccio e semplificherà l'integrazione di nuovi componenti simili — i cosiddetti componenti sensibili alla topologia — sul lato di Kubelet. Maggiori dettagli — in .

Schema dei componenti del Topology Manager
La prossima funzionalità — controllo dei contenitori al momento del loro avvio (). Come è noto, ottenere lo stato attuale per i container che impiegano molto tempo a partire è difficile: vengono 'terminati' prima dell'effettivo avvio o possono rimanere a lungo in deadlock. Un nuovo controllo (attivato tramite un feature gate chiamato StartupProbeEnabled) annulla — o meglio, posticipa — l'azione di qualsiasi altro controllo fino a quando il pod ha completato il suo avvio. Per questo motivo, la funzione è stata inizialmente chiamata . Per i pod che impiegano molto tempo a partire, è possibile effettuare controlli di stato a intervalli di tempo relativamente brevi.
Inoltre, è stata presentata immediatamente in stato beta un'ottimizzazione per RuntimeClass, che aggiunge supporto per 'cluster eterogenei'. Con non è più necessario che ogni nodo supporti ogni RuntimeClass: per i pod è possibile selezionare il RuntimeClass, senza preoccuparsi della topologia del cluster. In precedenza, per ottenere questo — affinché i pod fossero posizionati su nodi con il supporto necessario — era necessario impostare regole appropriate su NodeSelector e tolerations. In si parla di esempi di utilizzo e, naturalmente, di dettagli di implementazione.
Rete
Due importanti funzionalità di rete che sono apparse per la prima volta (nella versione alpha) in Kubernetes 1.16 sono:
- doppio stack di rete — IPv4/IPv6 — e la relativa "comprensione" a livello di pod, nodi e servizi. Questo include l'interazione IPv4-to-IPv4 e IPv6-to-IPv6 tra i pod, dai pod a servizi esterni, implementazioni di riferimento (nel contesto dei plugin Bridge CNI, PTP CNI e Host-Local IPAM), nonché la retrocompatibilità con cluster Kubernetes operanti solo su IPv4 o IPv6. Maggiori dettagli sull'implementazione sono disponibili in .
Esempio di output degli indirizzi IP di due tipi (IPv4 e IPv6) nella lista dei 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# - Nuovo API per Endpoint — . Risolve i problemi dell'attuale Endpoint API in termini di prestazioni/scalabilità, che coinvolgono vari componenti nel control-plane (apiserver, etcd, endpoints-controller, kube-proxy). Il nuovo API sarà aggiunto al gruppo API Discovery e sarà in grado di gestire decine di migliaia di backend endpoint per ogni servizio in un cluster composto da migliaia di nodi. A tal fine, ogni servizio verrà visualizzato in N oggetti
EndpointSlice, ognuno dei quali ha per impostazione predefinita un massimo di 100 endpoint (valore configurabile). L'API EndpointSlice prevede anche possibilità per il suo futuro sviluppo: supporto per più indirizzi IP per ogni pod, nuovi stati per gli endpoint (non soloProntoeNonPronto), subsetting dinamico per gli endpoint.
Fino alla versione beta è avanzato quanto presentato nell'ultimo rilascio , chiamato service.kubernetes.io/load-balancer-cleanup e allegato a ogni servizio di tipo LoadBalancer. Durante l'eliminazione di tale servizio, impedisce l'effettiva eliminazione della risorsa fino al termine della "pulizia" di tutte le risorse associate al bilanciatore.
API Machinery
Questa "pietra miliare di stabilizzazione" è stata registrata nell'area del server API di Kubernetes e della sua interazione. Gran parte di ciò è avvenuto grazie alla conversione in stato stabile di risorse che non necessitano di una particolare presentazione (CRD), che avevano lo stato di beta da quando Kubernetes 1.7 (giugno 2017!). La stessa stabilizzazione è arrivata anche alle funzionalità correlate:
- e
/statuse/scaleper CustomResources; - versioni per CRD, basate su un webhook esterno;
- (in K8s 1.15) valori predefiniti (defaulting) e la rimozione automatica dei campi (potatura) per CustomResources;
- l'adozione dello schema OpenAPI v3 per la creazione e pubblicazione della documentazione OpenAPI, utilizzata per la convalida delle risorse CRD lato server.
Un altro meccanismo, ormai familiare per gli amministratori di Kubernetes: è rimasto per lungo tempo in stato beta (dalla versione K8s 1.9) ed è ora dichiarato stabile.
Due altre funzionalità hanno raggiunto la versione beta: e .
E l'unica novità significativa nell'alpha è stata da SelfLink è un URI speciale che rappresenta l'oggetto specificato ed è parte di ObjectMeta e ListMeta (cioè parte di qualsiasi oggetto in Kubernetes). Perché se ne fa a meno? La motivazione 'in modo semplice' come l'assenza di vere (insormontabili) ragioni affinché questo campo continui a esistere. Motivi più formali includono l'ottimizzazione delle prestazioni (rimuovendo un campo non necessario) e semplificare il lavoro del generic-apiserver, che è costretto a gestire tale campo in modo speciale (è l'unico campo impostato proprio prima della serializzazione dell'oggetto). Il vero 'deprecamento' (nella versione beta) SelfLink avverrà con la versione Kubernetes 1.20, e definitivo — 1.21.
Archiviazione dei dati
Il lavoro principale nel settore dello storage, come nelle versioni precedenti, si osserva nell'ambito . Le principali novità sono state:
- per la prima volta (nella versione alpha) supporto ai plugin CSI per i nodi di lavoro con Windows: il modo attuale di operare con gli archivi sostituirà i plugin in-tree nel kernel di Kubernetes e i plugin FlexVolume di Microsoft basati su Powershell;

Schema di implementazione dei plugin CSI in Kubernetes per Windows - possibilità , presentato già in K8s 1.12, è arrivato alla versione beta;
- un analogo 'passaggio' (da alpha a beta) è stato raggiunto dalla possibilità di utilizzare CSI per creare volumi effimeri locali ().
Introdotta nella versione precedente di Kubernetes (utilizzando PVC esistenti come DataSource per creare nuovi PVC) ha ora ricevuto anche lo stato di versione beta.
Pianificatore
Due importanti cambiamenti nella pianificazione (entrambi in versione alpha):
- — la possibilità di utilizzare i pod al posto delle unità logiche dell'app per una 'distribuzione giusta' dei carichi (come Deployment e ReplicaSet) e le regolazioni di questa distribuzione (come requisiti rigidi o condizioni flessibili, ovvero priorità). La funzionalità amplierà le attuali capacità di distribuzione dei pod pianificati, attualmente limitate dalle opzioni
PodAffinityePodAntiAffinity, fornendo agli amministratori un controllo più fine su questo aspetto, il che significa una maggiore alta disponibilità e un consumo ottimizzato delle risorse. Maggiori dettagli sono disponibili in . - L'utilizzo di BestFit Policy in RequestedToCapacityRatio Priority Function durante la pianificazione dei pod, il che consentirà applicare («imballaggio in contenitori») sia per le risorse principali (CPU, memoria) che per quelle avanzate (come GPU). Maggiori informazioni sono disponibili in .

Pianificazione dei pod: prima dell'uso della best fit policy (direttamente attraverso il programmatore predefinito) e con il suo utilizzo (attraverso il programmatore extender)
Inoltre, la possibilità di creare i propri plugin per il programmatore al di fuori del principale albero di sviluppo di Kubernetes (out-of-tree).
Altre modifiche
Inoltre, nella versione Kubernetes 1.16, è possibile notare l'iniziativa per le metriche esistenti, per essere più precisi — in conformità con per l'instradamento di K8s. Si basano fondamentalmente sulla corrispondente . Le discrepanze sono emerse per vari motivi (ad esempio, alcune metriche sono state semplicemente create prima che le attuali istruzioni fossero disponibili), e gli sviluppatori hanno deciso che era giunto il momento di portare tutto a uno standard uniforme, "in linea con il resto dell'ecosistema Prometheus". L'attuale implementazione di questa iniziativa è in fase alfa, che verrà progressivamente elevata nelle versioni future di Kubernetes alla beta (1.17) e stabile (1.18).
Inoltre, si possono notare i seguenti cambiamenti:
- Sviluppo del supporto per Windows con utilità Kubeadm per questo SO (versione alfa),
RunAsUserNameper i contenitori Windows (versione alfa), del supporto per Group Managed Service Account (gMSA) fino alla versione beta, mount/attach per i volumi vSphere. - di compressione dei dati nelle risposte API. In precedenza, per questi scopi veniva utilizzato un filtro HTTP, che imponeva alcune limitazioni, impedendone l'attivazione di default. Ora funziona "compressione trasparente delle richieste": i client che inviano
Accept-Encoding: gzipnell'intestazione, ottengono una risposta compressa in GZIP se la sua dimensione supera 128 KB. I clienti su Go supportano automaticamente la compressione (inviando l'intestazione necessaria), quindi noteranno immediatamente una riduzione del traffico. (Per altre lingue potrebbero essere necessarie piccole modifiche.) - scalare HPA da/a zero pod in base a metriche esterne. Se la scalabilità avviene sulla base di oggetti/metriche esterne, quando i carichi di lavoro sono inattivi, è possibile scalare automaticamente a 0 repliche per risparmiare risorse. Questa funzione risulta particolarmente utile nei casi in cui i worker richiedono risorse GPU e il numero di diversi tipi di worker inattivi supera la quantità disponibile di GPU.
- Nuovo client — — per l'accesso 'generalizzato' agli oggetti. È progettato per ottenere facilmente metadati (cioè elementi
metadata) dalle risorse del cluster e svolgere operazioni come raccolta rifiuti e quotazione. - Raccogliere Kubernetes senza provider cloud obsoleti ('integrati' in tree) (versione alfa).
- Nell'utility kubeadm la possibilità sperimentale (versione alpha) di applicare patch kustomize durante le operazioni
init,joineaggiornamento. Maggiori informazioni su come utilizzare il flag--experimental-kustomize, consultare . - Il nuovo endpoint per apiserver — , — che consente di esportare informazioni sulla sua prontezza (readiness). Inoltre, l'API server ha ora il flag
--maximum-startup-sequence-duration, che consente di regolare i suoi riavvii. - Due funzionalità per Azure sono state dichiarate stabili: supporto per (Availability Zones) e (RG). Inoltre, Azure ha aggiunto:
- AAD e ADFS;
-
service.beta.kubernetes.io/azure-pip-nameper specificare l'IP pubblico del bilanciatore di carico; - le impostazioni
LoadBalancerNameeLoadBalancerResourceGroup.
- AWS ha aggiunto per EBS in Windows e chiamate API EC2
DescribeInstances. - Kubeadm ora migra autonomamente конфигурацию CoreDNS при обновлении версии CoreDNS.
- I binari etcd nella corrispondente immagine Docker world-executable, il che consente di eseguire questa immagine senza necessità di privilegi di root. Inoltre, l'immagine di migrazione etcd supporta la versione etcd2.
- In abbiamo adottato l'uso di immagini distroless come base, migliorato le prestazioni e aggiunto nuovi fornitori di cloud (DigitalOcean, Magnum, Packet).
- Aggiornamenti nel software utilizzato / dipendente: Go 1.12.9, etcd 3.3.15, CoreDNS 1.6.2.
P.S.
Leggete anche nel nostro blog:
- «»;
- «»;
- «»;
- «».
Fonte: habr.com


