Är Kafka pĂ„ Kubernetes bra?

VĂ€lkomna, Habr!

Vi var de första som introducerade temat Kafka och fortsÀtter att hÄlla utkik att följa dess utveckling. I synnerhet tyckte vi att temat om interaktion mellan Kafka och Kubernetes. En översiktlig (och ganska försiktig) artikel artikeln om detta publicerades pÄ Confluents blogg redan i oktober förra Äret av Gwen Shapiro. Idag vill vi rikta er uppmÀrksamhet mot en mer aktuell artikel frÄn april av Johann Gyger, som, Àven om han inte skippade frÄgetecknet i titeln, behandlar Àmnet mer konkret och kompletterar texten med intressanta lÀnkar. Ber om ursÀkt för den fria översÀttningen "chaos monkey" om ni kan!

Är Kafka pĂ„ Kubernetes bra?

Introduktion

Kubernetes Àr avsett att hantera tillstÄndslös belastning. Vanligtvis Àr sÄdana arbetsbelastningar representerade i form av mikrotjÀnstarkitektur, de Àr lÀtta, lÀtt att horisontellt skala, följer principerna för 12-faktorapplikationer, och tillÄter arbete med automatiska brytare (circuit breakers) och kaosapor (chaos monkeys).

Kafka, som ligger pÄ andra sidan, Àr i grunden en distribuerad databas. DÀrför mÄste ni hantera tillstÄnd, vilket Àr mycket tyngre Àn en mikrotjÀnst. Kubernetes stöder tillstÄndsdÄlig belastning, men som Kelsey Hightower pÄpekar i tvÄ av sina tweets, bör man vara försiktig med dem:

NÄgra tror att om Kubernetes körs pÄ en tillstÄndslös belastning, blir det en helt hanterad databas som kan konkurrera med RDS. SÄ Àr det inte. Kanske om man gör tillrÀckligt med arbete, lÀgger till ytterligare komponenter och involverar ett SRE-team, sÄ kan man bygga RDS ovanpÄ Kubernetes.

Jag rekommenderar alltid att man utövar extrem försiktighet nÀr man kör tillstÄndsbevarande belastningar pÄ Kubernetes. De flesta som undrar "kan jag köra tillstÄndsbevarande belastningar pÄ Kubernetes" har inte tillrÀcklig erfarenhet av att arbeta med Kubernetes, och ofta inte ens med den belastning de frÄgar om.

SÄ, bör man köra Kafka pÄ Kubernetes? En annan frÄga: skulle Kafka fungera bÀttre utan Kubernetes? DÀrför vill jag betona i denna artikel hur Kafka och Kubernetes kompletterar varandra, och vilka fallgropar som kan uppstÄ nÀr man kombinerar dem.

Körningstid

LĂ„t oss prata om en grundlĂ€ggande sak – körningsmiljön i sig

Process

Kafka-brokers Àr bra att arbeta med CPU. TLS kan innebÀra vissa kostnader. Samtidigt kan Kafka-klienter belasta CPU mer om de anvÀnder kryptering, men detta pÄverkar inte brokerns prestanda.

Minne

Kafka-brokers krĂ€ver mycket minne. JVM-högen bör vanligtvis begrĂ€nsas till 4–5 GB, men du kommer ocksĂ„ att behöva mycket systemminne eftersom Kafka anvĂ€nder sidcache intensivt. I Kubernetes ska du stĂ€lla in resursgrĂ€nser och -begĂ€rningar för containern pĂ„ lĂ€mpligt sĂ€tt.

Datacenter

Datacenter i containrar Ă€r flyktiga – data gĂ„r förlorade vid omstart. För Kafka-data kan en volym anvĂ€ndas emptyDir, och effekten blir liknande: dina brokers data kommer att gĂ„ förlorade efter avslutande. Dina meddelanden kan Ă€ndĂ„ bevaras pĂ„ andra brokers som repliker. SĂ„ efter en omstart mĂ„ste den misslyckade brokern först replikera all data, och denna process kan ta tid.

Det Àr dÀrför man bör anvÀnda permanent datalagring. LÄt det vara nÄgon form av icke-lokal permanent lagring med ett filsystem som XFS eller, mer exakt, ext4. AnvÀnd inte NFS. Jag varnar dig. NFS-versioner v3 eller v4 fungerar inte. Kort sagt, Kafka-brokern kommer att krascha om den inte kan ta bort katalogen med data pÄ grund av problem med "dumma omdirigeringar" som Àr aktuella i NFS. Om jag fortfarande inte har övertygat dig, lÀs noggrant denna artikel. Datacenter mÄste vara icke-lokal för att Kubernetes ska kunna vÀlja en ny nod mer flexibelt efter omstart eller omflyttning.

NĂ€tverk

Precis som i de flesta distribuerade system beror Kafka:s prestanda starkt pÄ att nÀtverksfördröjningar Àr minimala och bandbredden maximal. Försök inte att placera alla mÀklare pÄ samma nod, eftersom det skulle minska tillgÀngligheten. Om en Kubernetes-nod gÄr ner, gÄr hela Kafka-klustret ner. Dela inte heller upp Kafka-klustret över hela datacenter. Detsamma gÀller Kubernetes-klustret. En bra kompromiss hÀr Àr att vÀlja olika tillgÀnglighetszoner.

Konfiguration

Vanliga manifest

PÄ Kubernetes-webbplatsen finns en mycket bra guide om hur man konfigurerar ZooKeeper med hjÀlp av manifest. Eftersom ZooKeeper ingÄr i Kafka Àr det ett bra stÀlle att börja lÀra sig om vilka Kubernetes-koncept som Àr tillÀmpliga hÀr. NÀr du har förstÄtt detta kan du tillÀmpa samma koncept pÄ Kafka-klustret.

  • Pod: en pod Ă€r den minimiutvecklade enheten i Kubernetes. I en pod finns din arbetsbelastning, och podden motsvarar en process i ditt kluster. I en pod finns en eller flera containrar. Varje ZooKeeper-server i ensemblet och varje mĂ€klare i Kafka-klustret kommer att köras i en separat pod.
  • StatefulSet: en StatefulSet Ă€r ett Kubernetes-objekt som arbetar med flera arbetsbelastningar som bevarar tillstĂ„nd, och sĂ„dana belastningar krĂ€ver samordning. StatefulSets ger garantier för ordningen för pods och deras unika identifiering.
  • Headless-tjĂ€nster: TjĂ€nster gör det möjligt att koppla pods frĂ„n klienter med hjĂ€lp av ett logiskt namn. Kubernetes ansvarar i det fallet för lastbalanseringen. Men vid operationer med tillstĂ„ndshĂ„llande arbetsbelastningar, som med ZooKeeper och Kafka, behöver klienterna utbyta information med en specifik instans. HĂ€r kommer headless-tjĂ€nster till nytta: i det fallet har klienten fortfarande ett logiskt namn, men kan inte behöva adressera podden direkt.
  • Volym för lĂ„ngvarig lagring: sĂ„dana volymer behövs för att konfigurera icke-lokal blocklagring som nĂ€mndes tidigare.

PÄ Yolean tillhandahÄller en heltÀckande uppsÀttning manifest som gör det lÀtt att komma igÄng med Kafka pÄ Kubernetes.

Helm-diagram

Helm Ă€r en paketchef för Kubernetes som kan jĂ€mföras med paketchefer för operativsystem, sĂ„som yum, apt, Homebrew eller Chocolatey. Med hjĂ€lp av den kan man enkelt installera fördefinierade programvarupaket som beskrivs i Helm-diagram. Ett vĂ€l utformat Helm-diagram förenklar den komplexa uppgiften: hur man korrekt konfigurerar alla parametrar för att anvĂ€nda Kafka pĂ„ Kubernetes. Det finns flera Kafka-diagram: den officiella finns i inkubationsstadiet, det finns en frĂ„n Confluent, en annan – frĂ„n Bitnami.

Operatörer

Eftersom Helm har vissa begrÀnsningar, fÄr ett annat verktyg, Kubernetes-operatörer, stor popularitet. En operatör paketerar inte bara programvara för Kubernetes, utan möjliggör Àven distribution och hantering av den programvaran.

I listan över fantastiska operatörer nÀmns tvÄ operatörer för Kafka. En av dem Àr Strimzi. Med Strimzi Àr det enkelt att sÀtta upp en Kafka-kluster pÄ nÄgra minuter. NÀstan ingen konfiguration behövs, och operatören erbjuder dessutom nÄgra trevliga funktioner, till exempel punkt-till-punkt TLS-kryptering inom klustret. Confluent erbjuder ocksÄ sin egen operatör.

Performance

Det Àr mycket viktigt att testa prestandan genom att förse din installerade Kafka-instans med kontrollpunkter. SÄdana tester kan hjÀlpa dig att identifiera potentiella flaskhalsar innan problem uppstÄr. Lyckligtvis tillhandahÄller Kafka redan tvÄ verktyg för prestandatestning: kafka-producer-perf-test.sh och kafka-consumer-perf-test.sh. AnvÀnd dem aktivt. För referens kan du konsultera resultaten som beskrivs av detta inlÀgg Jay Kreps, eller förlita dig pÄ denna översikt Amazon MSK av Stéphane Maarek.

Operationer

Övervakning

Transparens i systemet Ă€r mycket viktigt – annars förstĂ„r du inte vad som hĂ€nder. Idag finns det ett gediget verktyg som erbjuder övervakning baserad pĂ„ metrics i stil med cloud native. TvĂ„ populĂ€ra verktyg för detta Ă€ndamĂ„l Ă€r Prometheus och Grafana. Prometheus kan samla in metrics frĂ„n alla Java-processer (Kafka, Zookeeper, Kafka Connect) med hjĂ€lp av JMX-exportören – pĂ„ det enklaste sĂ€ttet. Om du lĂ€gger till cAdvisor-metrics kan du fĂ„ en mer heltĂ€ckande bild av hur resurser anvĂ€nds i Kubernetes.

Strimzi har ett mycket anvÀndarvÀnligt exempel pÄ en Grafana-instrumentpanel för Kafka. Den visualiserar nyckelmetrik, som till exempel omapade partitioner eller de som Àr offline. Allt Àr mycket tydligt. Dessa mÀtningar kompletteras med information om resursanvÀndning och prestanda, samt stabilitetsindikatorer. PÄ sÄ sÀtt fÄr du en grundlÀggande övervakning av Kafka-klustret kostnadsfritt!

Är Kafka pĂ„ Kubernetes bra?

KĂ€lla: strimzi.io/docs/master/#kafka_dashboard

Allt detta skulle vara bra att komplettera med klientövervakning (metrik för konsumenter och producenter), samt övervakning av latens (för detta finns Burrow) och övergripande övervakning – för detta anvĂ€nder du Kafka Monitor.

Loggning

Loggning Àr en annan viktig uppgift. Se till att alla containrar i din Kafka-installation loggas till stdout och stderr, och se ocksÄ till att ditt Kubernetes-kluster aggregerar alla loggar i en central logginfrastruktur, till exempel i Elasticsearch.

Kontroll av tillgÀnglighet

Kubernetes anvÀnder liveness- och readiness-prober för att kontrollera om dina pods fungerar som de ska. Om liveness-proben misslyckas kommer Kubernetes att stoppa denna container och sedan automatiskt starta om den, om omstartspolicyn Àr korrekt instÀlld. Om readiness-proben misslyckas kommer Kubernetes att isolera denna pod frÄn att ta emot förfrÄgningar. PÄ sÄ sÀtt behövs det ingen manuell ingripande i sÄdana fall, vilket Àr en stor fördel.

Utrullning av uppdateringar

StatefulSets stöder automatiska uppdateringar: nÀr du vÀljer strategin RollingUpdate kommer varje Kafka-pod att uppdateras i tur och ordning. PÄ sÄ sÀtt kan du minimera stillestÄndstiden till noll.

Skalning

Att skala Kafka-klustret Ă€r en utmaning. Men i Kubernetes Ă€r det mycket enkelt att skala pods till ett visst antal replika, vilket betyder att du kan deklarativt definiera sĂ„ mĂ„nga Kafka-brokers som du vill. Det svĂ„raste i detta fall Ă€r att omfördela partitioner efter att ha skalat upp eller innan du skalar ner. Återigen kommer Kubernetes att hjĂ€lpa dig med denna uppgift.

Administration

Uppgifter relaterade till administration av din Kafka-kluster, sÀrskilt skapande av Àmnen och omfördelning av partitioner, kan utföras med hjÀlp av de befintliga shell-skripten genom att öppna kommandoradsgrÀnssnittet i dina pods. Men detta Àr inte en sÀrskilt elegant lösning. Strimzi stödjer hantering av Àmnen med hjÀlp av en annan operator. HÀr finns det mer att utveckla.

SÀkerhetskopiering och ÄterstÀllning

Nu kommer tillgÀngligheten av Kafka att bero pÄ tillgÀngligheten av Kubernetes. Om din Kubernetes-kluster gÄr ner, kommer i vÀrsta fall Àven Kafka-klustret att krascha. Enligt Murphys lag kommer detta garanterat att hÀnda, och du kommer att förlora data. För att minska risken för sÄdana situationer, Àr det viktigt att noggrant utarbeta en sÀkerhetskopieringsstrategi. Du kan anvÀnda MirrorMaker, ett annat alternativ Àr att utnyttja S3 för detta, som beskrivs i detta inlÀgg frÄn Zalando.

Slutsats

NÀr man arbetar med smÄ eller medelstora Kafka-kluster Àr det definitivt förnuftigt att anvÀnda Kubernetes, eftersom det ger ytterligare flexibilitet och förenklar arbetet med operatörer. Om du har mycket strikta icke-funktionella krav relaterade till latens och/eller kapacitetsanvÀndning, kan det vara bÀttre att övervÀga ett annat distributionsalternativ.

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