I desember 2025 gikk en av de mest etterlengtede Kubernetes-funksjonene fra beta til stabil status: muligheten til å endre CPU- og minnegrenser på en kjørende pod uten å restarte den. Funksjonen heter in-place pod resize, og den er nå slått på som standard i alle klynger som kjører Kubernetes 1.35 eller nyere. Med versjon 1.36 ute siden april 2026, og 1.37 rett rundt hjørnet 26. august 2026, er dette ikke lenger en eksperimentell funksjon du må aktivere manuelt. Den er der, den virker, og de fleste teamene har ennå ikke tatt den i bruk.

Denne guiden viser deg hvordan du setter opp, tester og bruker in-place pod resize i praksis, fra første feature-sjekk til et komplett produksjonsklart oppsett med Vertical Pod Autoscaler. Du får 12 konkrete steg, fem+ kodeeksempler du kan kjøre direkte, og en liste over fallgruvene som får folk til å tro funksjonen ikke virker (den virker, men reglene rundt QoS-klasser og cgroup v2 er strengere enn de fleste forventer).

Hva er in-place pod resize i Kubernetes?

Før 1.27 var det bare én måte å endre ressursene til en kjørende container på: slette poden og lage en ny. For en Deployment betyr det en rullende omstart. For en StatefulSet med lokal state kan det bety timer med resynkronisering. In-place pod resize fjerner det steget. Feltet spec.containers[*].resources er nå mutable for CPU og minne, og kubelet kan justere cgroup-grensene til en container mens den fortsatt kjører.

Funksjonen styres av feature-gaten InPlacePodVerticalScaling. Den kom som alpha i Kubernetes 1.27 (mai 2023), gikk til beta i 1.33 (mai 2025), og ble stabil (GA) i 1.35, som ble sluppet 17. desember 2025. Fra og med GA er gaten slått på som standard, du trenger ikke lenger å aktivere den manuelt på kontrollplanet eller nodene, forutsatt at du kjører en oppdatert distribusjon.

Bruksområdene er konkrete: spillservere som må vokse når flere spillere kobler seg til, forhåndsvarmede arbeidere som kan krympes mens de er inaktive og blåses opp ved første forespørsel, JIT-kompilerte runtime-er som trenger et CPU-støt ved oppstart og deretter kan skrus ned, og generell bin-packing der du vil unngå å kaste bort noder på pods som er overdimensjonert for sikkerhets skyld.

For norske og nordiske driftsteam er dette spesielt relevant nå. Strømpriser og datasenterkapasitet har vært et tilbakevendende samtaleemne i regionen, og flere skyleverandører har begynt å prise inn kapasitetsknapphet tydeligere i fakturaene. Å kunne skalere en pod presist, uten å måtte runde opp til nærmeste hele node eller planlegge for verste-tenkelige-tilfelle hele tiden, gjør ressursbudsjettering enklere å forsvare internt, uansett om klyngen kjører hos en global hyperscaler eller en lokal leverandør.

In-place resize sammenlignet med tradisjonell recreate

Den gamle metoden for å endre ressurser på en pod var å oppdatere Deployment-specen og la Kubernetes rulle ut nye pods, en etter en. Det virker, men det koster mer enn folk flest tenker over. Hver ny pod må planlegges på nytt av schedulereren, hente et nytt container-image fra cache eller registry, kjøre gjennom readiness-probes, og eventuelt vente på at en load balancer oppdager den nye IP-adressen. For en StatefulSet med lokal disk kan dette bety en full resynkronisering av data.

EgenskapTradisjonell recreateIn-place resize
Container-restartAlltidKun hvis resizePolicy er RestartContainer
Ny IP-adresse til podenJa, hver gangNei, samme pod beholdes
Scheduler kjøres på nyttJa, full re-schedulingNei, kun kapasitetssjekk på samme node
Påvirker StatefulSet lokal stateKan kreve resynkroniseringIngen påvirkning, disken forblir festet
Krever oppdatert kubectlNeiJa, v1.32 eller nyere for subresource-flagget

Den praktiske konsekvensen er at et team som driver mange små, trafikktunge tjenester kan kutte antall unødvendige pod-recreates betraktelig, spesielt for arbeidslaster som allerede har VPA konfigurert i den gamle Recreate-modusen. Det er også derfor VPA-teamet i Kubernetes prioriterte InPlaceOrRecreate som neste steg etter at selve resize-funksjonen ble stabil.

Forutsetninger og versjonskrav

Du trenger ikke et stort produksjonsmiljø for å følge denne guiden. Et lokalt testcluster holder for de fleste stegene, men sett av et vindu i staging før du ruller ut mot produksjon.

KomponentMinstekravAnbefalt for GA-oppførsel
Kubernetes-serverv1.33 (beta)v1.35 eller nyere (GA, standard på)
kubectl-klientv1.32v1.36 (matcher serveren)
Container-runtimecontainerd 1.6+ eller CRI-O 1.24+containerd 2.0+
cgroup-versjon på nodercgroup v1 (begrenset)cgroup v2
Operativsystem på noderLinuxLinux (Windows støttes ikke)
Testverktøyminikube 1.33+kind 0.24+ med node-image v1.36

Legg merke til cgroup-kravet. Minnenedskalering med best-effort-beskyttelse fungerer riktig kun på cgroup v2. De fleste moderne distribusjoner (Ubuntu 22.04+, Amazon Linux 2023, Bottlerocket) kjører cgroup v2 som standard, men eldre noder med Amazon Linux 2 eller Ubuntu 20.04 kjører ofte fortsatt cgroup v1, og der vil enkelte minne-resizer feile stille.

Sjekk cgroup-versjonen på en node før du går videre med kommandoen stat -fc %T /sys/fs/cgroup/ kjørt via en debug-pod eller SSH. Svaret cgroup2fs betyr at noden kjører v2 og er klar. Svaret tmpfs betyr v1, og da bør du planlegge en node-oppgradering før dere ruller ut minne-resize i produksjon, ikke bare CPU-resize som fungerer greit på begge versjoner.

Steg 1: Verifiser klynge- og kubectl-versjon

Start med å sjekke hva du faktisk kjører. Mange team har ulike patch-versjoner på tvers av klynger, og resize-subressursen krever at kubectl-klienten matcher eller ligger nært serverversjonen.

kubectl version --short
kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.kubeletVersion}'

Outputen bør vise minst 1.33 på både klient og server. Kjører du under 1.35, husk at gaten ikke nødvendigvis er slått på ennå på eldre administrerte klynger, selv om selve Kubernetes-versjonen støtter beta-funksjonen.

Steg 2: Bekreft at InPlacePodVerticalScaling er aktivert

På egenforvaltede klynger sjekker du feature-gaten direkte på kube-apiserver og kubelet. På administrerte tjenester som EKS, AKS eller GKE er den som regel allerede slått på fra 1.35, men det er verdt å bekrefte før du planlegger en migrering.

# Egenforvaltet klynge: se etter flagget i manifestene
grep -r "InPlacePodVerticalScaling" /etc/kubernetes/manifests/kube-apiserver.yaml

# Enklere test: sjekk om resize-subressursen finnes
kubectl api-resources --api-group="" | grep pods/resize

Hvis pods/resize ikke dukker opp i listen, kjører klyngen din enten under 1.33, eller gaten er eksplisitt slått av. Da må en klyngeadministrator legge til --feature-gates=InPlacePodVerticalScaling=true på kube-apiserver, kube-scheduler og kubelet, og restarte komponentene i tur og orden.

Steg 3: Sett opp et testcluster med kind

For å teste trygt uten å røre en delt klynge, bruk kind (Kubernetes in Docker) med et nytt nok node-image. Dette gir deg full kontroll over versjon og feature-gates lokalt.

cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.36.0
- role: worker
  image: kindest/node:v1.36.0
EOF

kind create cluster --name resize-lab --config kind-config.yaml
kubectl cluster-info --context kind-resize-lab

Forventet output er en bekreftelse på at kontrollplanet og CoreDNS kjører, typisk innen 60-90 sekunder på en bærbar maskin med fire kjerner. Har du ikke Docker installert lokalt, fungerer minikube med --kubernetes-version=v1.36.0 like bra.

Steg 4: Deploy en pod med resizePolicy

Nøkkelfeltet er resizePolicy, som du setter per ressurstype (CPU og minne) på hver container. Standardverdien er NotRequired, som betyr at kubelet prøver å bruke den nye grensen uten restart. Setter du RestartContainer, tvinger du frem en restart hver gang den ressursen endres, noe som er nyttig for runtime-er som ikke takler å få CPU-grensen endret under kjøring.

apiVersion: v1
kind: Pod
metadata:
  name: resize-demo
  namespace: default
spec:
  containers:
  - name: app
    image: registry.k8s.io/pause:3.9
    resizePolicy:
    - resourceName: cpu
      restartPolicy: NotRequired
    - resourceName: memory
      restartPolicy: NotRequired
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
---
kubectl apply -f resize-demo.yaml
kubectl get pod resize-demo -o jsonpath='{.status.qosClass}'

Sistnevnte kommando forteller deg hvilken QoS-klasse poden fikk. Med requests under limits blir det Burstable, og det påvirker akkurat hvilke resizer du får lov til å gjøre senere i denne guiden.

Steg 5: Forstå QoS-klasser og begrensningene de setter

Dette er stedet der de fleste teamene går i baret. Kubernetes lar deg ikke bytte QoS-klasse gjennom en resize, uansett hvor liten endringen er. Reglene er strenge og gjelder likt fra beta til GA:

  • Guaranteed: requests må fortsatt være lik limits etter resize. Endrer du kun requests, feiler kallet.
  • Burstable: requests og limits kan ikke bli like etter en resize, det ville flyttet poden til Guaranteed.
  • BestEffort: du kan ikke legge til ressurskrav i det hele tatt via resize, poden må starte på nytt med krav definert fra start.

Init-containere og ephemeral containers kan ikke resizes, mens sidecar-containere (init-containere med restartPolicy: Always) kan. Pods som styres av statiske CPU- eller minnehåndteringspolicyer på noden (static policy i kubelet) er også utelatt, fordi de allerede har eksklusiv tilgang til fysiske kjerner som ikke enkelt kan endres på flukt.

Sjekk QoS-klassen før du designer en resize-strategi, ikke etter. Hvis appen din i dag kjører som BestEffort fordi ingen har satt requests og limits, må du først gjøre en vanlig oppdatering (med restart) for å gi den en QoS-klasse med ressurskrav, før du kan begynne å bruke in-place resize videre derfra. Dette er et engangsarbeid, men det overrasker team som forventer å kunne gå rett fra BestEffort til automatisk skalering uten mellomsteg.

Steg 6: Utfør en CPU-resize uten restart

Med testpoden oppe, prøv den første ekte resizen. Kommandoen bruker --subresource=resize, som krever kubectl v1.32 eller nyere.

kubectl patch pod resize-demo --subresource=resize -p \
  '{"spec":{"containers":[{"name":"app","resources":{"requests":{"cpu":"150m"},"limits":{"cpu":"300m"}}}]}}'

kubectl get pod resize-demo -o jsonpath='{.status.containerStatuses[0].resources}'

Output fra den siste kommandoen viser feltene requests og limits slik kubelet faktisk har konfigurert dem, altså den bekreftede tilstanden, ikke bare det du ba om. Et typisk svar ser slik ut:

{
  "requests": {"cpu": "150m", "memory": "128Mi"},
  "limits": {"cpu": "300m", "memory": "256Mi"}
}

Sjekk også allocatedResources under samme containerStatus, det feltet viser hva kubelet har reservert på noden. Stemmer de to feltene overens, er resizen fullført. CPU-endringer er nesten alltid raske fordi cgroup-kvoten kan justeres direkte uten risiko for OOM, ofte innen få hundre millisekunder på en node uten hardt CPU-press.

Steg 7: Utfør en minne-resize og forstå beste-innsats-beskyttelsen

Minne er tregere og mer risikabelt å endre enn CPU. Frem til GA i 1.35 kunne du ikke senke minnegrensen på en kjørende container i det hele tatt, kun øke den. Fra 1.35 er nedskalering tillatt, men med en «beste innsats»-garanti: kubelet prøver å unngå OOM-kill, men gir ingen garanti. Bruker containeren allerede mer minne enn den nye grensen tillater, blir resizen stående i InProgress til minnebruken faller, i stedet for å drepe containeren umiddelbart.

kubectl patch pod resize-demo --subresource=resize -p \
  '{"spec":{"containers":[{"name":"app","resources":{"requests":{"memory":"96Mi"},"limits":{"memory":"192Mi"}}}]}}'

kubectl describe pod resize-demo | grep -A3 "Conditions"

Legg merke til at minnenedskalering krever cgroup v2 for å fungere pålitelig. På cgroup v1-noder kan kjernen nekte å senke memory.limit_in_bytes mens containeren har allokert minne over den nye grensen, og resizen blir hengende. Det er den vanligste årsaken til at team rapporterer at “minne-resize ikke virker” selv på en klynge som kjører 1.35 eller nyere.

Steg 8: Overvåk resize-status og conditions

Hver resize-forespørsel går gjennom to mulige pod-conditions du bør overvåke i produksjon, spesielt hvis du automatiserer resizer via en operator eller VPA.

ConditionÅrsakHva det betyr
PodResizePendingInfeasibleForespurte ressurser overstiger nodens kapasitet, løser seg ikke av seg selv
PodResizePendingDeferredKan ikke innfris akkurat nå, kubelet prøver igjen senere
PodResizeInProgressKubelet har allokert ressursene og jobber med å ta dem i bruk
kubectl get pod resize-demo -o jsonpath='{.status.conditions[?(@.type=="PodResizePending")]}'
kubectl get pod resize-demo -o jsonpath='{.status.observedGeneration}'

En pod som venter på kapasitet viser gjerne noe slikt i condition-listen:

{
  "type": "PodResizePending",
  "status": "True",
  "reason": "Infeasible",
  "message": "Node didn't have enough capacity: cpu, requested: 300m"
}

status.observedGeneration forteller deg hvilken versjon av podSpec-en kubelet faktisk har bekreftet. Bygger du automatisering rundt resize, poll dette feltet i stedet for å anta at en resize er ferdig med en gang API-kallet returnerer 200.

Steg 9: Koble sammen med Vertical Pod Autoscaler

Manuell resize er fint for testing, men produksjonsverdien kommer når VPA gjør jobben automatisk. VPA fikk en ny modus, InPlaceOrRecreate, som graduerte til beta sammen med GA-en av selve resize-funksjonen. I denne modusen forsøker VPA først en in-place resize, og faller kun tilbake til den gamle evict-og-gjenskap-metoden hvis resizen ikke er mulig (for eksempel fordi den ville byttet QoS-klasse).

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: resize-demo-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: resize-demo
  updatePolicy:
    updateMode: "InPlaceOrRecreate"
  resourcePolicy:
    containerPolicies:
    - containerName: app
      minAllowed:
        cpu: 100m
        memory: 64Mi
      maxAllowed:
        cpu: 1
        memory: 512Mi

Installer VPA-komponentene (recommender, updater, admission-controller) fra det offisielle autoscaler-repoet før du bruker denne manifesten. Sett alltid minAllowed og maxAllowed, ellers kan VPA foreslå grenser langt utenfor det noden faktisk har tilgjengelig, noe som trigger PodResizePending med årsak Infeasible i loopen.

VPA-recommenderen bygger anbefalingene sine på et histogram av faktisk CPU- og minneforbruk over tid, ikke bare et øyeblikksbilde. Som standard ser den på de siste åtte dagene og sikter mot en persentil som gir litt slingringsmonn over typisk bruk, men fortsatt lavere enn en manuelt satt buffer. Første gang du slår på VPA på en arbeidslast, gir den ofte konservative anbefalinger fordi histogrammet er tomt. Vent minst et par dager med reell trafikk før du stoler fullt på tallene den foreslår.

Steg 10: Sett opp RBAC for resize-subressursen

Resize er en egen subressurs i RBAC-modellen, adskilt fra vanlig pod-oppdatering. Et team som har updatepods har ikke automatisk lov til å kalle resize. Det gir deg finkornet kontroll: en CI-pipeline kan få lov til å endre image via vanlig update, mens kun en autoscaler-tjenestekonto får lov til å endre ressurser.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-resizer
rules:
- apiGroups: [""]
  resources: ["pods/resize"]
  verbs: ["patch", "update"]

Bind rollen til tjenestekontoen VPA-updateren kjører under, ikke til bredere admin-roller. Mister du oversikten over hvem som har denne tillatelsen, kan uventede resizer dukke opp fra scripts du har glemt du kjørte for tre måneder siden.

Steg 11 og 12: Automatiser i produksjon og feilsøk mislykkede resizer

Når testene på steg 1-10 er grønne, flytt oppsettet til staging med reell trafikk før produksjon. Sett opp varsling på PodResizePending med årsak Infeasible gjennom Prometheus, siden den tilstanden ikke løser seg av seg selv. Et enkelt PromQL-uttrykk som kube_pod_status_reason{reason="Infeasible"} > 0 fanger opp dette hvis du kjører kube-state-metrics i en versjon som eksponerer resize-conditions (kube-state-metrics 2.13+).

Feiler en resize, sjekk i denne rekkefølgen: nodens ledige kapasitet (kubectl describe node), QoS-klassen til poden (kan endringen flytte den til en annen klasse), cgroup-versjonen på noden, og til slutt om containerens runtime faktisk støtter live cgroup-oppdatering. Docker via dockershim er fjernet siden lenge, men eldre containerd-versjoner under 1.6 har fortsatt kjente hull i resize-støtten for minne.

Kjører du GitOps med Argo CD eller Flux, husk at resize-endringer gjort direkte med kubectl patch --subresource=resize ikke går gjennom Git som kilde til sannhet. Det er greit for VPA-drevne, automatiske justeringer, men hvis et menneske manuelt resizer en pod for å slukke en brann, bør endringen følges opp med en tilsvarende oppdatering i Git etterpå. Ellers vil neste synkronisering fra Argo CD eller Flux rulle poden tilbake til de gamle verdiene og potensielt gjenskape problemet.

Vanlige fallgruver

  • Å anta QoS-klassen kan endres via resize. Den kan den ikke. Planlegg requests og limits slik at klassen forblir stabil gjennom hele skaleringsintervallet.
  • Å glemme cgroup v2-kravet. Minnenedskalering på cgroup v1-noder feiler stille eller blir hengende i InProgress, uten en tydelig feilmelding.
  • Å bruke gammel kubectl mot ny server. Uten --subresource=resize-støtte (kubectl under 1.32) prøver klienten å oppdatere hele pod-specen, som feiler fordi de fleste andre felt fortsatt er immutable.
  • Å resize init-containere eller ephemeral containers. De støttes ikke, og API-et returnerer en tydelig valideringsfeil hvis du prøver.
  • Å sette VPA i InPlaceOrRecreate-modus uten min/max-grenser. Resultatet er ofte forespørsler noden ikke kan innfri, som stables opp som Infeasible-conditions.
  • Å ikke teste static CPU manager-policyen. Pods med garantert CPU-pinning via kubeletens static policy hopper over resize-funksjonen helt, uansett hvor riktig manifestet ditt ser ut.
  • Å blande HPA og VPA på samme ressurstype. Lar du begge kontrollere justere CPU samtidig, får du en tilbakekoblingssløyfe der replikaantall og pod-størrelse jager hverandre i motsatt retning.
  • Å stole blindt på at en resize er ferdig fordi kubectl-kallet returnerte suksess. Et 200-svar betyr bare at forespørselen ble akseptert, ikke at kubelet har fullført allokeringen. Sjekk alltid observedGeneration eller conditions før du bygger videre logikk på resultatet.

Feilsøking: 8 vanlige problemer og løsninger

De fleste feil du støter på handler om versjonsmismatch, QoS-brudd eller cgroup-forskjeller mellom noder i samme klynge, ikke om selve resize-logikken. Tabellen under dekker de vanligste symptomene i den rekkefølgen du bør sjekke dem, fra enklest å bekrefte til mest tidkrevende å diagnostisere.

SymptomSannsynlig årsakLøsning
pods/resize finnes ikke i api-resourcesKlynge under 1.33, eller gate slått avOppgrader til 1.35+ eller aktiver feature-gate manuelt
kubectl patch –subresource=resize feiler med “unknown flag”kubectl-klient under 1.32Oppgrader kubectl til minst 1.32, helst matchende serverversjon
Resize henger i PodResizeInProgress i minutterMinnebruk over ny grense, best-effort venterReduser minnebruk i appen først, eller bruk RestartContainer-policy
Condition Infeasible dukker oppNode har ikke ledig kapasitet til forespurte requestsSjekk node-utnyttelse, vurder cluster autoscaler eller mindre steg
Resize avvises med QoS-feilmeldingEndringen ville flyttet poden mellom QoS-klasserJuster requests og limits sammen, ikke bare den ene
allocatedResources matcher ikke requests etter resizeKubelet har ikke fullført allokeringen ennåPoll observedGeneration til den matcher spec-generasjonen
Init-container resize feiler med valideringsfeilInit-containere og ephemeral containers støttes ikkeBruk restartable init (sidecar) containere i stedet hvis mulig
Ingen effekt på Windows-noderFunksjonen er kun støttet på LinuxPlanlegg Windows-arbeidslaster med tradisjonell rolling update

Avanserte tips

Kombiner resize med CPU-oppstartsstøtte (AEP-7862) for applikasjoner med tung JIT-kompilering. Be om et høyt CPU-krav de første sekundene, og la en operator senke det automatisk etter oppstart er ferdig. Det gir raskere kaldstart uten å permanent binde opp CPU du ikke trenger i steady state.

Se også fremover mot Kubernetes 1.36, sluppet 22. april 2026, som la til alpha-støtte for in-place resize av PersistentVolumes for AWS EBS, altså volumstørrelse og IOPS uten å måtte gjenskape claim-en. Det er fortsatt alpha og krever egen feature-gate, men peker mot at hele ressursmodellen i Kubernetes beveger seg bort fra “slett og gjenskap” som standardsvar på endring. Kubernetes 1.37, ventet 26. august 2026, bygger videre på dette sporet ifølge den offisielle sneak peek-bloggen.

For klynger som kjører HPA og VPA samtidig, hold dem adskilt per ressurstype. La HPA styre replikaantall basert på CPU-utnyttelse, og la VPA i InPlaceOrRecreate-modus kun justere minnegrenser. Kjører begge på samme ressurstype samtidig, får du oscillering der HPA skalerer ut mens VPA prøver å skalere hver enkelt pod ned, og de to kontrollerne jobber mot hverandre.

På klynger med flere team i samme namespace-struktur, merk VPA-manifestene med eierskap tydelig (label eller annotation med team-navn), og eksporter resize-metrikker per namespace til kostnadsverktøyet dere allerede bruker. Da kan et FinOps-team se hvilke arbeidslaster som faktisk drar nytte av in-place resize og hvilke som fortsatt kjører med statiske, overdimensjonerte grenser fra før funksjonen ble tilgjengelig.

Sikkerhetshensyn ved automatisert resize

Fordi resize er en egen RBAC-subressurs, kan du begrense hvem som får kalle den uten å påvirke andre pod-tillatelser, men det løser ikke alt. En kompromittert tjenestekonto med resize-tilgang kan i teorien be om urimelig store CPU- og minnegrenser på pods den kontrollerer, og på en delt klynge med mange tenanter kan det bety at en enkelt arbeidslast spiser opp kapasitet andre team er avhengige av. Sett derfor alltid ResourceQuota og LimitRange på namespace-nivå som en ekstra sperre, i tillegg til minAllowed/maxAllowed i VPA-manifestet.

For klynger med strengere krav, bruk en admission-policy-motor som Kyverno eller OPA Gatekeeper til å validere resize-forespørsler mot øvre grenser før de når kubelet. Begge støtter validering på subressurs-nivå, slik at du kan avvise en resize som ber om mer enn for eksempel 4 CPU-kjerner på en enkelt container, uavhengig av hva som står i VPA-anbefalingen. Aktiver også API-server audit logging for pods/resize-verbet, slik at uventede eller unormalt hyppige resize-kall er sporbare i etterkant.

Et siste punkt mange overser: resize endrer ikke pod-ens sikkerhetskontekst eller image, kun ressursgrensene. Det betyr at en resize-hendelse alene ikke er en sikkerhetshendelse i seg selv, men et uventet mønster av gjentatte, store resizer på samme pod kan være et tegn på at noe annet i klyngen prøver å eskalere ressursbruk, for eksempel en krypto-mining-prosess som har fått fotfeste inne i en container.

Kostnadseffekten: mindre overprovisionering

Før in-place resize eksisterte, løste de fleste team usikkerhet rundt ressursbehov ved å sette requests høyere enn nødvendig. Grunnen var enkel: en pod som ble evict-et og gjenskapt for ofte skapte ustabilitet, så det var tryggere å overdimensjonere fra start. Det problemet henger direkte sammen med FinOps-arbeidet mange skyteam allerede driver med, der målet er å redusere avstanden mellom det som er reservert (requests) og det som faktisk brukes.

Med in-place resize kan et team sette lavere startrequests og la VPA i InPlaceOrRecreate-modus justere opp underveis når faktisk forbruk viser seg. Risikoen ved å prøve lavere verdier faller kraftig, fordi en feilvurdering ikke lenger betyr en full pod-restart med den nedetiden det kan medføre for stateful arbeidslaster. For klynger som allerede overvåker kostnad per namespace med verktøy som OpenCost eller Kubecost, er dette et konkret sted å angripe overprovisionering uten å øke restart-risikoen.

Kombiner dette med bin-packing-fordelen: en scheduler som vet at pods kan krympes on-demand trenger mindre slakk per node for å håndtere spisser i trafikk. Det gjør det lettere å kjøre klynger tettere pakket uten å øke antall evictions, noe som i praksis betyr færre noder for samme arbeidsmengde over tid.

Komplett eksempelprosjekt

Under følger et komplett, kjørbart oppsett som binder sammen alt fra denne guiden: en Deployment med riktig resizePolicy, en VPA i InPlaceOrRecreate-modus, og RBAC begrenset til autoscaler-kontoen.

Prosjektstruktur

resize-lab/
├── kind-config.yaml
├── deployment.yaml
├── vpa.yaml
├── rbac.yaml
└── deploy.sh
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: resize-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: resize-demo
  template:
    metadata:
      labels:
        app: resize-demo
    spec:
      containers:
      - name: app
        image: registry.k8s.io/pause:3.9
        resizePolicy:
        - resourceName: cpu
          restartPolicy: NotRequired
        - resourceName: memory
          restartPolicy: NotRequired
        resources:
          requests:
            cpu: 100m
            memory: 96Mi
          limits:
            cpu: 250m
            memory: 192Mi
# deploy.sh
#!/usr/bin/env bash
set -euo pipefail

kind create cluster --name resize-lab --config kind-config.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment.yaml
kubectl rollout status deployment/resize-demo --timeout=90s
kubectl apply -f vpa.yaml
echo "Klart. Overvåk med: kubectl get pod -l app=resize-demo -w"

Kjør chmod +x deploy.sh && ./deploy.sh og du har et fullt fungerende laboratorium på under to minutter. En vellykket kjøring avsluttes typisk med noe i denne stilen:

deployment.apps/resize-demo condition met
verticalpodautoscaler.autoscaling.k8s.io/resize-demo-vpa created
Klart. Overvåk med: kubectl get pod -l app=resize-demo -w

rbac.yaml og vpa.yaml i prosjektstrukturen er de samme manifestene som RBAC-rollen fra steg 10 og VPA-en fra steg 9, samlet i egne filer slik at deploy.sh kan referere til dem direkte. kind-config.yaml gjenbruker konfigurasjonen fra steg 3. Rydd opp etterpå med kind delete cluster --name resize-lab slik at du ikke sitter igjen med en glemt lokal klynge som spiser batteri.

Versjonshistorikk: fra alpha til stabil funksjon

Kubernetes-versjonDatoStatus for InPlacePodVerticalScaling
1.27Mai 2023Alpha, gate av som standard
1.33Mai 2025Beta, må ofte fortsatt aktiveres manuelt på egenforvaltede klynger
1.3427. august 2025Beta videreført, fokus på Dynamic Resource Allocation GA i samme release
1.3517. desember 2025Stabil (GA), gate på som standard, minnenedskalering tillatt
1.3622. april 2026Stabil, alpha-forsøk på PV-resize for AWS EBS lagt til samme release
1.37Ventet 26. august 2026Bygger videre på ressursmodellen ifølge Kubernetes’ egen sneak peek

Ofte stilte spørsmål

Må jeg oppgradere hele klyngen til 1.35 for å bruke funksjonen?
Nei. Beta-versjonen fra 1.33 fungerer også, men da må feature-gaten som regel aktiveres manuelt, og minnenedskalering var ikke tillatt før GA i 1.35.

Fungerer in-place resize med Docker som container-runtime?
Docker via dockershim støttes ikke lenger i moderne Kubernetes uansett. Bruk containerd 1.6+ eller CRI-O 1.24+, og helst nyere versjoner for pålitelig minne-resize.

Kan jeg resize en pod som styres av en Deployment direkte?
Ja, men du resizer den enkelte poden via resize-subressursen, ikke Deployment-objektet. For automatisk, løpende resize på tvers av replikaer trenger du VPA i InPlaceOrRecreate-modus.

Hva skjer hvis resizen ikke får plass på noden?
Poden får en PodResizePending-condition med årsak Infeasible. Den løser seg ikke av seg selv, du må enten frigjøre kapasitet, flytte poden, eller be om mindre ressurser.

Er funksjonen trygg å bruke på Guaranteed QoS-pods i produksjon?
Ja, men husk at requests og limits må forbli like etter resize. Du kan skalere en Guaranteed-pod opp eller ned, men aldri gjøre den Burstable underveis.

Trenger jeg VPA for å bruke in-place resize?
Nei, kubectl patch med –subresource=resize er nok for manuell eller scriptet bruk. VPA gir deg automatikk basert på faktisk forbruk over tid, men er ikke et krav.

Virker det på administrerte tjenester som EKS, AKS og GKE?
Ja, forutsatt at nodegruppen kjører en Kubernetes-versjon på 1.33 eller nyere. Sjekk alltid leverandørens egen dokumentasjon for hvilken versjon som er standard slått på.

Kan jeg fjerne et ressurskrav helt via resize?
Nei. Du kan endre verdien på requests og limits, men du kan ikke fjerne feltene helt gjennom en resize-operasjon.

Kan jeg overvåke resize-hendelser i Grafana eller Datadog?
Ja, begge plattformene kan hente pod-conditions og containerStatuses via kube-state-metrics eller sine egne Kubernetes-integrasjoner. Bygg et dashbord som teller PodResizePending over tid, så ser du raskt om Infeasible-tilfeller hoper seg opp på bestemte noder.

Påvirker in-place resize horisontal autoskalering (HPA)?
Ikke direkte. HPA styrer antall replikaer basert på metrikker, mens in-place resize endrer størrelsen på hver enkelt pod. De kan kjøre side om side, men bør styre ulike ressurstyper for å unngå at de motvirker hverandre.

Hvor lang tid tar en typisk resize-operasjon?
CPU-resizer er som regel nesten øyeblikkelige fordi kjernen kun trenger å justere en cgroup-kvote. Minne-resizer, spesielt nedskalering, kan ta lengre tid fordi kubelet venter til faktisk bruk faller under den nye grensen før den bekrefter endringen som fullført.

Det korte svaret på om dette er verdt å sette opp nå: ja, spesielt hvis klyngen allerede kjører 1.35 eller nyere, for da er funksjonen allerede slått på og bare venter på at noen tar den i bruk. Start med et lavrisiko-team, mål effekten på antall pod-restarts og ressursbruk over noen uker, og utvid derfra til VPA-drevet automatikk når dere er komfortable med grensetilfellene rundt QoS og cgroup-versjon.

Relatert dekning

Se også vår oversikt over skytjenester for flere guider til drift og kostnadsstyring i Kubernetes.

Kilder: Kubernetes-bloggen om GA i 1.35, offisiell dokumentasjon for pod-resize, beta-annonseringen i 1.33, alpha-annonseringen i 1.27, og Kubernetes’ offisielle utgivelsesoversikt.