Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Jag heter Viktor Yagofarov och jag arbetar med utvecklingen av Kubernetes-plattformen pÄ företaget DomClick som teknisk utvecklingsledare inom Ops-teamet (drift). Jag skulle vilja berÀtta om hur vÄra Dev Ops-processer fungerar, om de unika egenskaperna hos en av de största k8s-klustrarna i Ryssland, samt om DevOps/SRE-praktiker som vÄrt team tillÀmpar.

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Ops-teamet

I Ops-teamet arbetar för nÀrvarande 15 personer. Tre av dem ansvarar för kontoret, tvÄ arbetar i en annan tidszon och Àr tillgÀngliga, Àven pÄ natten. PÄ sÄ sÀtt finns det alltid nÄgon frÄn Ops vid skÀrmen och Àr redo att reagera pÄ incidenter av alla svÄrighetsgrader. Vi har inga nattpass, vilket skyddar vÄr mentala hÀlsa och ger alla möjlighet att fÄ tillrÀckligt med sömn och tillbringa fritiden inte bara framför datorn.

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Kompetenserna Àr varierande: nÀtverksspecialister, DBA, experter pÄ ELK-stack, Kubernetes-administratörer/utvecklare, övervakningsexperter, virtualisering, hÄrdvara osv. Det som förenar oss Àr att var och en av oss kan ersÀtta den andra till viss del: till exempel, lÀgga till nya noder i k8s-klustret, uppdatera PostgreSQL, skriva CI/CD-pipelines + Ansible, automatisera nÄgot i Python/Bash/Go, koppla ihop hÄrdvara i datacentret. Starka kompetenser inom ett omrÄde hindrar inte att man byter inriktning och börjar utvecklas inom ett annat omrÄde. Till exempel började jag pÄ företaget som PostgreSQL-specialist, och nu Àr mitt huvudansvarsomrÄde Kubernetes-kluster. I teamet uppskattas all tillvÀxt och kÀnslan av stöd Àr vÀldigt stark.

För övrigt rekryterar vi. Kraven pÄ kandidater Àr ganska standardiserade. Personligen tycker jag att det Àr viktigt att personen passar in i teamet, Àr konfliktskör men ocksÄ kan stÄ upp för sin Äsikt, vill utvecklas och inte Àr rÀdd för att göra nÄgot nytt, samt att de ger sina egna idéer. Det Àr ocksÄ obligatoriskt med programmeringskunskaper i skriptsprÄk, förstÄelse för grunderna i Linux och engelska. Engelska behövs helt enkelt sÄ att personen, vid en eventuell nödsituation, kan googla lösningen pÄ problemet pÄ 10 sekunder istÀllet för 10 minuter. Det Àr nu mycket svÄrt att hitta specialister med djup kunskap om Linux: det Àr löjligt, men tvÄ av tre kandidater kan inte svara pÄ frÄgan "Vad Àr Load Average? Vad bestÄr det av?", och frÄgan "Hur samlar man en core dump frÄn ett C-program" betraktas som nÄgot frÄn en supermÀnniska... eller dinosaurier. Man fÄr acceptera detta, eftersom mÀnniskor vanligtvis har starka kompetenser pÄ andra omrÄden, och vi kan lÀra dem "Linux". Svaret pÄ frÄgan "varför detta Àr viktigt för en DevOps-ingenjör i dagens molnvÀrld" fÄr jag lÀmna utanför artikeln, men om jag ska sammanfatta det med tre ord: allt detta Àr nödvÀndigt.

Verktygsteamet

Verktygsteamet spelar en stor roll i automatiseringen. Deras huvuduppgift Àr att skapa anvÀndarvÀnliga grafiska och CLI-verktyg för utvecklare. Till exempel tillÄter vÄr interna utveckling Confer att man bokstavligen kan rulla ut en applikation i Kubernetes med bara nÄgra musklick, stÀlla in resurser, nycklar frÄn vault etc. Tidigare anvÀnde vi Jenkins + Helm 2, men vi var tvungna att utveckla vÄrt eget verktyg för att utesluta copy-paste och införa enhetlighet i programvarans livscykel.

Ops-teamet skriver inte pipelines för utvecklarna, men kan ge rÄd i alla frÄgor angÄende deras skrivande (nÄgra har fortfarande Helm 3).

DevOps

NÀr det kommer till DevOps ser vi det som följer:

Utvecklarteam skriver kod och rullar ut den genom Confer frÄn dev -> qa/stage -> prod. Ansvarigheten för att koden inte saktas ner eller ger fel ligger pÄ utvecklar- och ops-team. Under dagtid ska den jourhavande frÄn Ops-teamet reagera pÄ incidenter med sin applikation, medan under kvÀlls- och nattetid bör den jourhavande administratören (Ops) vÀcka den jourhavande utvecklaren om han Àr sÀker pÄ att problemet inte ligger i infrastrukturen. Alla metrik och larm i övervakningen upptrÀder automatiskt eller halvautomatiskt.

Ops ansvaromrĂ„de börjar frĂ„n det ögonblick applikationen gĂ„r live, men Ă€ven Dev:s ansvar tar inte slut dĂ€r – vi arbetar med samma saker och Ă€r i samma bĂ„t.

Utvecklarna konsulterar administratörer om hjÀlp med att skriva administrativa mikrotjÀnster (t.ex. Go backend + HTML5), och administratörer konsulterar utvecklarna om infrastrukturella frÄgor eller frÄgor relaterade till k8s.

För övrigt har vi överhuvudtaget ingen monolit, bara mikrotjÀnster. Antalet ligger för nÀrvarande mellan 900 och 1000 i prod k8s-klustret, om man mÀter pÄ antal deployment. Antalet pods varierar mellan 1700 och 2000. Det finns för nÀrvarande cirka 2000 pods i prod-klustret.

Jag kan inte ge exakta siffror, eftersom vi övervakar onödiga mikrotjÀnster och tar bort dem i ett semi-automatiskt lÀge. Att övervaka onödiga enheter i k8s hjÀlper oss useless-operator, vilket sparar resurser och pengar.

Resurshantering

Övervakning

Den grundlÀggande bestÄndsdelen i driften av ett stort kluster blir en vÀlbyggd och informativ övervakning. Vi har Ànnu inte funnit en universell lösning som tÀcker 100 % av alla önskemÄl kring övervakning, sÄ vi skapar periodvis olika skrÀddarsydda lösningar inom detta omrÄde.

  • Zabbix. Den gamla goda övervakningen, som Ă€r avsedd, framför allt, för att spĂ„ra det övergripande tillstĂ„ndet i infrastrukturen. Den meddelar oss nĂ€r en nod faller pĂ„ grund av CPU, minne, diskar, nĂ€tverk etc. Inget överkomplicerat, men vi har ocksĂ„ en separat DaemonSet med agenter genom vilka vi till exempel övervakar tillstĂ„ndet för DNS i klustret: vi letar efter segande pods av coredns, kontrollerar Ă„tkomligheten av externa vĂ€rdar. Man kan tycka att det Ă€r onödigt att krĂ„ngla med det, men vid stora trafikvolymer Ă€r denna komponent en allvarlig punkt för avbrott. Jag har tidigare beskrivit, kĂ€mpat med DNS-prestanda i klustret.
  • Prometheus Operator. En uppsĂ€ttning olika exporters ger en god översikt över alla komponenter i klustret. Sedan visualiserar vi allt detta pĂ„ stora dashboards i Grafana, och för aviseringar anvĂ€nder vi alertmanager.

Ett annat anvÀndbart verktyg för oss har blivit list-ingress. Vi skrev det efter att vi flera gÄnger stött pÄ en situation dÀr ett team blockerar ett annat teams Ingress, vilket orsakade 50x-fel. Nu kontrollerar utvecklarna innan live-deployment att ingen pÄverkas, och för mitt team Àr det ett bra verktyg för att initialt diagnostisera problem med Ingress. Det Àr lustigt att det först skrevs för administratörer och sÄg ganska "klumpigt" ut, men efter att verktyget blev populÀrt bland utvecklingsteamen, förÀndrades det kraftigt och började se ut mer som "en administratör gjorde ett webbgrÀnssnitt för administratörer". Snart kommer vi att överge detta verktyg och liknande situationer kommer att valideras redan innan pipeline-utrullningen.

Teamresurser i "Kuben"

Innan vi gÄr in pÄ exemplen, Àr det vÀrt att förklara hur vi arbetar med resursallokering för mikrotjÀnster.

För att förstĂ„ vilka team och i vilka mĂ€ngder de anvĂ€nder sina resurser (processor, minne, lokal SSD) tilldelar vi varje team sitt eget namnrymd i "Kuben" och begrĂ€nsar dess maximala kapaciteter för processor, minne och disk, efter att ha diskuterat teamens behov. SĂ„ledes blockerar ett team, i allmĂ€nhet, inte hela klustret för deployment genom att allokera tusentals kĂ€rnor och terabyte minne. Åtkomsten i namespace ges genom AD (vi anvĂ€nder RBAC). Namespace och deras grĂ€nser lĂ€ggs till genom en pull-begĂ€ran i GIT-repositoriet, och dĂ€refter distribueras allt automatiskt genom Ansible-pipeline.

Exempel pÄ resursallokering för ett team:

namespaces:

  chat-team:
    pods: 23
    limits:
      cpu: 11
      memory: 20Gi
    requests:
      cpu: 11
      memory: 20Gi

BegÀrningar och grÀnser

I "Kuben" BegĂ€ran – Ă€r det den mĂ€ngd garanterade reserverade resurser för pod (en eller flera Docker-containrar) i klustret. Limit – Ă€r den ogaranterade maxgrĂ€nsen. Det gĂ„r ofta att se pĂ„ grafer hur ett team stĂ€llt in för mĂ„nga begĂ€rningar för sina applikationer och inte kan deploya applikationen i "Kuben", eftersom alla begĂ€rningar i deras namespace redan Ă€r "förbrukade".

Den rÀtta lösningen pÄ en sÄdan situation: att titta pÄ det faktiska resursutnyttjandet och jÀmföra det med den begÀrda mÀngden (Request).

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster
Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

PÄ skÀrmdumparna ovan kan man se att "begÀrda" (Requested) CPU:er nÀrmar sig det faktiska antalet trÄdar, medan Limits kan överstiga det verkliga antalet CPU-trÄdar =)

LĂ„t oss nu ta en nĂ€rmare titt pĂ„ ett namespace (jag valde namespace kube-system – systemnamnrymd för komponenterna i "Kuben") och se förhĂ„llandet mellan faktisk processoranvĂ€ndning och minne i förhĂ„llande till begĂ€rt:

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Det Àr uppenbart att minne och CPU reserveras för systemtjÀnster i betydligt större utstrÀckning Àn vad som faktiskt anvÀnds. I fallet med kube-system Àr detta berÀttigat: det har förekommit att nginx ingress controller eller nodelocaldns i toppar har nÄtt CPU-grÀnsen och anvÀnt mycket RAM, dÀrför Àr den hÀr reserveringen motiverad. Dessutom kan vi inte förlita oss pÄ diagrammen frÄn de senaste 3 timmarna: det Àr önskvÀrt att se historiska mÀtvÀrden över en lÀngre tidsperiod.

Ett system för "rekomendationer" har utvecklats. Till exempel kan man hÀr se vilka resurser som skulle ha nytta av att höja "grÀnserna" (den övre tillÄtna grÀnsen) för att förhindra "throttling": stunden nÀr en redan har anvÀnt CPU eller minne under sin tilldelade tidskvant och vÀntar pÄ att bli "avfrostat":

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Och hÀr Àr pods som bör moderera sina begÀrningar:

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Om throttling + resursövervakning kan skrivas inte i en utan mÄnga artiklar, sÄ stÀll frÄgor i kommentarerna. Kort sagt kan jag sÀga att uppgiften att automatisera sÄdana metoder Àr ganska komplicerad och krÀver mycket tid och balans med "fönster"-funktioner och "CTE" i Prometheus / VictoriaMetrics (dessa termer Àr inom citat eftersom det i PromQL nÀstintill inte finns nÄgot som liknar det, och det krÀvs att skapa skrÀmmande frÄgor pÄ flera skÀrmar av text och arbeta med deras optimering).

I slutÀndan har utvecklarna verktyg för att övervaka sina namespaces i "Kuben", och de kan sjÀlva besluta var och nÀr de kan "skÀra ner" resurser för vilka applikationer, och vilka pods som kan fÄ hela CPU:n under natten.

Metodologier

I företaget, som nu Àr trendy, följer vi DevOps- och SRE-praktiker. NÀr företaget har 1000 mikrotjÀnster, cirka 350 utvecklare och 15 administratörer för hela infrastrukturen, mÄste man "vara trendy": bakom alla dessa "buzzwords" döljer sig ett akut behov av att automatisera allt och ingen ska vara flaskhals i processerna.

Som Ops tillhandahÄller vi olika mÀtvÀrden och instrumentpaneler för utvecklarna, kopplade till servicen svarstid och deras fel.

Vi anvĂ€nder sĂ„dana metodologier som: RED, ANVÄND och Golden Signals, genom att kombinera dem. Vi försöker minimera antalet instrumentpaneler sĂ„ att det med ett enda ögonkast Ă€r tydligt vilken tjĂ€nst som just nu degraderas (till exempel svarskoder per sekund, svarstid enligt 99:e percentilen), och sĂ„ vidare. SĂ„ snart nya metrik behövs för gemensamma instrumentpaneler ritar vi dem och lĂ€gger till dem.

Jag har inte ritat nÄgra diagram pÄ en mÄnad. Kanske Àr det ett bra tecken: det betyder att de flesta av "önskemÄlen" redan har förverkligats. Det har hÀnt att jag Ätminstone en gÄng om dagen under en vecka har ritat nÄgot nytt diagram.

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster

Det skapade resultatet Àr vÀrdefullt eftersom utvecklarna numera sÀllan gÄr till administratörerna med frÄgor om "var man kan se en viss metrik".

Implementering Service Mesh Àr inte lÄngt borta och bör underlÀtta livet för alla av oss, kollegor frÄn Tools Àr redan nÀra att implementera den abstrakta "Istio för den friska personen": livscykeln för varje HTTP(s)-begÀran kommer att synas i övervakningen, och det kommer alltid att vara möjligt att förstÄ "vid vilket steg allt gick snett" vid tjÀnsteinteraktion (och inte bara). Prenumerera pÄ nyheter frÄn Hubben pÄ DomKlick. =)

Stöd för Kubernetes-infrastruktur

Historiskt sett har vi anvĂ€nt en patchad version Kubespray – Ansible-roll för distribution, utvidgning och uppdatering av Kubernetes. Vid nĂ„got tillfĂ€lle togs stödet för non-kubeadm installationer bort frĂ„n huvudgrenen, och övergĂ„ngen till kubeadm föreslogs inte. Som ett resultat gjorde företaget Southbridge sin egen fork (med stöd för kubeadm och snabb fix av kritiska problem).

Processen för att uppdatera alla k8s-kluster ser ut sÄ hÀr:

  • Vi hĂ€mtar Kubespray frĂ„n Southbridge, jĂ€mför med vĂ„r gren, slĂ„r samman.
  • Vi rullar ut uppdateringen i Stress-"Kuben".
  • Vi utför uppdateringen en nod i taget (i Ansible Ă€r detta "serial: 1") i Dev-"Kuben".
  • Uppdaterar Prod pĂ„ lördag kvĂ€ll en nod Ă„t gĂ„ngen.

I framtiden finns planer pÄ att ersÀtta Kubespray med nÄgot snabbare och övergÄ till kubeadm.

Totalt har vi tre "Kuber": Stress, Dev och Prod. Vi planerar att starta en till (hot standby) Prod-"Kub" i det andra datacentret. Stress och Dev bor i "virtuella maskiner" (oVirt för Stress och VMWare cloud för Dev). Prod-"Kuben" lever pĂ„ "bar hĂ„rdvara": det Ă€r identiska noder med 32 CPU-trĂ„dar, 64-128 GB minne och 300 GB SSD RAID 10 — totalt finns det 50 stycken. Tre "smala" noder Ă€r avsatta för "master" Prod-"Kuben": 16 GB minne, 12 CPU-trĂ„dar.

För produktion föredrar vi att anvÀnda "bar hÄrdvara" och undviker onödiga lager som OpenStack: vi behöver inga "bullriga grannar" och CPU steal timeOch dessutom ökar komplexiteten i administrationen med ungefÀr det dubbla vid in-house OpenStack.

För CI/CD av "Kubernetes" och andra infrastrukturskomponenter anvÀnder vi en separat GIT-server, Helm 3 (vi övergick ganska smÀrtsamt frÄn Helm 2, men Àr mycket glada över alternativet atomic), Jenkins, Ansible och Docker. Vi Àlskar feature-brancher och deploy i olika miljöer frÄn ett och samma repository.

Slutsats

Kubernetes pÄ DomClick: hur man sover lugnt medan man hanterar en kluster med 1000 mikrotjÀnster
SÄ hÀr, i stora drag, ser processerna för DevOps ut pÄ företaget DomClick frÄn en driftingsenjörs perspektiv. Artikeln blev mindre teknisk Àn vad jag förvÀntade mig: sÄ hÄll utkik efter nyheter frÄn DomClick pÄ Habra: det kommer fler "hÄrdvaru"-artiklar om Kubernetes och mer.

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