PerfectScale
Kubernetes v1.37 (Garhwal): tutte le novità e i miglioramenti
Kubernetes v1.37 "Garhwal" introduce il resize in-place GA per i sidecar, lo scale-to-zero dell'HPA, Memory QoS e il gang scheduling. Scopri le novità Stable, Beta e Alpha.
Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.
TL;DR
Kubernetes v1.37 ("Garhwal") introduce 67 miglioramenti: 16 Stable, 23 Beta, 27 Alpha e 1 rimozione. Le novità principali sono il resize in-place per i container init e sidecar (GA), la tolleranza configurabile per l'HPA (GA), le node declared features (GA), lo scale-to-zero per l'HorizontalPodAutoscaler (Beta), Memory QoS (Beta), i resource manager a livello di Pod (Beta), il gang scheduling tramite la nuova Workload API (Beta) e la modalità rootless per il Kubelet (Beta). Tra le novità Alpha figurano una Eviction Request API cooperativa e il checkpoint/restore a livello di Pod, oltre ai continui progressi sulla Dynamic Resource Allocation (DRA). Azione richiesta: in questa release il labeling dei mount SELinux cambia di default e può compromettere i workloads esistenti sui cluster con SELinux abilitato.
Kubernetes v1.37, noto anche come "Garhwal", porta con sé un solido insieme di novità per i team attenti a gestione delle risorse, autoscaling e scheduling. Questa release conta 67 miglioramenti: 16 sono ora Stable (GA), 23 sono ora Beta, 27 sono ora Alpha e 1 è una rimozione. Il nome deriva da Garhwal, una regione himalayana dell'Uttarakhand, in India. Il tema è quello di strati che si collegano e si sostengono a vicenda, dai campi terrazzati ai torrenti di montagna: una metafora perfetta per una release che continua a costruire sul lavoro delle versioni precedenti.
Queste sono alcune delle funzionalità di Kubernetes v1.37 che ci entusiasmano di più: il resize in-place per i container init e sidecar, lo scale to zero per l'HorizontalPodAutoscaler, Memory QoS e il gang scheduling nativo tramite la Workload API. Molte di queste rendono Kubernetes più efficace nell'usare bene le risorse, scalare in base alla domanda reale e posizionare workloads strettamente accoppiati.
Ecco le principali novità di Kubernetes v1.37:
Funzionalità Stable di Kubernetes v1.37
1. Resize in-place dei Pod per container init e sidecar
Feature Group: SIG Node | KEP: #1287
Il resize in-place dei Pod è diventato Stable (GA) in Kubernetes v1.35. Con la v1.37 questo supporto si estende ai container init e sidecar, e anche questa parte è ora GA.
Prima di questa modifica era possibile ridimensionare CPU e memoria di un container applicativo in esecuzione senza riavvio, ma i container init e sidecar restavano esclusi. Un container sidecar è un container init con restartPolicy: Always, quindi rimane in esecuzione per tutta la vita del Pod. Se un sidecar aveva bisogno di più CPU o memoria, l'unica vera opzione era ricreare il Pod. Questo significava downtime anche per l'app principale, anche se la modifica riguardava solo il sidecar.
Con la v1.37, il feature gate InPlacePodVerticalScalingInitContainers è GA. Puoi modificare le request o i limit di CPU e memoria di un container sidecar in esecuzione, e il kubelet aggiorna in place le impostazioni cgroup del container. Il Pod continua a girare. Con resizePolicy controlli il comportamento per ogni risorsa: NotRequired applica la modifica a caldo, RestartContainer riavvia solo quel container per applicarla. La v1.37 aggiunge inoltre due componenti Alpha alla stessa funzionalità: il resize in place dei volumi emptyDir basati su memoria (il gate InPlacePodVerticalScalingMemoryBackedVolumes) e la possibilità per lo scheduler di fare preemption dei Pod a priorità più bassa per fare spazio a un resize differito (il gate InPlacePodVerticalScalingSchedulerPreemption).
apiVersion: v1kind: Podmetadata: name: app-with-sidecarspec: initContainers: - name: log-shipper # sidecar image: log-shipper:1.0 restartPolicy: Always resizePolicy: - resourceName: cpu restartPolicy: NotRequired - resourceName: memory restartPolicy: RestartContainer resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi" containers: - name: app image: app:1.0 # ...Con questa configurazione puoi aumentare la CPU del sidecar senza alcun riavvio. L'aumento della memoria riavvia solo quel container, mai l'intero Pod.
2. Tolleranza configurabile per gli HorizontalPodAutoscaler
Feature Group: SIG Autoscaling | KEP: #4951
In Kubernetes v1.37, la tolleranza configurabile per l'HorizontalPodAutoscaler (HPA) è passata a General Availability (GA).
L'HPA modifica il numero di repliche dei Pod in base a metriche come CPU o memoria. Prima di questa funzionalità, l'HPA usava una tolleranza fissa del 10% per l'intero cluster: non interveniva finché l'utilizzo non si scostava di oltre il 10% dal target. Un valore unico non andava bene per tutti i workloads. I servizi sensibili potevano reagire troppo lentamente e, per cambiarlo, bisognava modificare un flag globale del controller che toccava ogni HPA del cluster.
Con la v1.37, il feature gate HPAConfigurableTolerance è GA. Puoi impostare la tolleranza per singolo HPA e per direzione di scaling nel campo behavior. Una tolleranza stretta in scale up permette a un servizio critico di reagire a piccoli aumenti di carico. Una tolleranza più ampia altrove mantiene stabili i workloads più tranquilli. Era Beta nella v1.35 ed è ora il comportamento standard.
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: web-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 behavior: scaleUp: tolerance: 0.05La tolleranza è un rapporto, non un numero di punti percentuali. Con 0.05 e un target del 60%, l'HPA scala verso l'alto quando l'utilizzo della CPU supera circa il 63% (60% per 1,05). Reagisce quindi prima di quanto consentisse la vecchia tolleranza fissa del 10%.
3. Node Declared Features
Feature Group: SIG Node | KEP: #5328
In Kubernetes v1.37, le node declared features sono passate a General Availability (GA).
Prima di questa funzionalità, Kubernetes assumeva che un nodo potesse gestire qualsiasi funzionalità supportata dal control plane, purché le versioni rientrassero nello skew supportato. Non è sempre vero. Quando una nuova funzionalità veniva attivata sul control plane, lo scheduler poteva comunque posizionare un Pod che la usava su un nodo più vecchio che non la supportava ancora. Il Pod falliva quindi a runtime o restava bloccato dopo lo scheduling, anche se il posizionamento sembrava corretto.
Con la v1.37, il feature gate NodeDeclaredFeatures è GA. Ogni nodo pubblica ora l'insieme delle funzionalità che riconosce nel campo status.declaredFeatures dell'oggetto Node. Lo scheduler e i controlli di admission lo usano per posizionare i Pod che usano determinate funzionalità solo sui nodi che le supportano. Un errore a runtime si trasforma così in una decisione di scheduling chiara, cosa che conta soprattutto durante gli upgrade, quando le versioni dei nodi sono miste. Le node declared features erano Alpha nella v1.35.
Funzionalità Beta di Kubernetes v1.37
4. Scale to zero per gli HorizontalPodAutoscaler
Feature Group: SIG Autoscaling | KEP: #2021
In Kubernetes v1.37, lo scale to zero per l'HorizontalPodAutoscaler è passato a Beta ed è attivo di default.
Prima di questa funzionalità, un HPA non poteva portare un workload a zero repliche: il minimo era una. Per un servizio che ha lavoro solo a tratti, come un consumer di code o un worker batch, significava pagare per tenere in esecuzione almeno un Pod anche quando non c'era nulla da fare.
Con la v1.37 puoi impostare spec.minReplicas: 0 su un HPA e lasciare che riduca il workload a zero quando è inattivo, per poi riportarlo su quando torna la domanda. Funziona per i workloads guidati da metriche Object o External, come la lunghezza di una coda. Non funziona per le metriche di CPU o memoria, perché quelle metriche arrivano dai Pod in esecuzione, e a zero non ce ne sono. Questo può ridurre i costi per consumer di code, job batch e workloads GPU che restano inattivi tra un'esecuzione e l'altra. Mentre l'HPA mantiene un workload a zero, registra una condizione ScaledToZero impostata a True, così puoi distinguere un workload scalato a zero da uno disattivato manualmente. Quando torna a scalare verso l'alto, la condizione diventa False con la reason NotScaledToZero.
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: worker-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: queue-worker minReplicas: 0 maxReplicas: 20 metrics: - type: External external: metric: name: queue_messages target: type: AverageValue averageValue: "30"Con questa configurazione, il workload scende a zero Pod quando la coda è vuota e l'HPA lo riporta su non appena arrivano nuovi messaggi.
5. Memory QoS
Feature Group: SIG Node | KEP: #2570
In Kubernetes v1.37, Memory QoS è passata a Beta.
Prima di questa funzionalità, il kubelet impostava un limite rigido di memoria per un container (cgroup memory.max), ma non dava al kernel segnali più graduali. Un container poteva usare memoria fino al limite e poi subire un OOM kill quasi senza preavviso. Non esisteva inoltre una protezione della memoria legata alla request del container, quindi sotto pressione di memoria il kernel poteva recuperare pagine da un container ancora entro la propria request.
Con la v1.37, il feature gate MemoryQoS è Beta. Usa i controlli di memoria di cgroup v2 per dare al kernel segnali migliori. Il kubelet imposta memory.min in base alla memory request del container, proteggendo dal reclaim quella quantità di memoria. Quando imposti memoryThrottlingFactor nella configurazione del kubelet, il kubelet imposta anche memory.high come soglia di throttling sotto il limite. Il kernel rallenta quindi il container e recupera pagine prima che raggiunga il limite rigido e subisca un OOM kill. Di default memoryThrottlingFactor non è impostato e memory.high resta disattivato se non lo configuri. È richiesto cgroup v2, che dalla v1.35 è comunque l'unica modalità supportata.
apiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationmemoryThrottlingFactor: 0.9Con questa impostazione, il kubelet imposta memory.high per i container al di sotto del loro limite di memoria, usando il fattore 0,9. Il kernel recupera memoria e applica throttling al container prima che raggiunga il limite rigido, rendendo meno probabili gli OOM kill sotto pressione.
6. Resource manager a livello di Pod
Feature Group: SIG Node | KEP: #5526
In Kubernetes v1.37, i resource manager a livello di Pod sono passati a Beta.
Kubernetes v1.34 ha aggiunto le risorse a livello di Pod (KEP #2837), che permettono di impostare request e limit di CPU e memoria per l'intero Pod invece che solo per singolo container. Ma i resource manager del kubelet non comprendevano ancora quei valori a livello di Pod. Prima di questa funzionalità, il CPU Manager, il Memory Manager e il Topology Manager guardavano solo le request per container. Un Pod che impostava le risorse a livello di Pod poteva perdere il pinning esclusivo delle CPU o l'allineamento NUMA.
Con la v1.37, il feature gate PodLevelResourceManagers è Beta. Nella v1.37 è disattivato di default: era stato attivato, poi disattivato di nuovo verso la fine del ciclo di release dopo che il team ha individuato problemi critici, quindi va abilitato manualmente se vuoi usarlo. Quando è attivo, il CPU Manager (policy static), il Memory Manager e il Topology Manager tengono conto delle risorse a livello di Pod quando assegnano CPU, memoria e località hardware. Questo aiuta i workloads sensibili alla latenza e di fascia alta che impostano le risorse a livello di Pod, che così ottengono comunque core esclusivi e memoria allineata a NUMA.
apiVersion: v1kind: Podmetadata: name: guaranteed-podspec: resources: # pod-level resources requests: cpu: "2" memory: "4Gi" limits: cpu: "2" memory: "4Gi" containers: - name: app image: app:1.0 # containers can set their own resources, or use the pod-level onesCon questa configurazione, il Pod è Guaranteed a livello di Pod e i manager del kubelet possono riservargli intere CPU e allineare la memoria, anche quando il container non imposta le proprie request.
7. Gang scheduling con la Workload API
Feature Group: SIG Scheduling | KEP: #4671
In Kubernetes v1.37, il gang scheduling nativo tramite la Workload API è passato a Beta.
Prima di questa funzionalità, Kubernetes schedulava i Pod uno alla volta. Per un job strettamente accoppiato, come un training distribuito in cui tutti i worker devono partire insieme, questo causava scheduling parziali: alcuni Pod partivano mentre altri restavano pending, occupando risorse senza concludere nulla. I team dovevano aggiungere uno scheduler esterno per ottenere un comportamento all-or-nothing (gang). Kubernetes v1.35 ha introdotto il gang scheduling nativo come Alpha tramite una nuova Workload API.
Con la v1.37, l'API è ora scheduling.k8s.io/v1beta1. Si attiva con il feature gate GenericWorkload. Nella v1.37, i vecchi gate GangScheduling e WorkloadAwarePreemption sono stati fusi in GenericWorkload, quindi un unico gate copre ora sia il gang scheduling sia la preemption workload-aware. Il modello ha tre parti. Un Workload contiene uno o più podGroupTemplates, ognuno con una policy di scheduling come gang e un minCount. Un PodGroup viene creato da un template e traccia un singolo gruppo in esecuzione. Ogni Pod punta al proprio gruppo con schedulingGroup.podGroupName. Lo scheduler trattiene i Pod finché almeno minCount di essi non possono girare insieme, e a quel punto li posiziona. Se non riesce a soddisfare minCount, nessuno viene assegnato e i Pod attendono finché non c'è spazio. Il campo minCount resta modificabile dopo la creazione, il che aiuta i job elastici a scalare in su o in giù.
Il Workload definisce il template:
apiVersion: scheduling.k8s.io/v1beta1kind: Workloadmetadata: name: training-jobspec: podGroupTemplates: - name: workers schedulingPolicy: gang: minCount: 4Un PodGroup viene creato da quel template:
apiVersion: scheduling.k8s.io/v1beta1kind: PodGroupmetadata: name: training-job-workers-0spec: workloadRef: workloadName: training-job templateName: workers schedulingPolicy: gang: minCount: 4Ogni Pod entra nel gruppo tramite il nome:
apiVersion: v1kind: Podmetadata: name: worker-0spec: schedulingGroup: podGroupName: training-job-workers-0 containers: - name: trainer image: trainer:1.0 # ...Con questa configurazione, Kubernetes schedula i worker solo quando almeno quattro di essi possono girare insieme. Se il cluster non ha spazio per quattro, non ne parte nessuno.
8. Kubelet in user namespace (modalità rootless)
Feature Group: SIG Node | KEP: #2033
In Kubernetes v1.37, l'esecuzione del kubelet in uno user namespace, detta anche modalità Rootless, è passata a Beta.
Prima di questa funzionalità, i componenti del nodo come il kubelet giravano come root sull'host. Se il kubelet veniva compromesso, un attaccante poteva ottenere i privilegi di root sull'intero nodo.
Con la v1.37, il feature gate KubeletInUserNamespace è Beta. Esegue il kubelet e gli altri componenti del nodo dentro uno user namespace Linux. All'interno del namespace continuano ad apparire come root, ma sull'host sono mappati su un utente non privilegiato. Questo aggiunge un livello di isolamento senza cambiare l'uso quotidiano del kubelet. Questa funzionalità era in sviluppo dalla v1.22, quindi il passaggio a Beta è un traguardo importante.
Funzionalità Alpha di Kubernetes v1.37
9. Eviction Request API
Feature Group: SIG Node | KEP: #4563
Prima di questa funzionalità, il drain di un nodo per manutenzione era un'azione lato client. Uno strumento come kubectl drain sottoponeva a eviction i Pod uno per uno rispettando i PodDisruptionBudget, ma l'intento risiedeva nel client, non nel cluster. Controller e applicazioni non potevano vedere che un nodo era in fase di drain, coordinare un passaggio di consegne sicuro o partecipare alla decisione. Un'app stateful poteva subire eviction nel momento sbagliato perché nulla la informava della manutenzione imminente.
Con la v1.37, una funzionalità Alpha aggiunge l'API EvictionRequest, così l'eviction può essere cooperativa invece di una cancellazione forzata. Un richiedente crea un EvictionRequest per un Pod e i componenti registrati tramite il nuovo campo spec.evictionResponders del Pod gestiscono un passaggio di consegne graceful. La v1.37 aggiunge anche nuove condizioni del ciclo di vita del Node (MaintenancePlanned, MaintenanceInProgress, GracefulNodeShutdownInProgress, DrainInProgress e Drained) che i controller possono osservare per capire a che punto del flusso di manutenzione si trova un nodo. Insieme, questi elementi permettono a un'applicazione o a un operator di gestire il drain alle proprie condizioni, ad esempio spostando un leader o svuotando lo stato prima che il suo Pod venga rimosso.
10. Checkpoint e restore a livello di Pod
Feature Group: SIG Node | KEP: #5823
Prima di questa funzionalità, Kubernetes poteva fare il checkpoint di un singolo container (KEP #2008), principalmente per analisi forensi. Si poteva catturare lo stato di un singolo container, ma non di un intero Pod in una volta sola, quindi un Pod multi-container non poteva essere acquisito come singola unità.
Con la v1.37, una funzionalità Alpha aggiunge checkpoint e restore a livello di Pod. Estende la Container Runtime Interface (CRI) con le chiamate CheckpointPod e RestorePod, così il kubelet e un runtime compatibile possono fare lo snapshot di tutti i container di un Pod insieme e poi ripristinarli. È utile già oggi per il lavoro forense e getta le basi per usi futuri, come lo spostamento di un Pod in esecuzione tra nodi. La funzionalità richiede un container runtime che supporti le nuove chiamate CRI.
Dynamic Resource Allocation (DRA) - Lavori in corso
Feature Group: SIG Node / SIG Scheduling
La Dynamic Resource Allocation (DRA) è il modo nativo con cui Kubernetes richiede e condivide hardware speciale come GPU e altri device, con lo scheduler consapevole di cosa è allocato. Il core di DRA ha raggiunto la GA nella v1.34. Nella v1.37 diverse funzionalità DRA fanno passi avanti.
Device Taints and Tolerations (ora GA): i device taint permettono a un singolo device, e non all'intero nodo, di segnalare che va evitato, e le claim aggiungono toleration per accettarlo. È passato a GA nella v1.37 ed è disponibile nell'API resource.k8s.io/v1. Consente di isolare o marcare una singola GPU difettosa senza mettere fuori servizio l'intero nodo.
DRA Extended Resource (ora GA): permette di richiedere device gestiti da DRA usando il familiare stile extended-resource nelle request di un Pod, mentre DRA gestisce l'allocazione dietro le quinte. È passato a GA nella v1.37.
ResourceClaim Device Status (ora GA): lo stato di un device richiesto tramite claim, come i dettagli di rete riportati da un driver, è ora GA. Gli strumenti possono leggere lo stato dei device in modo standard.
Workload Resource Claims (ora Beta): le resource claim possono ora essere legate a un Workload, la stessa Workload API usata per il gang scheduling, così un gruppo di Pod può condividere le claim sui device. È Beta nella v1.37, con il gate DRAWorkloadResourceClaims disattivato di default.
DRA Node Allocatable Resources (Alpha, da tenere d'occhio per la gestione delle risorse): questo lavoro Alpha consente a DRA di modellare come device le risorse del nodo, come CPU, memoria e hugepages. Quando è attivo, il kubelet tiene conto delle risorse allocate tramite DRA quando imposta i cgroup di Pod e container, gli OOM score e le soglie di Memory QoS. Anche request e limit standard possono essere ridimensionati in place per i Pod che usano claim DRA. È un lavoro ancora agli inizi, ma indica un futuro in cui DRA potrà gestire le risorse core, non solo i device aggiuntivi.
Deprecazioni / Rimozioni
Il mount SELinux diventa il default (azione richiesta): il feature gate SELinuxMount è GA e attivo di default nella v1.37. Sui cluster con SELinux abilitato cambia il modo in cui i volumi vengono etichettati e può compromettere alcuni workloads esistenti. Se usi SELinux, leggi il post del blog Kubernetes sui cambiamenti nel labeling dei volumi SELinux prima dell'upgrade, così da individuare e correggere i workloads interessati o fare prima l'opt-out. I cluster senza SELinux non sono interessati.
La modalità IPVS di kube-proxy è deprecata: la modalità IPVS per kube-proxy è deprecata dalla v1.35. Nella v1.37, kubeadm aggiunge un warning quando viene usata. Sui kernel Linux più recenti la modalità consigliata è nftables, GA dalla v1.33. Sui kernel più vecchi, iptables resta il default ed è ancora supportato.
L'API scheduling.k8s.io/v1alpha2 è stata rimossa: la versione scheduling.k8s.io/v1alpha2 è stata eliminata nella v1.37. I tipi alpha più recenti sono passati a v1alpha3 e i tipi core Workload e PodGroup sono ora v1beta1. Se hai usato la precedente API di scheduling workload-aware, rimuovi tutti gli oggetti v1alpha2 dall'API server prima dell'upgrade.
I flag e le metriche legacy di cAdvisor sono stati rimossi: il cAdvisor integrato nel kubelet è passato a una build più snella. Diversi flag di cAdvisor deprecati da tempo non sono più accettati e il kubelet non si avvia se ne è impostato qualcuno (viene mantenuto solo --housekeeping-interval). Alcune vecchie serie di metriche di cAdvisor, come container_tasks_state e container_cpu_load_average_10s, non vengono più esportate. Controlla i flag del kubelet ed eventuali dashboard che usavano quelle serie.
Altre rimozioni e note: il feature gate AnyVolumeDataSource, bloccato in stato attivo dalla v1.33, è stato rimosso. Kubernetes ha inoltre rinviato dalla v1.37 alla v1.38 la rimozione di alcuni flag deprecati di configurazione del container runtime del kubelet, per allinearsi al supporto di containerd v1.7. Se usi ancora una versione più vecchia di containerd, pianifica l'upgrade.
Kubernetes v1.37 porta in totale 67 miglioramenti. Oltre alle novità trattate qui, la release include altro lavoro su autoscaling, storage, sicurezza e osservabilità, come la Metrics API (metrics.k8s.io) che raggiunge la v1, il completamento del lavoro sull'inizializzazione della watch cache (il gate rimanente WatchCacheInitializationPostStartHook ha raggiunto lo stato Stable) e il controllo di admission basato su manifest che passa a Beta. Ti invitiamo a leggere le note di rilascio della v1.37 di Kubernetes e a consultare il changelog per l'elenco completo.
Mantieni i tuoi workloads in salute con PerfectScale by DoiT
Kubernetes v1.37 ti dà strumenti migliori per gestire le risorse. Puoi ridimensionare i sidecar senza riavvii, impostare una tolleranza HPA per singolo workload, scalare a zero i workloads inattivi e proteggere la memoria con Memory QoS. Ma questi strumenti ripagano solo se scegli i numeri giusti. Imposta request e limit troppo bassi e otterrai OOM kill, throttling della CPU ed eviction. Impostali troppo alti e pagherai per capacità che non usi mai. Farlo a mano, per ogni workload, in un cluster che cambia di continuo, è difficile da sostenere.
PerfectScale by DoiT è una piattaforma di governance per Kubernetes che se ne occupa al posto tuo. Monitora i tuoi workloads alla ricerca di rischi legati alle risorse, come OOM kill, throttling della CPU ed eviction, e li trasforma in raccomandazioni di right-sizing concrete e automatizzate, applicabili manualmente o in modo autonomo. Così ottieni i risparmi di funzionalità come lo scale to zero e il resize in-place, senza compromettere i tuoi SLO. Team come Paramount Pictures e Creditas usano PerfectScale per mantenere i loro cluster al tempo stesso economici e affidabili.
Registrati o prenota una demo tecnica per scoprire dove il tuo cluster sta sprecando denaro o è esposto a rischi.
FAQ
Perché Kubernetes v1.37 si chiama "Garhwal"?
Il nome della release deriva da Garhwal, una regione himalayana dell'Uttarakhand, in India. Il tema è quello di strati che si collegano e si sostengono a vicenda, dai campi terrazzati ai torrenti di montagna, in linea con una release che continua a costruire sul lavoro delle versioni precedenti.
Quanti miglioramenti contiene Kubernetes v1.37?
67 in totale: 16 sono ora Stable (GA), 23 sono ora Beta, 27 sono ora Alpha e 1 è una rimozione.
Quali sono le principali novità di Kubernetes v1.37?
Le novità di maggior rilievo sono il resize in-place per i container init e sidecar (GA), la tolleranza HPA configurabile (GA), le node declared features (GA), lo scale-to-zero per l'HorizontalPodAutoscaler (Beta), Memory QoS (Beta), i resource manager a livello di Pod (Beta) e il gang scheduling nativo tramite la Workload API (Beta).
Posso scalare un Deployment a zero repliche con l'HorizontalPodAutoscaler?
Sì. Lo scale to zero per l'HPA è Beta e attivo di default nella v1.37. Imposta spec.minReplicas: 0: funziona per i workloads guidati da metriche Object o External, come la lunghezza di una coda. Non funziona per le metriche di CPU o memoria, perché provengono dai Pod in esecuzione e a zero non ce ne sono.
Posso ridimensionare un container sidecar senza riavviare l'intero Pod?
Sì. Il feature gate InPlacePodVerticalScalingInitContainers è GA nella v1.37 ed estende il resize in-place (già GA per i container applicativi dalla v1.35) ai container init e sidecar. Se una modifica viene applicata a caldo o riavvia solo quel container dipende dalla resizePolicy impostata per ciascuna risorsa.
Cos'è Memory QoS in Kubernetes v1.37?
Memory QoS, ora Beta, usa i controlli di cgroup v2 (memory.min e memory.high) per proteggere dal reclaim la memoria richiesta da un container e applicargli throttling prima che raggiunga il limite rigido, rendendo meno probabili gli OOM kill sotto pressione.
Cosa viene deprecato o rimosso in Kubernetes v1.37?
Il mount SELinux diventa il default GA e può cambiare il labeling dei volumi sui cluster con SELinux abilitato (azione richiesta prima dell'upgrade). La modalità IPVS di kube-proxy è deprecata in favore di nftables. L'API scheduling.k8s.io/v1alpha2 e i flag/metriche legacy di cAdvisor sono stati rimossi.
Come funziona il gang scheduling nella nuova Workload API?
Un Workload definisce uno o più podGroupTemplates con una policy di scheduling (come gang) e un minCount. I Pod entrano in un PodGroup creato da quel template e lo scheduler li posiziona solo quando almeno minCount Pod possono girare insieme — utile per job strettamente accoppiati come il training distribuito.