VĂ€lkomna, Habr!
Vi var de första som introducerade temat och fortsÀtter att följa dess utveckling. I synnerhet tyckte vi att temat om interaktion mellan Kafka och . En översiktlig (och ganska försiktig) artikel 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!
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 . 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 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Ä 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 , det finns en frĂ„n , en annan â frĂ„n .
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 nÀmns tvÄ operatörer för Kafka. En av dem Àr . 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Ä .
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 Jay Kreps, eller förlita dig pÄ 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!

KĂ€lla:
Allt detta skulle vara bra att komplettera med klientövervakning (metrik för konsumenter och producenter), samt övervakning av latens (för detta finns ) och övergripande övervakning â för detta anvĂ€nder du .
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 .
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 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
