PerfectScalePerfectScale

PerfectScale

Kubernetes v1.37 (Garhwal): novidades e melhorias

O Kubernetes v1.37 "Garhwal" traz redimensionamento in-place GA para sidecars, scale-to-zero no HPA, Memory QoS e gang scheduling. Veja o que é Stable, Beta e Alpha.

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Tania Duggal
By Tania Duggal
Aug 31, 202620 min read

TL;DR

O Kubernetes v1.37 ("Garhwal") traz 67 melhorias: 16 Stable, 23 Beta, 27 Alpha e 1 remoção. As mudanças de destaque são o redimensionamento in-place para containers init e sidecar (GA), tolerância configurável do HPA (GA), node declared features (GA), scale-to-zero para o HorizontalPodAutoscaler (Beta), Memory QoS (Beta), gerenciadores de recursos em nível de Pod (Beta), gang scheduling via nova Workload API (Beta) e modo rootless do Kubelet (Beta). O trabalho em Alpha inclui uma Eviction Request API cooperativa e checkpoint/restore em nível de Pod, além do progresso contínuo na Dynamic Resource Allocation (DRA). Ponto de atenção: a rotulagem de montagem do SELinux muda por padrão nesta versão e pode quebrar workloads existentes em clusters com SELinux habilitado.

O Kubernetes v1.37, também conhecido como "Garhwal", traz um conjunto robusto de mudanças para equipes que se preocupam com gerenciamento de recursos, autoscaling e agendamento. Esta versão tem 67 melhorias. 16 delas agora são Stable (GA), 23 agora são Beta, 27 agora são Alpha e 1 é uma remoção. O nome vem de Garhwal, uma região do Himalaia em Uttarakhand, na Índia. O tema fala de camadas que se conectam e se apoiam, dos campos em terraços aos riachos de montanha, o que combina com uma versão que continua construindo sobre o trabalho das anteriores.

Estes são alguns dos recursos que mais nos empolgam no Kubernetes v1.37: redimensionamento in-place para containers init e sidecar, scale to zero para o HorizontalPodAutoscaler, Memory QoS e gang scheduling nativo por meio da Workload API. Muitos deles tornam o Kubernetes melhor em usar bem os recursos, escalar com base na demanda real e posicionar workloads fortemente acoplados.

Estas são as principais mudanças do Kubernetes v1.37:

Recursos Stable do Kubernetes v1.37

1. Redimensionamento in-place de Pods para containers init e sidecar

Grupo do recurso: SIG Node | KEP: #1287

O redimensionamento in-place de Pods se tornou Stable (GA) no Kubernetes v1.35. No v1.37, esse suporte se estende a containers init e sidecar, e essa parte agora também é GA.

Antes dessa mudança, você podia redimensionar a CPU e a memória de um container de aplicação em execução sem reiniciá-lo, mas containers init e sidecar ficavam de fora. Um container sidecar é um container init com restartPolicy: Always, ou seja, ele roda durante toda a vida do Pod. Se um sidecar precisasse de mais CPU ou memória, sua única opção real era recriar o Pod. Isso significava downtime também para a aplicação principal, mesmo que só o sidecar precisasse da mudança.

Com o v1.37, o feature gate InPlacePodVerticalScalingInitContainers é GA. Você pode alterar as requests ou limits de CPU e memória de um container sidecar em execução, e o kubelet atualiza as configurações de cgroup do container in place. O Pod continua rodando. Você controla o que acontece por recurso com resizePolicy. NotRequired significa aplicar a mudança ao vivo, e RestartContainer significa reiniciar apenas aquele container para aplicá-la. O v1.37 também adiciona duas partes Alpha ao mesmo recurso: redimensionar in place volumes emptyDir baseados em memória (o gate InPlacePodVerticalScalingMemoryBackedVolumes) e permitir que o scheduler faça preempção de Pods de menor prioridade para abrir espaço para um redimensionamento adiado (o gate InPlacePodVerticalScalingSchedulerPreemption).

apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
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
# ...

Com essa configuração, você pode aumentar a CPU do sidecar sem nenhum reinício. Aumentar a memória reinicia apenas aquele container, nunca o Pod inteiro.

2. Tolerância configurável para HorizontalPodAutoscalers

Grupo do recurso: SIG Autoscaling | KEP: #4951

No Kubernetes v1.37, a tolerância configurável para o HorizontalPodAutoscaler (HPA) chegou à disponibilidade geral (GA).

O HPA altera o número de réplicas de Pods com base em métricas como CPU ou memória. Antes desse recurso, o HPA usava uma tolerância fixa de 10% em todo o cluster. Ele só agia quando o uso se afastava mais de 10% do alvo. Esse valor único não servia para todos os workloads. Serviços sensíveis podiam reagir devagar demais, e, para mudá-lo, era preciso editar uma flag global do controller que afetava todos os HPAs do cluster.

Com o v1.37, o feature gate HPAConfigurableTolerance é GA. Você pode definir a tolerância por HPA e por direção de escalonamento no campo behavior. Uma tolerância mais rígida no scale up permite que um serviço crítico reaja a pequenos aumentos de carga. Uma tolerância mais folgada em outros pontos mantém estáveis os workloads menos movimentados. Isso era Beta no v1.35 e agora é o comportamento padrão.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
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.05

A tolerância é uma proporção, não pontos percentuais. Com 0.05 e um alvo de 60%, o HPA faz scale up quando o uso de CPU passa de cerca de 63% (60% vezes 1,05). Isso reage mais cedo do que a antiga tolerância fixa de 10% permitiria.

3. Node Declared Features

Grupo do recurso: SIG Node | KEP: #5328

No Kubernetes v1.37, o recurso node declared features chegou à disponibilidade geral (GA).

Antes desse recurso, o Kubernetes assumia que um nó podia lidar com qualquer recurso suportado pelo control plane, desde que as versões estivessem dentro do skew suportado. Isso nem sempre é verdade. Quando um novo recurso era ativado no control plane, o scheduler ainda podia colocar um Pod que o usava em um nó mais antigo que ainda não o suportava. O Pod então falhava em tempo de execução ou ficava travado depois do agendamento, mesmo que o posicionamento parecesse correto.

Com o v1.37, o feature gate NodeDeclaredFeatures é GA. Cada nó agora publica o conjunto de recursos que entende em um campo status.declaredFeatures no objeto Node. O scheduler e as verificações de admissão usam essa informação para colocar os Pods que usam esses recursos apenas em nós que os suportam. Isso transforma uma falha em tempo de execução em uma decisão de agendamento clara, o que importa principalmente durante upgrades, quando as versões dos nós estão misturadas. Node declared features era Alpha no v1.35.

Recursos Beta do Kubernetes v1.37

4. Scale to Zero para HorizontalPodAutoscalers

Grupo do recurso: SIG Autoscaling | KEP: #2021

No Kubernetes v1.37, o scale to zero para o HorizontalPodAutoscaler chegou a Beta e vem ativado por padrão.

Antes desse recurso, um HPA não conseguia reduzir um workload a zero réplicas. O mínimo era uma. Para um serviço que só tem trabalho parte do tempo, como um consumidor de fila ou um worker de batch, isso significava pagar para manter pelo menos um Pod rodando mesmo quando não havia nada a fazer.

Com o v1.37, você pode definir spec.minReplicas: 0 em um HPA e deixá-lo reduzir o workload a zero quando estiver ocioso, trazendo-o de volta quando a demanda retornar. Isso funciona para workloads baseados em métricas Object ou External, como o tamanho de uma fila. Não funciona para métricas de CPU ou memória, porque essas métricas vêm de Pods em execução, e não há nenhum quando está em zero. Isso pode cortar custos de consumidores de fila, jobs de batch e workloads de GPU que ficam ociosos entre execuções. Enquanto o HPA mantém um workload em zero, ele registra uma condição ScaledToZero definida como True, para você diferenciar um workload que ele reduziu a zero de um que foi desligado manualmente. Quando volta a escalar, a condição se torna False com o motivo NotScaledToZero.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: worker-hpa
spec:
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"

Com essa configuração, o workload cai para zero Pods quando a fila está vazia, e o HPA o escala de volta assim que as mensagens chegam.

5. Memory QoS

Grupo do recurso: SIG Node | KEP: #2570

No Kubernetes v1.37, o Memory QoS chegou a Beta.

Antes desse recurso, o kubelet definia um limite rígido de memória para um container (cgroup memory.max), mas não dava ao kernel nenhum sinal mais suave. Um container podia usar memória até o limite e então sofrer um OOM kill quase sem aviso. Também não havia proteção de memória ligada à request de um container, então, sob pressão de memória, o kernel podia recuperar páginas de um container que ainda estava dentro da sua request.

Com o v1.37, o feature gate MemoryQoS é Beta. Ele usa os controles de memória do cgroup v2 para dar sinais melhores ao kernel. O kubelet define memory.min a partir da request de memória do container, o que protege essa quantidade de memória contra reclaim. Quando você define memoryThrottlingFactor na configuração do kubelet, o kubelet também define memory.high como um ponto de throttling abaixo do limite. O kernel então desacelera o container e recupera páginas antes que ele atinja o limite rígido e sofra um OOM kill. Por padrão, memoryThrottlingFactor não é definido, e memory.high fica desativado a menos que você o configure. O cgroup v2 é obrigatório, e já é o único modo suportado desde o v1.35.

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9

Com essa configuração, o kubelet define memory.high para os containers abaixo do limite de memória, usando o fator de 0,9. O kernel recupera memória e faz throttling do container antes que ele atinja o limite rígido, o que torna os OOM kills menos prováveis sob pressão.

6. Gerenciadores de recursos em nível de Pod

Grupo do recurso: SIG Node | KEP: #5526

No Kubernetes v1.37, os gerenciadores de recursos em nível de Pod chegaram a Beta.

O Kubernetes v1.34 adicionou recursos em nível de Pod (KEP #2837), que permitem definir requests e limits de CPU e memória para o Pod inteiro, e não só por container. Mas os gerenciadores de recursos do kubelet ainda não entendiam esses valores em nível de Pod. Antes desse recurso, o CPU Manager, o Memory Manager e o Topology Manager só olhavam para as requests por container. Um Pod que definisse recursos em nível de Pod podia ficar sem pinning exclusivo de CPU ou alinhamento NUMA.

Com o v1.37, o feature gate PodLevelResourceManagers é Beta. Ele vem desativado por padrão no v1.37: foi ativado e depois desativado de novo no fim do ciclo de release, após a equipe encontrar problemas críticos, então você mesmo o habilita se quiser usá-lo. Quando está ativo, o CPU Manager (política estática), o Memory Manager e o Topology Manager levam em conta os recursos em nível de Pod ao atribuir CPUs, memória e localidade de hardware. Isso ajuda workloads sensíveis a latência e de alto desempenho que definem recursos em nível de Pod, para que continuem recebendo núcleos exclusivos e memória alinhada por NUMA.

apiVersion: v1
kind: Pod
metadata:
name: guaranteed-pod
spec:
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 ones

Com essa configuração, o Pod é Guaranteed em nível de Pod, e os gerenciadores do kubelet podem fazer pinning de CPUs inteiras e alinhar a memória para ele, mesmo quando o container não define suas próprias requests.

7. Gang Scheduling com a Workload API

Grupo do recurso: SIG Scheduling | KEP: #4671

No Kubernetes v1.37, o gang scheduling nativo por meio da Workload API chegou a Beta.

Antes desse recurso, o Kubernetes agendava Pods um de cada vez. Para um job fortemente acoplado, como uma execução de treinamento distribuído em que todos os workers precisam começar juntos, isso causava agendamento parcial. Alguns Pods iniciavam enquanto outros ficavam pendentes, segurando recursos sem produzir nada. As equipes precisavam adicionar um scheduler externo para obter o comportamento de tudo ou nada (gang). O Kubernetes v1.35 introduziu o gang scheduling nativo como Alpha por meio de uma nova Workload API.

Com o v1.37, a API agora é scheduling.k8s.io/v1beta1. Você a ativa com o feature gate GenericWorkload. No v1.37, os gates mais antigos GangScheduling e WorkloadAwarePreemption foram fundidos em GenericWorkload, então um único gate agora cobre tanto o gang scheduling quanto a preempção workload-aware. O modelo tem três partes. Um Workload contém um ou mais podGroupTemplates, cada um com uma política de agendamento como gang e um minCount. Um PodGroup é criado a partir de um template e acompanha um grupo em execução. Cada Pod aponta para o seu grupo com schedulingGroup.podGroupName. O scheduler segura os Pods até que pelo menos minCount deles possam rodar juntos e então os posiciona. Se não conseguir atingir o minCount, nenhum é vinculado, e os Pods esperam até haver espaço. O campo minCount continua editável depois da criação, o que ajuda jobs elásticos a escalar para cima ou para baixo.

O Workload define o template:

apiVersion: scheduling.k8s.io/v1beta1
kind: Workload
metadata:
name: training-job
spec:
podGroupTemplates:
- name: workers
schedulingPolicy:
gang:
minCount: 4

Um PodGroup é criado a partir desse template:

apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: training-job-workers-0
spec:
workloadRef:
workloadName: training-job
templateName: workers
schedulingPolicy:
gang:
minCount: 4

Cada Pod entra no grupo pelo nome:

apiVersion: v1
kind: Pod
metadata:
name: worker-0
spec:
schedulingGroup:
podGroupName: training-job-workers-0
containers:
- name: trainer
image: trainer:1.0
# ...

Com essa configuração, o Kubernetes agenda os workers apenas quando pelo menos quatro deles podem rodar juntos. Se o cluster não comportar quatro, nenhum deles inicia.

8. Kubelet em User Namespace (modo Rootless)

Grupo do recurso: SIG Node | KEP: #2033

No Kubernetes v1.37, a execução do kubelet em um user namespace, também chamada de modo Rootless, chegou a Beta.

Antes desse recurso, componentes do nó como o kubelet rodavam como root no host. Se o kubelet fosse comprometido, um invasor poderia obter root no nó inteiro.

Com o v1.37, o feature gate KubeletInUserNamespace é Beta. Ele executa o kubelet e os demais componentes do nó dentro de um user namespace do Linux. Eles ainda parecem root dentro do namespace, mas no host mapeiam para um usuário sem privilégios. Isso adiciona uma camada de isolamento sem mudar a forma como você usa o kubelet no dia a dia. Esse recurso está em desenvolvimento desde o v1.22, então chegar a Beta é um grande passo.

Recursos Alpha do Kubernetes v1.37

9. Eviction Request API

Grupo do recurso: SIG Node | KEP: #4563

Antes desse recurso, drenar um nó para manutenção era uma ação do lado do cliente. Uma ferramenta como kubectl drain despejava os Pods um a um e respeitava os PodDisruptionBudgets, mas a intenção vivia no cliente, não no cluster. Controllers e aplicações não conseguiam ver que um nó estava sendo drenado, coordenar uma transição segura nem participar da decisão. Uma aplicação com estado podia ser despejada em um momento ruim porque nada avisava que a manutenção estava chegando.

Com o v1.37, um recurso Alpha adiciona a API EvictionRequest para que o despejo possa ser cooperativo em vez de uma exclusão forçada. Um solicitante cria um EvictionRequest para um Pod, e os componentes registrados por meio do novo campo spec.evictionResponders do Pod cuidam de uma transição suave. O v1.37 também adiciona novas condições de ciclo de vida do Node (MaintenancePlanned, MaintenanceInProgress, GracefulNodeShutdownInProgress, DrainInProgress e Drained) que os controllers podem observar para saber em que ponto do fluxo de manutenção o nó está. Juntas, essas peças permitem que uma aplicação ou operator faça a drenagem no seu próprio ritmo, por exemplo movendo um líder ou persistindo o estado antes de o Pod sair.

10. Checkpoint e restore em nível de Pod

Grupo do recurso: SIG Node | KEP: #5823

Antes desse recurso, o Kubernetes podia fazer checkpoint de um único container (KEP #2008), principalmente para análise forense. Você podia capturar o estado de um container, mas não de um Pod inteiro de uma vez, então um Pod com vários containers não podia ser capturado como uma unidade.

Com o v1.37, um recurso Alpha adiciona checkpoint e restore em nível de Pod. Ele estende a Container Runtime Interface (CRI) com as chamadas CheckpointPod e RestorePod, para que o kubelet e um runtime compatível possam capturar juntos todos os containers de um Pod e depois restaurá-los. Isso já é útil para trabalho forense hoje e prepara o terreno para usos futuros, como mover um Pod em execução entre nós. O recurso precisa de um runtime de containers que suporte as novas chamadas CRI.

Dynamic Resource Allocation (DRA) - trabalho em andamento

Grupo do recurso: SIG Node / SIG Scheduling

A Dynamic Resource Allocation (DRA) é a forma nativa de o Kubernetes solicitar e compartilhar hardware especial, como GPUs e outros dispositivos, com o scheduler ciente do que está alocado. O núcleo da DRA chegou a GA no v1.34. No v1.37, vários recursos da DRA avançam.

Device Taints and Tolerations (agora GA): taints de dispositivo permitem que um único dispositivo, e não o nó inteiro, sinalize que deve ser evitado, e as claims adicionam tolerations para aceitá-lo. Isso chegou a GA no v1.37 e está disponível na API resource.k8s.io/v1. Permite isolar ou marcar uma única GPU com defeito sem tirar o nó inteiro de serviço.

DRA Extended Resource (agora GA): permite solicitar dispositivos gerenciados pela DRA usando o estilo familiar de extended resources nas requests de um Pod, enquanto a DRA cuida da alocação por trás. Chegou a GA no v1.37.

ResourceClaim Device Status (agora GA): o status de um dispositivo reivindicado, como detalhes de rede que um driver reporta de volta, agora é GA. As ferramentas podem ler o estado do dispositivo de forma padronizada.

Workload Resource Claims (agora Beta): as resource claims agora podem ser vinculadas a um Workload, a mesma Workload API usada para gang scheduling, para que um grupo de Pods possa compartilhar claims de dispositivos. Isso é Beta no v1.37, com o gate DRAWorkloadResourceClaims desativado por padrão.

DRA Node Allocatable Resources (Alpha, vale acompanhar para gerenciamento de recursos): esse trabalho em Alpha permite que a DRA modele recursos do nó, como CPU, memória e hugepages, como dispositivos. Quando está ativo, o kubelet leva em conta os recursos alocados pela DRA ao definir os cgroups de Pods e containers, os scores de OOM e os limiares de Memory QoS. Requests e limits padrão também podem ser redimensionados in place para Pods que usam claims da DRA. Ainda é algo inicial, mas aponta para um futuro em que a DRA pode gerenciar recursos centrais, não apenas dispositivos adicionais.

Descontinuações / Remoções

O SELinux mount se torna o padrão (ação necessária): o feature gate SELinuxMount é GA e vem ativado por padrão no v1.37. Em clusters com SELinux habilitado, isso muda a forma como os volumes são rotulados e pode quebrar alguns workloads existentes. Se você usa SELinux, leia o blog do Kubernetes sobre as mudanças na rotulagem de volumes do SELinux antes de fazer o upgrade, para encontrar e corrigir os workloads afetados ou desativar o recurso primeiro. Clusters sem SELinux não são afetados.

O modo IPVS do kube-proxy está descontinuado: o modo IPVS do kube-proxy está descontinuado desde o v1.35. No v1.37, o kubeadm adiciona um aviso quando ele é usado. Em kernels Linux mais novos, o modo recomendado é o nftables, que é GA desde o v1.33. Em kernels mais antigos, o iptables ainda é o padrão e continua suportado.

A API scheduling.k8s.io/v1alpha2 foi removida: a versão scheduling.k8s.io/v1alpha2 foi descartada no v1.37. Os tipos alpha mais novos migraram para v1alpha3, e os tipos centrais Workload e PodGroup agora são v1beta1. Se você usava a API anterior de agendamento workload-aware, remova todos os objetos v1alpha2 do API server antes de fazer o upgrade.

Flags e métricas legadas do cAdvisor foram removidas: o cAdvisor embutido no kubelet migrou para uma build mais enxuta. Várias flags do cAdvisor descontinuadas há muito tempo não são mais aceitas, e o kubelet não iniciará se alguma estiver definida (apenas --housekeeping-interval foi mantida). Algumas séries de métricas antigas do cAdvisor, como container_tasks_state e container_cpu_load_average_10s, não são mais exportadas. Verifique as flags do seu kubelet e quaisquer dashboards que usavam essas séries.

Outras remoções e observações: o feature gate AnyVolumeDataSource, fixado como ativado desde o v1.33, foi removido. O Kubernetes também adiou do v1.37 para o v1.38 a remoção de algumas flags descontinuadas de configuração de runtime de containers do kubelet, para se alinhar ao suporte do containerd v1.7. Se você ainda usa um containerd mais antigo, planeje o upgrade.

O Kubernetes v1.37 traz um total de 67 melhorias. Além das mudanças cobertas aqui, a versão inclui mais trabalho em autoscaling, armazenamento, segurança e observabilidade, como a Metrics API (metrics.k8s.io) chegando à v1, a conclusão do trabalho de inicialização do watch cache (o gate restante WatchCacheInitializationPostStartHook chegou a Stable) e o controle de admissão baseado em manifesto avançando para Beta. Recomendamos ler as notas de release do v1.37 do Kubernetes e conferir o changelog para a lista completa.

Mantenha seus workloads saudáveis com o PerfectScale by DoiT

O Kubernetes v1.37 oferece ferramentas melhores para gerenciar recursos. Você pode redimensionar sidecars sem reiniciar, definir uma tolerância de HPA por workload, reduzir workloads ociosos a zero e proteger a memória com Memory QoS. Mas essas ferramentas só valem a pena se você escolher os números certos. Defina requests e limits baixos demais e você terá OOM kills, throttling de CPU e evictions. Defina-os altos demais e você paga por capacidade que nunca usa. Fazer isso manualmente, para cada workload, em um cluster que muda o tempo todo, é difícil de acompanhar.

O PerfectScale by DoiT é uma plataforma de governança para Kubernetes que cuida disso para você. Ele monitora seus workloads em busca de riscos ligados a recursos, como OOM kills, throttling de CPU e evictions, e os transforma em recomendações de right-sizing acionáveis e automatizadas, que você pode aplicar manualmente ou de forma autônoma. Assim, você obtém a economia de recursos como o scale to zero e o redimensionamento in-place, sem quebrar seus SLOs. Equipes como Paramount Pictures e Creditas usam o PerfectScale para manter seus clusters econômicos e confiáveis ao mesmo tempo.

Cadastre-se ou agende uma demonstração técnica para descobrir onde seu cluster está desperdiçando dinheiro ou correndo riscos.

FAQ

Por que o Kubernetes v1.37 se chama "Garhwal"?

O nome da versão vem de Garhwal, uma região do Himalaia em Uttarakhand, na Índia. O tema fala de camadas que se conectam e se apoiam, dos campos em terraços aos riachos de montanha, o que combina com uma versão que continua construindo sobre o trabalho das anteriores.

Quantas melhorias há no Kubernetes v1.37?

67 no total: 16 agora são Stable (GA), 23 agora são Beta, 27 agora são Alpha e 1 é uma remoção.

Quais são os maiores recursos novos do Kubernetes v1.37?

As mudanças de destaque são o redimensionamento in-place para containers init e sidecar (GA), a tolerância configurável do HPA (GA), node declared features (GA), scale-to-zero para o HorizontalPodAutoscaler (Beta), Memory QoS (Beta), gerenciadores de recursos em nível de Pod (Beta) e o gang scheduling nativo por meio da Workload API (Beta).

Posso escalar um Deployment para zero réplicas com o HorizontalPodAutoscaler?

Sim. O scale to zero do HPA é Beta e vem ativado por padrão no v1.37. Defina spec.minReplicas: 0 e ele funciona para workloads baseados em métricas Object ou External, como o tamanho de uma fila. Não funciona para métricas de CPU ou memória, já que elas vêm de Pods em execução e não há nenhum quando está em zero.

Posso redimensionar um container sidecar sem reiniciar o Pod inteiro?

Sim. O feature gate InPlacePodVerticalScalingInitContainers é GA no v1.37, estendendo o redimensionamento in-place (já GA para containers de aplicação desde o v1.35) para containers init e sidecar. Se a mudança é aplicada ao vivo ou reinicia apenas aquele container depende do resizePolicy que você define por recurso.

O que é o Memory QoS no Kubernetes v1.37?

O Memory QoS, agora Beta, usa os controles do cgroup v2 (memory.min e memory.high) para proteger a memória solicitada de um container contra reclaim e fazer throttling antes que ele atinja o limite rígido, tornando os OOM kills menos prováveis sob pressão.

O que está sendo descontinuado ou removido no Kubernetes v1.37?

O SELinux mount se torna o padrão GA e pode mudar a rotulagem de volumes em clusters com SELinux habilitado (ação necessária antes do upgrade). O modo IPVS do kube-proxy está descontinuado em favor do nftables. A API scheduling.k8s.io/v1alpha2 e as flags/métricas legadas do cAdvisor foram removidas.

Como funciona o gang scheduling na nova Workload API?

Um Workload define um ou mais podGroupTemplates com uma política de agendamento (como gang) e um minCount. Os Pods entram em um PodGroup criado a partir desse template, e o scheduler só os posiciona quando pelo menos minCount Pods podem rodar juntos — útil para jobs fortemente acoplados, como treinamento distribuído.