Att förbereda en Kubernetes-kluster Àr enkelt och bekvÀmt? Vi presenterar addon-operatorn

Att förbereda en Kubernetes-kluster Àr enkelt och bekvÀmt? Vi presenterar addon-operatorn

I takt med shell-operator introducerar vi hans Ă€ldre bror — addon-operator. Detta Ă€r ett Open Source-projekt som anvĂ€nds för att installera systemkomponenter i Kubernetes-klustret, som vi kan kalla med ett gemensamt ord — tillĂ€gg.

Varför överhuvudtaget nÄgra tillÀgg?

Det Àr ingen hemlighet att Kubernetes inte Àr en fÀrdig produkt allt-i-ett, och för att bygga en 'vuxen' kluster behövs olika tillÀgg. Addon-operator hjÀlper till att installera, konfigurera och hÄlla dessa tillÀgg uppdaterade.

Behovet av ytterligare komponenter i klustret redovisas i rapporten frÄn kollegan driusha. Kort sagt, situationen med Kubernetes just nu Àr sÄdan att för enkel installation för att 'leka' kan man klara sig med de inbyggda komponenterna, för utvecklare och testning kan man lÀgga till Ingress, men för en fullstÀndig installation, som kan sÀgas 'er produktion Àr klar', behöver man lÀgga till ett dussin olika tillÀgg: nÄgot för övervakning, nÄgot för loggar, att inte glömma ingress och cert-manager, att avsÀtta grupper av noder, lÀgga till nÀtverkspolicyer, krydda med sysctl-instÀllningar och pod autoscaler...

Att förbereda en Kubernetes-kluster Àr enkelt och bekvÀmt? Vi presenterar addon-operatorn

Vad Àr specifikationen för att arbeta med dem?

Som erfarenhet visar, Àr det inte bara en installation som krÀvs. För att arbeta bekvÀmt med klustret mÄste tillÀgg uppdateras, inaktiveras (ta bort frÄn klustret), och nÄgot vill man testa innan installationen i produktionsklustret.

SĂ„, kanske rĂ€cker det med Ansible? Kanske. Men fullstĂ€ndiga tillĂ€gg lever vanligtvis inte utan instĂ€llningar. Dessa instĂ€llningar kan variera beroende pĂ„ klusteralternativet (aws, gce, azure, bare-metal, do, 
). Vissa instĂ€llningar kan inte anges i förvĂ€g — de behöver hĂ€mtas frĂ„n klustret. Och klustret Ă€r inte statiskt: för vissa instĂ€llningar mĂ„ste man övervaka förĂ€ndringar. Och hĂ€r rĂ€cker inte Ansible: man behöver ett program som lever i klustret, dvs. Kubernetes Operator.

De som har provat att arbeta med shell-operator, kommer att sÀga att uppgifterna för att installera och uppdatera tillÀgg och följa instÀllningarna helt klart kan lösas med hjÀlp av hooks för shell-operator. Man kan skriva ett skript som gör ett hypotetiskt kubectl apply och övervaka, till exempel, ConfigMap dÀr instÀllningar kommer att lagras. UngefÀr sÄ hÀr Àr det genomfört i addon-operator.

Hur Àr detta organiserat i addon-operator?

NÀr vi skapade denna nya lösning utgick vi frÄn följande principer:

  • TillĂ€ggsinstallatören ska stödja mallning och deklarativ konfiguration. Vi anvĂ€nder inte magiska skript för att installera tillĂ€gg. Addon-operator anvĂ€nder Helm för att installera tillĂ€gg. För installation behövs en chart och ange de vĂ€rden som ska anvĂ€ndas för konfiguration.
  • InstĂ€llningar kan genereras vid installation, de kan hĂ€mtas frĂ„n klustret, eller fĂ„ uppdateringar, genom att följa klustrets resurser. Dessa operationer kan implementeras med hjĂ€lp av hooks.
  • InstĂ€llningar kan lagras i klustret. För att lagra instĂ€llningarna i klustret skapas en ConfigMap/addon-operator, och Addon-operator övervakar Ă€ndringar i denna ConfigMap. Addon-operator ger hooks Ă„tkomst till instĂ€llningarna genom enkla överenskommelser.
  • TillĂ€gget beror pĂ„ instĂ€llningarna. Om instĂ€llningarna Ă€ndras, rullar Addon-operator ut Helm-chartet med nya vĂ€rden. Kombinationen av Helm-charten, vĂ€rdena för den och hooks kallar vi för en modul (se mer nedan).
  • Staging. Det finns inga magiska release-skript. Uppdateringsmekanismen Ă€r lik den för en vanlig applikation — samla tillĂ€gg och addon-operator i en bild, tagga och rulla ut.
  • Resultatkontroll. Addon-operator kan ge metrics till Prometheus.

Vad Àr ett tillÀgg i addon-operator?

Ett tillĂ€gg kan ses som allt som lĂ€gger till nya funktioner i klustret. Till exempel, installation av Ingress — ett utmĂ€rkt exempel pĂ„ ett tillĂ€gg. Det kan vara vilken operator eller controller som helst med sin egen CRD: prometheus-operator, cert-manager, kube-controller-manager, etc. Eller nĂ„got litet men som förenklar drift — exempelvis en secret copier som kopierar registry-hemligheter till nya namnrymder, eller en sysctl tuner som justerar sysctl-parametrar pĂ„ nya noder.

För att implementera tillÀgg tillhandahÄller Addon-operator flera koncept:

  • Helm-chart anvĂ€nds för att installera olika mjukvaror i klustret — till exempel Prometheus, Grafana, nginx-ingress. Om en komponent har ett Helm-chart, blir det mycket enkelt att installera det med Addon-operator.
  • VĂ€rdeslager. Helm-charts har vanligtvis mĂ„nga olika instĂ€llningar som kan förĂ€ndras över tid. Addon-operator stöder lagring av dessa instĂ€llningar och kan övervaka deras Ă€ndringar för att reinstallera Helm-charten med nya vĂ€rden.
  • Hooks — Ă€r exekverbara filer som Addon-operator kör vid hĂ€ndelser och ger Ă„tkomst till vĂ€rdeförrĂ„det. Hook kan övervaka Ă€ndringar i klustret och uppdatera vĂ€rdena i vĂ€rdeförrĂ„det. Det vill sĂ€ga, med hjĂ€lp av hooks kan man göra discovery för att samla vĂ€rden frĂ„n klustret vid uppstart eller enligt schema, eller sĂ„ kan man göra continous discovery, och samla vĂ€rden frĂ„n klustret vid Ă€ndringar i klustret.
  • Modul — Ă€r en kombination av Helm-chart, vĂ€rdeförrĂ„d och hooks. Moduler kan aktiveras och deaktiveras. Att deaktivera en modul innebĂ€r att ta bort alla versioner av Helm-charten. Moduler kan dynamiskt aktivera sig sjĂ€lva, till exempel om alla nödvĂ€ndiga moduler Ă€r aktiverade eller om discovery i hooks har hittat nödvĂ€ndiga parametrar — detta görs med hjĂ€lp av ett hjĂ€lpskript med namnet enabled.
  • Globala hooks. Detta Ă€r hooks 'pĂ„ egen hand', de ingĂ„r inte i moduler och har Ă„tkomst till det globala vĂ€rdeförrĂ„det, vars vĂ€rden Ă€r tillgĂ€ngliga för alla hooks i moduler.

Hur fungerar dessa delar tillsammans? LÄt oss titta pÄ en bild frÄn dokumentationen:

Att förbereda en Kubernetes-kluster Àr enkelt och bekvÀmt? Vi presenterar addon-operatorn

Det finns tvÄ scenarier:

  1. Det globala hooket körs vid en hĂ€ndelse — till exempel vid Ă€ndring av resurser i klustret. Detta hook hanterar Ă€ndringar och skriver nya vĂ€rden i det globala vĂ€rdeförrĂ„det. Addon-operator mĂ€rker att det globala förrĂ„det har Ă€ndrats och kör alla moduler. Varje modul bestĂ€mmer via sina hooks om den behöver aktiveras och uppdaterar sitt vĂ€rdeförrĂ„d. Om modulen Ă€r aktiverad, kör Addon-operator installerar Helm-charten. Helm-charten har Ă„tkomst till vĂ€rden frĂ„n modulens förrĂ„d och det globala förrĂ„det.
  2. Det andra scenariot Àr enklare: modulens hook körs vid en hÀndelse och Àndrar vÀrden i modulens vÀrdeförrÄd. Addon-operator mÀrker detta och kör Helm-charten med uppdaterade vÀrden.

Ett tillĂ€gg kan implementeras i form av en enda hook eller som en enda Helm-chart, eller Ă€ven som flera beroende moduler — detta beror pĂ„ komplexiteten hos den komponent som ska installeras i klustret och den önskade nivĂ„n av flexibilitet i instĂ€llningarna. Till exempel, i förrĂ„det (/examples) finns tillĂ€gget sysctl-tuner, som implementeras bĂ„de som en enkel modul med hook och Helm-chart, samt med anvĂ€ndning av ett vĂ€rdeförrĂ„d, vilket gör det möjligt att lĂ€gga till instĂ€llningar genom att redigera ConfigMap.

Leverans av uppdateringar

NÄgra ord om organisationen av uppdateringar av komponenter som Addon-operator installerar.

För att köra Addon-operator i klustret mÄste man samla en bild med tillÀgg i form av hook-filer och Helm-diagram, lÀgga till binÀrfilen addon-operator och allt som behövs för hookar: bash, kubectl, jq, python och sÄ vidare. DÀrefter kan denna bild distribueras i klustret som en vanlig applikation och du kommer troligtvis att vilja organisera nÄgon typ av taggningsschema. Om det finns fÄ kluster kan samma tillvÀgagÄngssÀtt som med applikationer fungera: ny version, nya uppdateringar, gÄ igenom alla kluster och justera bildnamnet i Pod:arna. Men i fallet med distribution till ett betydande antal kluster passar konceptet sjÀlvuppdatering frÄn kanalen oss bÀttre.

SÄ hÀr Àr det ordnat:

  • En kanal Ă€r i princip en identifierare som kan stĂ€llas in pĂ„ valfritt sĂ€tt (till exempel dev/stage/ea/stable).
  • Kanalnamnet Ă€r taggen för bilden. NĂ€r uppdateringar behöver distribueras till kanalen, samlas en ny bild och taggas med kanalens namn.
  • NĂ€r en ny bild dyker upp i registret, startar Addon-operator om och körs med den nya bilden.

Detta Àr inte en bÀsta praxis, vilket beskrivs i dokumentationen för Kubernetes. SÄ hÀr rekommenderas det inte att göras, men det handlar om en vanlig applikation som lever i ett kluster.I fallet med Addon-operator Àr applikationen en serie distributioner spridda över kluster, och sjÀlvuppdatering underlÀttar verkligen livet.

Kanalernas funktioner hjĂ€lper ocksĂ„ vid testning: om det finns ett hjĂ€lpkkluster kan det stĂ€llas in pĂ„ kanalen stage och distribuera uppdateringar till det innan de gĂ„r till kanalerna ea och stable. Om det uppstĂ„r ett fel med klustret pĂ„ kanalen ea kan det bytas till stable, medan problemet med detta kluster undersöks. Om klustret tas ur aktivt stöd, byts det till sin 'frysta' kanal — till exempel, freeze-2019-03-20.

Förutom uppdateringar av hookar och Helm-diagram kan det ocksÄ behövas uppdatera en tredjeparts komponent. Till exempel, om du upptÀckte ett fel i den hypotetiska node-exporter och Àven kommit pÄ hur man kan patcha det. Sedan öppnade du en PR och vÀntar pÄ en ny version, sÄ att du kan gÄ igenom alla kluster och öka bildversionen. För att inte behöva vÀnta en osÀker tid kan du samla din egen node-exporter och byta till den tills PR:n har godkÀnts.

I allmĂ€nhet kan detta göras utan Addon-operator, men med Addon-operator blir modulen för att installera node-exporter synlig i ett och samma katalog, Dockerfile för att bygga din egen bild kan hĂ„llas hĂ€r, och alla deltagare i processen fĂ„r en enklare förstĂ„else för vad som hĂ€nder
 Om det finns flera kluster blir det lĂ€ttare att bĂ„de testa din PR och att rulla ut en ny version!

Denna organisation för att uppdatera komponenter fungerar framgĂ„ngsrikt för oss, men man kan ocksĂ„ implementera vilken annan lĂ€mplig mekanism som helst — för i detta fall Ă€r Addon-operator en enkel binĂ€rfil.

Slutsats

Principerna implementerade i Addon-operator gör det möjligt att bygga en transparent process för skapande, testning, installation och uppdatering av tillÀgg i klustret, liknande processerna för utveckling av vanliga applikationer.

TillÀgg för Addon-operator i modulformat (Helm-chart + hooks) kan publiceras för allmÀnheten. Vi, företaget Flant, planerar att under sommaren göra vÄra bidrag tillgÀngliga i form av sÄdana tillÀgg. Delta i utvecklingen pÄ GitHub (shell-operator, addon-operator), försök göra ditt eget tillÀgg baserat pÄ exempel och dokumentationen, hÄll utkik efter nyheter pÄ Habré och pÄ vÄr YouTube-kanal!

P.S.

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