Uppdatering av Kubernetes-kluster utan driftstopp

Uppdatering av Kubernetes-kluster utan driftstopp

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 "Frivillig Störning".

Detta inlÀgg Àr en del av en serie pÄ 4 inlÀgg:

  1. Detta inlÀgg.
  2. Korrekt avstÀngning av poddar i ett Kubernetes-kluster
  3. Fördröjd avstÀngning av en pod vid dess borttagning
  4. 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:

Uppdatering av Kubernetes-kluster utan driftstopp

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 TERM signalen. NĂ€r poddar avhyses skickar Kubernetes en signal TERM till 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: 80

Denna 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 Gruntwork.io.

LÀs Àven andra artiklar i vÄr blogg:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster