Problem med DNS i Kubernetes. Offentligt postmortem

Obs. övers.: detta är en översättning av en offentlig postmortem från ingenjörsbloggen för företaget Preply. Den beskriver problemet med conntrack i Kubernetes-klustret som ledde till delvis stillestånd av vissa produktionsservrar.

Den här artikeln kan vara användbar för dem som vill veta lite mer om postmortems eller förhindra vissa potentiella DNS-problem i framtiden.

Problem med DNS i Kubernetes. Offentligt postmortem
Detta är inte DNS
Det kan inte vara att det är DNS
Det var DNS

Lite om postmortems och processerna på Preply

I postmortemet beskrivs ett driftstopp eller något annat evenemang i produktionen. Postmortemet innehåller en tidslinje med händelser, beskrivning av påverkan på användaren, grundorsaken, åtgärder och lärdomar.

Söker SRE

Vid våra veckovisa möten med pizza, i den tekniska teamets krets, delar vi med oss av olika information. En av de viktigaste delarna av sådana möten är postmortems, som ofta åtföljs av en presentation med bilder och en djupare analys av den inträffade incidenten. Trots att vi inte "applåderar" efter postmortems strävar vi efter att främja en "blame-free"-kultur (blame-free culture). Vi tror att skrivandet och presentationen av postmortems kan hjälpa oss (och inte bara oss) att förhindra liknande incidenter i framtiden, därför delar vi med oss av dem.

Personer som varit involverade i incidenten måste känna att de kan berätta om den i detalj utan att frukta bestraffning eller hämnd. Ingen bestraffning! Att skriva ett postmortem är inte ett straff utan en möjlighet till lärande för hela företaget.

Keep CALMS & DevOps: S står för Dela

DNS-problem i Kubernetes. Postmortem

Datum: 28.02.2020

Författare: Amet U., Andrey S., Igor K., Alexey P.

Status: Avslutat

Kort sagt: Delvis otillgänglighet av DNS (26 min) för vissa tjänster i Kubernetes-klustret

Påverkan: 15000 händelser förlorade för tjänsterna A, B och C

Grundorsak: Kube-proxy kunde inte korrekt ta bort den gamla posten från conntrack-tabellen, därför fortsatte vissa tjänster att försöka ansluta till icke-existerande pods

E0228 20:13:53.795782 1 proxier.go:610] Misslyckades med att ta bort kube-system/kube-dns:dns slutpunktsanslutningar, fel: fel vid borttagning av conntrack-poster för UDP-peer {100.64.0.10, 100.110.33.231}, fel: conntrack-kommandot returnerade: ...

Trigger: På grund av låg belastning inom Kubernetes-klustret minskade CoreDNS-autoskalan antalet pods i distributionen från tre till två

Lösningen: En ny deployment av applikationen initierade skapandet av nya noder, CoreDNS-autoscaler lade till fler pods för att betjäna klustret, vilket ledde till en överskrivning av conntrack-tabellen.

Upptäckte: Prometheus-monitorering upptäckte ett stort antal 5xx-fel för tjänsterna A, B och C och initierade ett samtal till jouringenjörerna.

Problem med DNS i Kubernetes. Offentligt postmortem
5xx-fel i Kibana

Åtgärder

för konsolen nu:
Typ
Ansvarig
Uppgift

Inaktivera autoskaleren för CoreDNS
förhindra.
Amet U.
DEVOPS-695

Installera en cachande DNS-server
minska.
Max V.
DEVOPS-665

Konfigurera conntrack-monitorering
förhindra.
Amet U.
DEVOPS-674

Lärdomar

Vad gick bra:

  • Övervakningen fungerade effektivt. Reaktionen var snabb och organiserad.
  • Vi nådde inte några gränser på noderna.

Vad som var fel:

  • Den verkliga grundorsaken är fortfarande okänd, verkar vara ett specifikt fel. i conntrack.
  • Alla åtgärder åtgärdar endast konsekvenserna, inte grundorsaken (felet).
  • Vi visste att vi förr eller senare skulle få problem med DNS, men prioriterade inte uppgifterna.

Där vi hade tur:

  • En ny deployment triggade CoreDNS-autoscaler, som överskrev conntrack-tabellen.
  • Detta fel påverkade bara en del av tjänsterna.

Tidslinje (EET)

Tid
för konsolen nu:

22:13
CoreDNS-autoscaler minskade antalet pods från tre till två.

22:18
Jouringenjörerna började få samtal från övervakningssystemet.

22:21
Jouringenjörerna började undersöka orsaken till felen.

22:39
Jouringenjörerna började rulla tillbaka en av de senaste tjänsterna till en tidigare version.

22:40
5xx-fel slutade dyka upp, situationen stabiliserades.

  • Tid till upptäckten: 4 min
  • Tid till åtgärdande: 21 min
  • Tid till rättelse: 1 min

Ytterligare information

För att minimera CPU-användningen använder Linux-kärnan något som kallas conntrack. Kort sagt är det en tjänst som innehåller en lista över NAT-poster som lagras i en specialtabell. När nästa paket kommer från samma pod till samma pod som tidigare, beräknas inte den slutliga IP-adressen på nytt utan tas från conntrack-tabellen.
Problem med DNS i Kubernetes. Offentligt postmortem
Hur conntrack fungerar.

Sammanfattning

Detta var ett exempel på en av våra postmortems med några användbara länkar. Specifikt i den här artikeln delar vi information som kan vara användbar för andra företag. Därför är vi inte rädda för att göra misstag och därför har vi gjort en av våra postmortems offentliga. Här är några fler intressanta offentliga postmortems:

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