Kubernetes oomkilled

Kubernetes oomkilled
Når Kubernetes fungerer, er det utrolig, men når det ikke gjør det, som når søknaden krasjer på grunn av minnet, bør du vite hvordan du skal feilsøke med Oomkilled. Hvis du har jobbet med Kubernetes før, har du nesten helt sikkert opplevd den oomkillede feilen. Hvis du ikke forstår hvordan det fungerer, kan feilsøking være en frustrerende opplevelse. Vi ser mer detaljert på det oomkillede problemet i dette innlegget.

Forutsetning

For å bruke Kubernetes -tjenestene, trenger du en Minikube -klynge. Du må sette opp en Minikube -klynge på systemet ditt for å få denne teknikken til å fungere. For å sette opp en Minikube -klynge, bruk kommandolinjeterminalen. Det kan brukes på to måter. Se etter "terminal" i systemets programsøkeseksjon. Ctrl+ALT+T er en snarvei som kan brukes til dette:

Minst 300 mib minne må være tilgjengelig på hver node i klyngen din. Du må ha metrikk-servertjenesten som kjører i klyngen din for noen oppgaver på denne siden. Du kan hoppe over disse trinnene hvis metrikk-serveren allerede fungerer. Skriv inn følgende vedlagte kommando.

Bruk nå den vedlagte kommandoen.

Responsen guider beregninger.K8s.io hvis ressursmålingene API er tilgjengelig, som vist på skjermdumpen ovenfor.

Trinn for å lage et navneområde

Lag et navneområde for ressursene du vil lage her for å skille dem fra resten av klyngen din.

En ny pod dannes, som du kan se nedenfor.

Gi ressursene: Forespørsler felt i manifestet av beholderens ressurs for å definere en minneforespørsel. Inkluder ressurser: grenser for å sette en RAM -grense. Du vil designe en pod med en beholder. Beholderen har en forespørsel på 100 MIB -minne og en minnegrense på 200 mib. Pods konfigurasjonsfil er som følger:

Når containeren starter, leverer Args -delen av konfigurasjonsfilen sine parametere. Alternativene “-Vm-Bytes” og “150m” instruerer containeren til å tildele 150 mib RAM.

Nedenfor kan du se at vi har opprettet poden:

Denne kommandoen vil sjekke om podbeholderen er i gang:

I følge resultatet har podens enkeltbeholder en minneforespørsel på 100 MIB og en minnegrense på 200 MIB.

For å få Pods beregninger, kjør Kubectl Top -kommandoen.

Hvordan kan minnegrensen til en beholder overskrides?

Hvis noden ser ut til å ha nok minne, kan en beholder overgå minneforespørselen. På den annen side kan en beholder ikke bruke mer minne enn den har gjort. Hvis en beholder tar mer minne enn tildelt, vil den avsluttes. Beholderen blir fjernet hvis den fortsetter å bruke minne over grensen. Kubelet starter en avsluttet beholder på nytt hvis den kan gjenopptas, omtrent som enhver annen form for runtime -svikt.

Her lager vi en pod. Denne poden vil prøve å tildele mer minne enn den allerede har gjort.

Konfigurasjonsfilen for en pod med en beholder og en minneforespørsel på 50 MIB og en minnegrense på 100 MIB er som følger:

I følge Args -delen av konfigurasjonsfilen vil beholderen prøve å tildele 250 mib RAM, betydelig over 100 mib -grensen.

Igjen, vi har laget poden her.

Her kan du se podens omfattende informasjon. Containeren kjører enten eller ikke på dette tidspunktet. Gjentakelse av den forrige kommandoen til containeren er drept er påkrevd:

Få et mer dyptgående blikk på beholderens status. I følge utgangen ble beholderen ødelagt fordi den gikk tom for minnet.

I dette eksemplet starter Kubelet på nytt containeren fordi den kan startes på nytt. Gjenta denne kommandoen flere ganger for å sikre at beholderen blir drept og startet på nytt regelmessig. I følge utgangen blir beholderen drept, gjenopprettet, drept igjen, initiert igjen osv.

Følgende kommando lar deg se omfattende informasjon relatert til podens historie.

Resultatet avslører at beholderen stadig starter og stopper:

Her kan du se den detaljerte informasjonen om klyngens noder:

En oversikt over containeren som blir drept på grunn av et problem utenom minnet er inkludert i utdataene:

Denne kommandoen sletter poden, som du kan se nedenfor.

Hva bør du gjøre hvis du har en minneforespørsel som er for stor for nodene dine?

Minneforespørsler og begrensninger er vanligvis knyttet til containere, men det er også nyttig å tenke på pods som å ha minneforespørsler og begrensninger. Minneforespørselen er definert som totalen av alle minnebehov for alle containere i POD.
Pods er planlagt og vedlikeholdt via forespørsler.

Her bygger vi en pod med en større minneforespørsel enn noen node i klyngens kapasitet.

Her er konfigurasjonsfilen for en pod, inkludert en beholder og et 1000 GIB -minnebehov, som sannsynligvis er mer enn noen node i klyngen din kan administrere.

Følgende Apply -kommando oppretter poden, som du kan se.

Nå bruk av "Get Pod" -kommandoen. Statusen til poden er i påvente (se utdataene). Poden er ikke satt til å kjøre på en hvilken som helst node og vil forbli i påvente av på ubestemt tid.

Denne kommandoen vil hjelpe deg med å se flere detaljer om poden, inkludert kommende arrangementer:

Utgangen viser at beholderen ikke kan planlegges fordi nodene ikke har nok minne:

Hva skjer hvis du ikke spesifiserer en minnegrense?

Et av følgende scenarier oppstår hvis du ikke definerer en minnegrense for en beholder:

  • Beholderen har ingen grense for hvor mye RAM den kan bruke. OOM -morderen kan utløses hvis beholderen bruker alt tilgjengelig minne på noden der den har kjørt. Videre vil Acontainer uten ressursbegrensninger ha en høyere risiko for å bli drept i tilfelle et OOM -drap.
  • Beholderen utføres i et navneområde med en standardminnegrense, og standardgrensen brukes automatisk på beholderen. Klyngeadministratorer kan bruke en grense for å angi et standardnummer for minnegrensen.

Konklusjon:

Vi så nærmere på Kubernetes oomkilled feil i denne artikkelen. Det hjelper Kubernetes i å håndtere minne mens du planlegger pods og bestemmer hvilke pods å ødelegge når ressursene blir mangelvare.