Når du arbejder med Kubernetes, er det almindeligt at støde på forskellige afslutningskoder for dine containere. En af disse, som ofte giver anledning til spørgsmål, er Afslutningskode 143. Denne kode er ikke nødvendigvis en fejl i traditionel forstand, men snarere en indikation af, at en container er blevet stoppet på en bestemt måde – ved at modtage et SIGTERM-signal.
Afslutningskode 143 signalerer specifikt, at processen inde i containeren blev afsluttet som følge af en ekstern anmodning. Denne anmodning kommer typisk fra Kubernetes selv og initieres af forskellige operationelle årsager. Forståelsen af denne kode er afgørende for at kunne diagnosticere, hvorfor en container stoppede med at køre, og kan hjælpe med at identificere potentielle dybere problemer inden for dine implementeringer eller blot bekræfte, at en forventet operation er udført korrekt.

SIGTERM-signalet er en standardmåde for et operativsystem at informere en proces om, at den skal afslutte sine nuværende opgaver og lukke ned på en "graceful" måde. Dette giver applikationen mulighed for at rydde op, gemme data og frigive ressourcer, før den stopper helt. Afslutningskode 143 adskiller bevidste stop fra uventede fejl, hvilket giver værdifuld indsigt i applikationens adfærd og orkestreringens styringshandlinger.
Almindelige Scenarier, der Fører til Afslutningskode 143
Der er flere almindelige situationer i et Kubernetes-miljø, der kan resultere i, at en container modtager et SIGTERM signal og dermed afslutter med kode 143.
Pod Skaleringsoperationer
En af de mest almindelige årsager til Afslutningskode 143 er skaleringsoperationer. Når en implementering i Kubernetes skaleres ned – altså antallet af ønskede pod-replikaer reduceres – skal Kubernetes afslutte de overskydende pods for at matche den nye, ønskede tilstand. Denne handling initieres ved at sende et SIGTERM signal til de containere, der kører i de pods, der skal fjernes.
Signalet fungerer som en meddelelse til applikationerne om at afslutte på en kontrolleret måde. Dette giver dem mulighed for at fuldføre igangværende opgaver, håndtere åbne forbindelser og gemme nødvendige data, før de lukker helt ned. Denne proces er essentiel for at sikre, at skaleringsoperationer ikke forstyrrer applikationens funktionalitet eller forårsager tab af data. En vellykket graceful shutdown under skalering er et tegn på en sund implementering.
Pod Evakuering Grundet Ressourcebegrænsninger
I et Kubernetes-cluster kan individuelle noder løbe tør for ressourcer som hukommelse (memory) eller CPU. Når dette sker, kan Kubernetes-scheduleren beslutte at evakuere pods fra den pågældende node for at stabilisere dens tilstand og forhindre yderligere problemer. Denne evakueringsproces indebærer, ligesom skalering, at sende et SIGTERM signal til containerne i de pods, der skal evakueres. Signalet beder dem om at lukke ned på en graceful måde for at frigive ressourcer.
Dette scenarie understreger vigtigheden af korrekt ressourcekonfiguration for dine pods. Mens Afslutningskode 143 her er en del af den normale evakueringsproces, kan hyppige evakueringer indikere underdimensionerede noder eller ineffektiv ressourceallokering i clusteret.
Manuel Pod Sletning eller Rolling Updates
Når en pod manuelt slettes via `kubectl delete pod
Denne graceful termination er en nøglefunktion i Kubernetes, der understøtter høj tilgængelighed og robusthed for dine applikationer under ændringer og vedligeholdelse.
Hvorfor Bruger Kubernetes SIGTERM i Stedet for SIGKILL?
Ud over SIGTERM findes der også SIGKILL signalet, som er en anden måde at afslutte processer på. Forskellen er fundamental: SIGKILL tvangsafslutter en proces øjeblikkeligt og uden mulighed for oprydning. Kubernetes foretrækker konsekvent SIGTERM af flere vigtige årsager.
SIGTERM Sikrer, at Processer Kan Rydde Op Før Afslutning
Den primære årsag til at bruge SIGTERM er, at det giver processer muligheden for at rydde op i deres data og udføre nødvendige shutdown-procedurer, før de afsluttes. Denne tilgang er vital for at opretholde dataintegritet og sikre, at applikationer kan genoptage driften problemfrit efter en genstart. Det giver et kontrolleret miljø, hvor applikationen kan lukke databaser, gemme tilstand, afslutte netværksforbindelser og frigive ressourcer på en ordentlig måde. Dette minimerer risikoen for datakorruption eller tab, som ofte ville opstå ved en brat tvangsafslutning med SIGKILL.
SIGTERM Er Sikrere for Kubernetes Miljøet
Den sikkerhed, som SIGTERM tilbyder gennem graceful shutdown, hjælper med at forhindre miljømæssig korruption. Ved at tillade applikationer at lukke ned på en ren måde, minimerer Kubernetes risikoen for at efterlade systemet i en inkonsistent tilstand. Dette er især kritisk for komplekse applikationer, der administrerer store mængder data eller opretholder persistente forbindelser. Den ordentlige shutdown-proces, der muliggøres af SIGTERM, beskytter mod datatab og sikrer, at ressourcer frigives rent og effektivt.
SIGTERM UdLøser Automatisk SIGKILL, Hvis Poden Ikke Reagerer
Selvom SIGTERM foretrækkes, er Kubernetes robust nok til at håndtere situationer, hvor en container ikke reagerer på signalet eller nægter at afslutte. Hvis en pod ikke afslutter inden for en specificeret grace period (en tidsfrist), eskalerer Kubernetes afslutningsprocessen ved at sende et SIGKILL signal. Dette sikrer, at unresponsive processer tvangsafsluttes, hvilket opretholder clusterets stabilitet og ydeevne. Selv hvis en graceful shutdown ikke er mulig på grund af en fejlbehæftet eller fastlåst applikation, forhindrer SIGKILL, at disse processer blokerer for clusterets funktionalitet på ubestemt tid.
Sammenligning: SIGTERM vs. SIGKILL
For at opsummere forskellen mellem de to signaler, der bruges til at afslutte processer i Linux-baserede systemer, herunder containere i Kubernetes:
| Signal | Formål | Tillader Graceful Shutdown | Kan Ignoreres af Processen | Anvendes af Kubernetes |
|---|---|---|---|---|
| SIGTERM (Signal 15) | Anmodning om at afslutte. Bed processen om at lukke ned på en ordentlig måde. | Ja, hvis applikationen er designet til at håndtere det. | Ja, processen kan vælge at ignorere dette signal (dog sjældent ønskeligt). | Ja, primært brugt som første trin. |
| SIGKILL (Signal 9) | Tvingende afslutning. Afslutter processen øjeblikkeligt og uden varsel. | Nej. Ingen oprydning er mulig. | Nej, kan ikke fanges, blokeres eller ignoreres af processen. | Ja, som en sidste udvej efter grace period udløber. |
Denne tabel illustrerer tydeligt, hvorfor Kubernetes foretrækker den kooperative tilgang med SIGTERM, før den griber til den drastiske metode med SIGKILL.
Kubernetes Graceful Termination Process
Forståelsen af den sekvens, der fører til Afslutningskode 143, er nøglen til fejlfinding. Processen er veldefineret:
1. Pod'en Sættes til Terminating Status
Når en pod i Kubernetes markeres til afslutning, typisk som følge af en af de førnævnte operationer (skalering ned, evakuering, sletning), sættes dens status til 'Terminating'. Denne status indikerer, at pod'en har modtaget en anmodning om at lukke ned. Mens pod'en stadig eksisterer i clusteret, stoppes den med at modtage ny trafik, f.eks. ved at blive fjernet fra Service-endpoints. Denne status giver systemet tid til at håndtere ressourcer effektivt, samtidig med at pod'en får mulighed for at lukke ned på en ordentlig måde. Eventuelle igangværende opgaver skal fuldføres, og ressourcer skal frigives korrekt i denne fase.
2. preStop Hook Udføres (Hvis Defineret)
Kubernetes tilbyder en mekanisme kaldet en preStop hook. Dette er en handling (en kommando eller et script), der kan defineres i pod'ens specifikation. Hvis en preStop hook er defineret, udløses den efter, at SIGTERM signalet er sendt til containeren(e), men før hovedprocessen inde i containeren afsluttes (enten ved at reagere på SIGTERM eller ved en senere SIGKILL). Denne hook giver en mulighed for at udføre specifikke oprydnings- eller forberedende handlinger, der er nødvendige umiddelbart før shutdown. Dette kan omfatte at tømme en buffer, lukke en databaseforbindelse på en bestemt måde eller vente på, at igangværende anmodninger er færdige.
3. Et SIGTERM Signal Sendes til Pod'en
Umiddelbart efter (eller samtidigt med, afhængigt af implementering og hooks) at pod'ens status er sat til 'Terminating' og eventuelt efter preStop hook er kørt, sendes SIGTERM signalet til hovedprocessen (PID 1) inde i hver container i pod'en. Dette er det signal, der beder applikationen om at starte sin graceful shutdown-procedure. Hvis applikationen er designet til at håndtere SIGTERM, vil den nu forsøge at afslutte sine opgaver og frigive ressourcer.
4. Grace Period Begynder
Efter at SIGTERM signalet er sendt, starter Kubernetes en grace period. Dette er en foruddefineret tidsmængde, som pod'en har til at afslutte gracefully. Standardperioden er typisk 30 sekunder, men den kan konfigureres på pod-niveau (via `terminationGracePeriodSeconds` i pod-specifikationen). I løbet af denne periode forventes containerens processer at stoppe. Hvis processerne ikke er afsluttet inden for denne grace period, eskalerer Kubernetes afslutningen.
5. Et SIGKILL Signal Sendes til Pod'en
Hvis containerens processer stadig kører, når grace period udløber, sender Kubernetes et SIGKILL signal til pod'en. Som nævnt tidligere, tvangsafslutter dette signal processen øjeblikkeligt og uden mulighed for oprydning. Dette trin sikrer, at pod'en fjernes fra clusteret og de tilhørende ressourcer frigives, selv hvis applikationen ikke reagerede korrekt på SIGTERM. Selvom det er effektivt til at garantere afslutning, omgår SIGKILL den graceful shutdown-proces og bør undgås, hvis muligt, ved at konfigurere en passende grace period og sikre, at applikationen håndterer SIGTERM korrekt.
Bedste Praksis for at Undgå Uønskede Afslutningskode 143 Hændelser
Som nævnt er Afslutningskode 143 ofte et resultat af sunde Kubernetes-operationer. Men i visse tilfælde kan en container afslutte med denne kode på et uventet tidspunkt eller som et symptom på et underliggende problem (f.eks. hyppig evakuering). Her er nogle bedste praksis for at minimere uønskede Afslutningskode 143 hændelser og forbedre din evne til at diagnosticere dem.
Aktiver Container Logging for Modtagne Signaler
For at forstå, hvorfor en container afslutter, er detaljeret logging uundværlig. Konfigurer din applikation inde i containeren til at logge, når den modtager et SIGTERM signal. Inkluder information om tidspunktet og eventuel kontekst, såsom hvilke opgaver der var i gang. Disse logs giver værdifuld indsigt i afslutningsprocessen og kan hjælpe med at identificere, om applikationen har tilstrækkelig tid til at lukke ned, eller om der er problemer med dens shutdown-logik. Dette er afgørende for fejlfinding i forbindelse med graceful shutdowns.
Kør Én Applikation per Container
En fundamental bedste praksis i containerverdenen, som også er relevant her, er at køre én primær applikation (proces) per container. Dette forenkler styringen og øger forudsigeligheden af containerens adfærd, når den modtager et SIGTERM signal. Når der kun er én hovedproces at håndtere, er det lettere at implementere og teste korrekt signalhåndtering og sikre en ren shutdown. Det gør også ressourceallokering og skalering mere ligetil.
Konfigurer Pod Prioriteter, Ressourceanmodninger og Grænser
Korrekt konfiguration af pod-prioriteter, ressourceanmodninger (`requests`) og ressourcegrænser (`limits`) er afgørende for at forhindre unødvendige shutdowns, især dem der skyldes ressourcekonflikter og evakueringer. Ved at specificere, hvor meget CPU og hukommelse dine pods har brug for (requests) og maksimalt må bruge (limits), kan du hjælpe Kubernetes scheduler'en med at placere pods optimalt og undgå overbelastning af noder. Højere pod-prioriteter kan også beskytte kritiske applikationer mod at blive evakueret før lavere-prioriterede workloads under ressourceknaphed. Dette bidrager til at opretholde applikationens tilgængelighed og ydeevne.
Implementer Autoskalering for Automatisk Ressourcejustering
Brug af autoskaleringsmekanismer i Kubernetes, såsom Horizontal Pod Autoscaler (HPA) eller Cluster Autoscaler, kan hjælpe med at justere ressourcer automatisk baseret på efterspørgsel. Dette reducerer sandsynligheden for Afslutningskode 143 forårsaget af ressourcemangel eller ineffektiv allokering. Autoskalering kan øge eller mindske antallet af pod-replikaer som reaktion på den aktuelle belastning, hvilket sikrer, at applikationerne har de nødvendige ressourcer til at yde optimalt, samtidig med at unødvendigt ressourceforbrug undgås, som kunne føre til evakuering af andre pods.
Fejlfinding af Kubernetes med Lumigo
For at få dybere indsigt i dine Kubernetes-applikationers adfærd, herunder hvordan de håndterer afslutningssignaler, kan specialiserede fejlfindingsplatforme være yderst nyttige. Lumigo er en platform designet til fejlfinding i mikroservice-baserede applikationer. Udviklere, der bruger Kubernetes til at orkestrere deres containeriserede applikationer, kan bruge Lumigo til at overvåge, spore og fejlfinde problemer hurtigt.
Lumigo sigter mod at give omfattende synlighed i container-miljøer ved at sammensætte interaktioner mellem mikroservices og managed services til end-to-end sporinger. Disse sporinger, der præsenteres sammen med data fra anmodnings-payloads, giver et mere komplet billede af, hvad der sker i dine applikationer, herunder hvordan de reagerer på hændelser som SIGTERM. Platformen giver API-synlighed, distribueret sporing uden kodeændringer og en samlet platform til at udforske og forespørge på tværs af mikroservices.
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen mellem Afslutningskode 0 og Afslutningskode 143?
Afslutningskode 0 indikerer en succesfuld og planlagt afslutning af en proces, hvor processen selv har besluttet at stoppe og har afsluttet uden fejl. Afslutningskode 143 indikerer, at processen blev afsluttet som følge af et modtaget SIGTERM signal, hvilket er en ekstern anmodning om at lukke ned. Begge kan være en del af normal drift, men 143 specificerer årsagen som en ekstern anmodning via SIGTERM.
Hvorfor ser jeg Afslutningskode 143, selvom min applikation ikke har fejl?
Som forklaret, er Afslutningskode 143 ofte et tegn på en sund operation initieret af Kubernetes, såsom skalering ned, rolling updates eller ressourceevakuering. Hvis koden optræder i forventede scenarier, hvor Kubernetes beder din container om at lukke ned, er det ikke en fejl i din applikation, men snarere en bekræftelse på, at Kubernetes' orkestrering fungerer som tiltænkt.
Hvordan kan jeg teste, om min applikation håndterer SIGTERM korrekt?
Du kan teste din applikations SIGTERM håndtering ved manuelt at sende et SIGTERM signal til processen inde i din container (f.eks. ved at bruge `kubectl exec` og `kill` kommandoen med signal 15) eller ved at slette en enkelt pod, som din applikation kører i, og observere dens logs og afslutningsadfærd. Sørg for, at din applikation logger modtagelsen af signalet og udfører den forventede oprydning inden for den definerede grace period.
Hvad er en passende grace period for mine pods?
Den passende grace period (terminationGracePeriodSeconds) afhænger af, hvor lang tid din applikation realistisk har brug for til at afslutte igangværende opgaver, frigive ressourcer og rydde op efter at have modtaget et SIGTERM signal. En typisk standard er 30 sekunder, men for applikationer med langvarige forbindelser eller omfattende oprydning kan det være nødvendigt at sætte denne værdi højere. Test din applikations shutdown-proces for at bestemme det optimale interval.
Ved at forstå Afslutningskode 143 og de underliggende mekanismer i Kubernetes, kan du bedre diagnosticere applikationsadfærd, optimere dine implementeringer og sikre en mere robust og pålidelig drift af dine containeriserede workloads.
Hvis du vil læse andre artikler, der ligner Kubernetes Afslutningskode 143 Forklaret, kan du besøge kategorien Teknik.
