
Uppdateringsprocessen för din Kubernetes-kluster
Vid nÄgot tillfÀlle nÀr du anvÀnder ett Kubernetes-kluster uppstÄr behovet av att uppdatera de befintliga noderna. Det kan innefatta paketuppdateringar, kÀrnuppdateringar eller distribution av nya virtuella maskinbilder. Inom Kubernetes-terminologi kallas detta .
Detta inlÀgg Àr en del av en serie pÄ 4 inlÀgg:
- Detta inlÀgg.
- Korrekt avstÀngning av poddar i ett Kubernetes-kluster
- Fördröjd avstÀngning av en pod vid dess borttagning
- Hur man undviker stillestÄnd i ett Kubernetes-kluster med hjÀlp av PodDisruptionBudgets
(not. övers. översÀttningar av de övriga artiklarna i serien kan förvÀntas inom kort)
I denna artikel kommer vi att beskriva alla verktyg som Kubernetes tillhandahÄller för att uppnÄ noll stillestÄndstid för de noder som körs i ditt kluster.
Problemdefinition
Till att börja med kommer vi att anvÀnda en naiv metod för att identifiera problem och utvÀrdera de potentiella riskerna med denna metod och samla kunskap för att lösa varje problem vi stöter pÄ under hela serien. Resultatet blir en konfiguration som anvÀnder lifecycle hooks, readiness probes och Pod disruption budgets för att uppnÄ vÄr noll stillestÄndstid.
För att börja vÄr resa, lÄt oss ta ett konkret exempel. Antag att vi har ett Kubernetes-kluster med tvÄ noder dÀr en applikation körs med tvÄ poddar som ligger bakom TjÀnst:

Vi börjar med tvÄ poddar med Nginx och en TjÀnst som körs pÄ vÄra tvÄ noder i Kubernetes-klustret.
Vi vill uppdatera kĂ€rnversionen av de tvĂ„ arbetsnoderna i vĂ„rt kluster. Hur gör vi det? En enkel lösning skulle vara att ladda nya noder med den uppdaterade konfigurationen och sedan stĂ€nga av de gamla noderna samtidigt som de nya startas. Ăven om det skulle fungera, finns det flera problem med denna metod:
- NÀr du stÀnger av de gamla noderna kommer de körda poddarna pÄ dem ocksÄ att stÀngas av. Vad hÀnder om poddarna behöver rensas för korrekt avstÀngning? Den virtualiseringssystem du anvÀnder kanske inte vÀntar pÄ att rensningsprocessen ska avslutas.
- Vad hÀnder om du stÀnger av alla noder samtidigt? Du kommer att fÄ ett betydande stillestÄnd medan poddarna flyttar över till de nya noderna.
Vi behöver en metod för korrekt migrering av poddar frÄn gamla noder och samtidigt vara sÀkra pÄ att inga av vÄra arbetsflöden körs medan vi gör Àndringar för noden. Eller nÀr vi gör en fullstÀndig ersÀttning av klustret, som i exemplet (det vill sÀga byter ut VM-bilder), vill vi överföra aktiva applikationer frÄn gamla noder till nya. I bÄda fallen vill vi förhindra planering av nya poddar pÄ gamla noder och sedan avhysa alla körande poddar frÄn dem. För att uppnÄ dessa mÄl kan vi anvÀnda kommandot kubectl drain.
Ombalansering av alla poddar frÄn noden
Drain-operationen möjliggör ombalansering av alla poddar frÄn noden. Under utförandet av drain markeras noden som unschedulable (flagga NoSchedule). Detta förhindrar nya poddar frÄn att starta pÄ den. Drain börjar sedan avhysa poddar frÄn noden, avslutar alla behÄllare som för nÀrvarande körs pÄ noden genom att skicka en signal TERM till behÄllarna i podden.
Ăven om kubectl drain Ăven om det fungerar bra för avhysning av poddar, finns det tvĂ„ faktorer som kan orsaka misslyckande vid utförande av drain-operationen:
- Din applikation mÄste kunna avslutas korrekt nÀr den fÄr
TERMsignalen. NÀr poddar avhyses skickar Kubernetes en signalTERMtill behÄllarna och vÀntar pÄ att de ska stoppa under en angiven tidsperiod, efter vilken, om de inte har stoppat, avslutas de tvingat. I alla fall, om din behÄllare inte hanterar signalen korrekt, kan du fortfarande stÀnga ner poddar pÄ ett olÀmpligt sÀtt om de för nÀrvarande Àr aktiva (till exempel om en transaktion pÄgÄr i databasen). - Du förlorar alla poddar som innehÄller din applikation. Den kan vara otillgÀnglig vid starten av nya behÄllare pÄ de nya noderna eller, om dina poddar har distribuerats utan kontroller, kanske de inte startar om överhuvudtaget.
Undvik stillestÄnd
För att minimera stillestÄndstid vid frivilliga störningar, som vid drain-operationer för noder, erbjuder Kubernetes följande alternativ för att hantera fel:
I övriga delar av cykeln kommer vi att anvÀnda dessa Kubernetes-funktioner för att mildra konsekvenserna av flytt av poddar. För att lÀttare följa huvudtankegÄngen kommer vi att anvÀnda vÄrt exempel ovan med följande resurskonfiguration:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
targetPort: 80
port: 80Denna konfiguration Àr ett minimalt exempel Deployment, som hanterar nginx-poddar i klustret. Dessutom beskriver konfigurationen en resurs TjÀnst, som kan anvÀndas för att fÄ Ätkomst till nginx-poddarna i klustret.
Under hela cykeln kommer vi iterativt att utöka denna konfiguration sÄ att den i slutÀnden omfattar alla funktioner som Kubernetes erbjuder för att minska stillestÄndstiden.
För att fÄ en helt implementerad och testad version av Kubernetes-klusteruppdateringar med noll stillestÄndstid pÄ AWS och andra resurser, besök .
LÀs Àven andra artiklar i vÄr blogg:
KĂ€lla: habr.com
