Hur prioriteringar av poddar i Kubernetes orsakade driftstopp pÄ Grafana Labs

Obs. övers.: Vi presenterar tekniska detaljer om orsaken till det senaste driftstoppet hos molntjĂ€nsten som drivs av skaparna av Grafana. Detta Ă€r ett klassiskt exempel pĂ„ hur en ny och, till synes, oerhört nyttig funktion, avsedd att förbĂ€ttra infrastrukturen
 kan orsaka problem om man inte tar hĂ€nsyn till de mĂ„nga nyanser som pĂ„verkar dess anvĂ€ndning i produktion. Det Ă€r fantastiskt nĂ€r sĂ„dana hĂ€r material dyker upp som gör att man kan lĂ€ra sig inte bara av sina egna misstag. Detaljer finns i översĂ€ttningen av denna text frĂ„n vice VD för produkt pĂ„ Grafana Labs.

Hur pod-prioriteringar i Kubernetes orsakade driftstopp pÄ Grafana Labs

Fredagen den 19 juli slutade tjÀnsten Hosted Prometheus i Grafana Cloud att fungera i ungefÀr 30 minuter. Jag ber om ursÀkt till alla kunder som drabbades av avbrottet. VÄrt mÄl Àr att tillhandahÄlla de verktyg som behövs för övervakning, och vi förstÄr att deras otillgÀnglighet försvÄrar er vardag. Vi tar denna incident pÄ stort allvar. I denna notis förklaras vad som hÀnde, hur vi reagerade och vad vi gör för att förhindra att detta hÀnder igen.

Bakgrund

Grafana Cloud Hosted Prometheus-tjĂ€nsten Ă€r baserad pĂ„ Cortex — CNCF-projektet för att skapa en horisontellt skalbar, hög tillgĂ€nglighet, multitenant-tjĂ€nst för Prometheus. Cortex-arkitekturen bestĂ„r av en uppsĂ€ttning separata mikroservicer, var och en med sin egen funktion: replikering, lagring, förfrĂ„gningar osv. Cortex utvecklas aktivt, nya funktioner tillkommer stĂ€ndigt och prestandan förbĂ€ttras. Vi distribuerar regelbundet nya versioner av Cortex till kluster sĂ„ att kunderna kan dra nytta av dessa funktioner - tack och lov kan Cortex uppdateras utan driftstopp.

För uppdateringar utan driftstopp krĂ€ver tjĂ€nsten Ingester i Cortex en extra Ingester-replik under uppdateringsprocessen. (Obs. övers.: Ingester — en grundlĂ€ggande komponent i Cortex. Dess uppgift Ă€r att samla in en konstant ström av prover, gruppera dem i chunkar för Prometheus och spara dem i databaser som DynamoDB, BigTable eller Cassandra. Det gör det möjligt för gamla Ingester att skicka aktuella data till nya Ingester. Det Ă€r vĂ€rt att notera att Ingester Ă€r resurskrĂ€vande. För deras drift behövs 4 kĂ€rnor och 15 GB minne per pod, vilket innebĂ€r 25% av CPU-kraften och minnet för den grundlĂ€ggande maskinen i vĂ„ra Kubernetes-kluster. Generellt har vi vanligtvis mycket mer oanvĂ€nda resurser i klustret Ă€n 4 kĂ€rnor och 15 GB minne, sĂ„ vi kan enkelt köra dessa extra Ingester under uppdateringar.

Men det hÀnder ofta att det under normala driftförhÄllanden inte finns nÄgra 25% oanvÀnda resurser pÄ nÄgon av maskinerna. Och vi strÀvar inte efter det: CPU och minne behövs alltid för andra processer. För att lösa detta problem har vi beslutat att anvÀnda Kubernetes Pod Prioriteter. Tanken Àr att tilldela Ingester ett högre prioritet Àn andra (stateless) mikrotjÀnster. NÀr vi behöver starta en extra (N+1) Ingester, tillfÀlligt flyttar vi andra, mindre pods. Dessa pods flyttas till lediga resurser pÄ andra maskiner, vilket lÀmnar ett tillrÀckligt stort "hÄl" för att starta en extra Ingester.

Torsdagen den 18 juli införde vi fyra nya nivÄer av prioriteringar i vÄra kluster: kritisk, en hög, medel och lÄg. De testades pÄ det interna klustret utan kundtrafik i ungefÀr en vecka. Som standard fick pods utan angiven prioritet medel prioritet, medan Ingester hade en klass med hög prioritet. Kritisk var reserverad för övervakning (Prometheus, Alertmanager, node-exporter, kube-state-metrics osv.). VÄr konfiguration Àr öppen, och du kan se PR:en hÀr.

Krasch

Fredagen den 19 juli startade en av ingenjörerna ett nytt dedikerat Cortex-kluster för en stor kund. Konfigurationen för detta kluster inkluderade inte de nya prioriteringarna för pods, sĂ„ alla nya pods fick standardprioritet — medel.

Kubernetes-klustret hade inte tillrÀckligt med resurser för det nya Cortex-klustret, och det befintliga produktionsklustret för Cortex hade inte uppdaterats (Ingester kvarstod utan hög prioritet). Eftersom Ingester i det nya klustret som standard hade medel prioritet, och de befintliga produktionspoddarna fungerade helt utan prioritet, trÀngde Ingester frÄn det nya klustret ut Ingester frÄn det befintliga produktionsklustret för Cortex.

ReplicaSet för den utdrivna Ingester i produktionsklustret upptÀckte den utdrivna podden och skapade en ny för att upprÀtthÄlla det angivna antalet kopior. Den nya podden tilldelades som standard medel prioritet, och den "gamla" Ingester i produktionen förlorade resurser. Resultatet blev en lavinartad process, som ledde till att alla poddar med Ingester för produktionskluster av Cortex drevs ut.

Ingester Àr tillstÄndsinriktade och lagrar data frÄn de senaste 12 timmarna. Detta gör att vi mer effektivt kan komprimera dem innan de skrivs till lÄngtidslagring. För detta utför Cortex datasharding baserat pÄ serier, anvÀnder en distribuerad hash-tabell (Distributed Hash Table, DHT), och replikerar varje serie pÄ tre Ingester med hjÀlp av kvorumkonsensus i stilen av Dynamo. Cortex skriver inte data till Ingester som Àr avstÀngda. DÀrför, nÀr ett stort antal Ingester lÀmnar DHT, kan Cortex inte sÀkerstÀlla tillrÀcklig replikation av poster, och de "faller".

UpptÀckta och ÄtgÀrdande

Nya Prometheus-notifikationer baserade pĂ„ "felbudget" (error-budget-based — detaljer kommer i en framtida artikel) började ge larm efter 4 minuter frĂ„n det att avstĂ€ngningen började. Under de följande fem minuterna diagnostiserade vi problemet och ökade den underliggande Kubernetes-klustret för att rymma bĂ„de nya och befintliga produktionskluster.

Ytterligare fem minuter senare hade de gamla Ingester lyckats skriva sina data, medan de nya startade, och Cortex-klustren blev Äterigen tillgÀngliga.

Ytterligare 10 minuter gick Ät till att diagnostisera och ÄtgÀrda out-of-memory (OOM) fel frÄn autentiseringens omvÀnda proxyservrar som lÄg framför Cortex. OOM-felen orsakades av en tiodubbling av QPS (som vi misstÀnker beror pÄ överdrivet aggressiva förfrÄgningar frÄn klientens Prometheus-servrar).

Konsekvenser

Den totala driftstoppstiden var 26 minuter. Data gick inte förlorade. Ingester lyckades ladda alla in-memory-data till lagringslösningen. Under avstÀngningen buffrade Prometheus-servrarna hos kunderna de (remote) poster med hjÀlp av den nya API:en remote_write baserad pÄ WAL (skapad av Callum Styan frÄn Grafana Labs) och upprepade de misslyckade posterna efter kraschen.

Hur pod-prioriteringar i Kubernetes orsakade driftstopp pÄ Grafana Labs
Skrivoperationer för produktionsklustret

Slutsatser

Det Àr viktigt att dra lÀrdomar frÄn denna incident och vidta nödvÀndiga ÄtgÀrder för att förhindra att den upprepas.

NÀr man ser tillbaka mÄste man erkÀnna att vi inte skulle ha stÀllt in prioritet som standard medel förrÀn alla Ingester i produktion hade fÄtt en hög prioritet. Dessutom borde vi ha sett till deras höga prioritet i förvÀg. Nu Àr allt ÄtgÀrdat. Vi hoppas att vÄr erfarenhet kommer att hjÀlpa andra organisationer som övervÀger att anvÀnda pod-prioriteringar i Kubernetes.

Vi kommer att lĂ€gga till en extra kontrollnivĂ„ för distributionen av eventuella ytterligare objekt vars konfigurationer Ă€r globala för klustret. Framöver kommer sĂ„dana Ă€ndringar att bedömas avbĂ€sta resultatet (subjektiv Ă„sikt).ett större antal personer. Dessutom ansĂ„gs modifieringen som ledde till felet vara för obetydlig för ett separat projekt dokument — den diskuterades endast i GitHub-Ă€rendet. FrĂ„n och med nu kommer alla sĂ„dana konfigurationsĂ€ndringar att Ă„tföljas av motsvarande projektdokumentation.

Slutligen kommer vi att automatisera skalningen av autentiseringsproxy-servern för att förhindra OOM vid överbelastning, vilket vi bevittnat, och analysera standardinstÀllningarna i Prometheus relaterade till rollback och skalning för att förhindra liknande problem i framtiden.

Det fel som upplevdes hade ocksĂ„ vissa positiva konsekvenser: genom att fĂ„ tillgĂ„ng till de nödvĂ€ndiga resurserna Ă„terhĂ€mtade sig Cortex automatiskt utan ytterligare ingripande. Vi fick ocksĂ„ vĂ€rdefull erfarenhet av att arbeta med Grafana Loki — vĂ„rt nya loggaggregationssystem, — som hjĂ€lpte till att sĂ€kerstĂ€lla att alla Ingester fungerade korrekt bĂ„de under och efter felet.

P.S. frÄn översÀttaren

LÀs Àven 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