Jó dolog a Kafka Kubernetes-en?

Üdvözöljük, Habr!

Idővel mi voltunk az elsők, akik bevezették a témát az orosz piacon , amely lehetőséget ad valós időben látni a rendszer eseményportfólióját. és folytatjuk figyelemmel kísérni a fejlesztését. Különösen érdekesnek találtuk a Kafka és Kubernetesegyüttműködésének témáját. Egy átfogó (és eléggé óvatos) cikk cikk jelent meg erről a Confluent vállalat blogján még tavaly októberben Gwen Shapiro szerződésével. Ma pedig szeretnénk felhívni a figyelmét egy frissebb, áprilisi cikkre Johann Gyger tollából, aki, bár nem úszta meg kérdőjellel a címében, sokkal megalapozottabb szempontból vizsgálja a témát, érdekes linkek kíséretében. Kérjük, bocsássanak meg nekünk a szabad fordításért, legyenek szívesek!

Jó dolog a Kafka Kubernetes-en?

Bevezetés

A Kubernetes arra lett tervezve, hogy állapotot nem megőrző terhelésekkel dolgozzon. Általában ezek a munka terhelések mikroszolgáltatás-architektúra formájában jelennek meg, könnyűek, jól skálázhatók vízszintesen, követik a 12-faktoros alkalmazások elveit, lehetővé teszik az automatikus megszakítók (circuit breaker) és a káoszmajmok (chaos monkeys) használatát.

A Kafka, amely a másik oldalon található, lényegében elosztott adatbázisként működik. Így a munka során állapottal kell foglalkoznia, ami sokkal nehezebb, mint egy mikroszolgáltatás. A Kubernetes támogatja az állapotot megőrző terheléseket, de ahogy Kelsey Hightower két tweetjében is megjegyzi, ezekkel óvatosan kell bánni:

Néhányan úgy vélik, hogy ha Kubernetes-t alkalmaznak egy állapotot megőrző terhelésre, akkor az teljesen kezelhető adatbázissá alakul, amely versenyezni tud az RDS-sel. Ez nem igaz. Lehet, hogy ha elég keményen dolgozunk, további komponenseket csatlakoztatunk, és SRE mérnök csapatot vonunk be, akkor sikerülhet az RDS-t Kubernetes fölé telepíteni.

Mindig azt javaslom mindenkinek, hogy rendkívül óvatosan járjon el, amikor állapotot megőrző terheléseket indít a Kubernetes-en. A legtöbb, aki azt kérdezi, "el tudom-e indítani az állapotot megőrző terheléseket a Kubernetes-en", nincs elegendő tapasztalata a Kubernetes használatában, és gyakran még a terheléssel kapcsolatban is, amiről kérdeznek.

Tehát kell-e a Kafkát Kubernetes-en futtatni? A viszontkérdés: jobban fog működni a Kafka Kubernetes nélkül? Éppen ezért szeretném hangsúlyozni ebben a cikkben, hogy a Kafka és a Kubernetes hogyan egészítik ki egymást, és milyen csapdákba lehet belefutni a kombinációjuk során.

Kibővített futási idő

Beszéljünk az alapvető dologról — a futási környezetről mint olyanról

Folyamat

A Kafka brókerek jól teljesítenek CPU terhelésnél. A TLS némi költséget is bevihet. Ugyanakkor a Kafka kliensek jobban megterhelhetik a CPU-t, ha titkosítást használnak, de ez nem befolyásolja a brókereket.

Memória

A Kafka brókerek memóriaigényesek. A JVM halomméretét általában 4–5 GB-ra szokás korlátozni, de sok rendszer memória is szükséges, mivel a Kafka aktívan használja az oldalkészletet. Kubernetes alatt megfelelően állítsa be a konténerre a forráshatárokat és a kéréseket.

Adat tárolás

Az adat tárolás a konténerekben efemer — az adatok elvesznek a újraindítás során. A Kafka adataihoz kötetet használhatunk, emptyDir, és a hatás hasonló lesz: a bróker adatai elvesznek a leállítás során. Az üzeneteid azonban más brókereken replikációként megmaradhatnak. Ezért a leállt brókernek először replikálnia kell az összes adatot, ami időbe telhet.

Ezért kell tartós adat tárolást használni. Legyen ez egy nem helyi tartós tárolás XFS fájlrendszerrel vagy, pontosabban, ext4-el. Ne használjon NFS-t. Figyelmeztettem. Az NFS v3 vagy v4 verziók nem fognak működni. Röviden: a Kafka bróker leáll, ha nem tudja törölni az adatokat a 'butaságok átnevezése' problémája miatt, ami az NFS-re vonatkozik. Ha eddig még nem győztelek meg, olvasd el nagyon figyelmesen ezt a cikket. Az adat tárolásnak nem helyinek kell lennie, hogy a Kubernetes rugalmasabban választhassa ki az új csomópontot újraindítás vagy relokáció után.

Hálózat

Mint a legtöbb elosztott rendszerhez hasonlóan, a Kafka teljesítménye is erősen függ attól, hogy a hálózati késleltetések minimálisak, míg a sávszélesség maximális. Ne próbálja meg az összes brókert ugyanarra a csomópontjára helyezni, mivel ezzel csökken a rendelkezésre állás. Ha egy Kubernetes-csomópont leáll, akkor az egész Kafka klaszter is leáll. Emellett ne terjessze a Kafka klasztert külön adatközpontokra sem. Ugyanez vonatkozik a Kubernetes klaszterre is. Jó kompromisszum lehet, ha különböző elérhetőségi zónákat választ.

Konfiguráció

Szokásos manifestek

A Kubernetes weboldalán található nagyon jó útmutató arról, hogyan lehet a ZooKeeper-t manifestek segítségével beállítani. Mivel a ZooKeeper a Kafka részét képezi, ezzel kényelmes elkezdeni megismerkedni azokkal a Kubernetes koncepciókkal, amelyek itt alkalmazhatók. Miután megértette ezt, azonos koncepciókat alkalmazhat a Kafka klaszterhez is.

  • A: a pod a Kubernetes legkisebb telepíthető egysége. A pod tartalmazza a munkaterhelését, és a pod megfelel a klaszterében lévő folyamatnak. A podban egy vagy több konténer található. Minden ZooKeeper szerver az egyesületben és minden broker a Kafka klaszterben különálló podban működik.
  • StatefulSet: A StatefulSet egy Kubernetes-objektum, amely többszörös állapotmegőrző munkaterhelésekkel dolgozik, és az ilyen munkaterhelések koordinációt igényelnek. A StatefulSet garantálja a podok sorrendjét és egyediségét.
  • Headless-szolgáltatások: A szolgáltatások lehetővé teszik a podok elválasztását az ügyfelektől logikai név használatával. A Kubernetes ebben az esetben felel a terheléskiegyenlítésért. Azonban állapotot megőrző munkaterhelések esetén, mint a ZooKeeper és Kafka, az ügyfeleknek információt kell cserélniük egy adott példánnyal. Itt hasznosak a headless-szolgáltatások: ebben az esetben az ügyfélnek továbbra is lesz logikai neve, de közvetlenül a podhoz nem szükséges fordulni.
  • Tartós tároló: ilyen tárolók szükségesek a fent említett nem helyi blokkos hosszú távú tárolási konfigurációhoz.

Ezen Yolean teljes körű manifest csomagot biztosít, amellyel kényelmesen elkezdheti a Kafka használatát a Kubernetes-en.

Helm-diagramok

A Helm a Kubernetes csomagkezelője, amelyet az operációs rendszerekhez készült csomagkezelőkhöz, például yum, apt, Homebrew vagy Chocolatey hasonlíthatunk. Segítségével kényelmesen telepíthetjük a Helm-diagramokban leírt előre definiált szoftvercsomagokat. Egy jól megírt Helm-diagram megkönnyíti a bonyolult feladatot: hogyan konfiguráljuk helyesen az összes paramétert a Kafka Kubernetes-en való használatához. Több Kafka-diagram is létezik: az egyik hivatalos, amely a inkubációs állapotban van, van egy a Confluenttól, egy másik pedig a Bitnamitól.

Operátorok

Mivel a Helm-nek bizonyos hátrányai vannak, egyre népszerűbbé válik egy másik eszköz: a Kubernetes operátorok. Az operátor nemcsak a szoftver csomagolásáért felelős a Kubernetes-hez, hanem lehetővé teszi a szoftver telepítését és kezelését is.

A lenyűgöző operátorok listájában említést nyer két operátor a Kafka számára. Az egyikük a Strimzi. A Strimzi segítségével pár perc alatt felállítható a Kafka klaszter. Szinte semmilyen konfigurációra nincs szükség, ráadásul maga az operátor néhány kellemes funkciót is nyújt, például a TLS titkosítást a klaszteren belül. A Confluent szintén biztosít saját operátort.

Teljesítmény

Nagyon fontos az teljesítmény tesztelése, ha van telepített Kafka példányod, hogy ellenőrző pontokkal biztosítsd a működést. Az ilyen tesztek segítenek felfedezni a potenciális szűk keresztmetszeteket, még mielőtt problémák merülnének fel. Szerencsére a Kafka két eszközt is biztosít a teljesítmény tesztelésére: kafka-producer-perf-test.sh és kafka-consumer-perf-test.sh. Használjatok őket aktívan. Referenciaként ellenőrizhetitek a Jay Kreps által írt ezen posztban leírt eredményeket, vagy támaszkodhattok erre a felmérésre az Amazon MSK-ról Stéphane Maarek által. A működés

Átláthatóság a rendszerben nagyon fontos – különben nem fogod tudni, mi történik benne. Ma már van egy szilárd eszközkészlet, amely a cloud-native stílusú metrikákra épülő monitorozást biztosít. Két népszerű eszköz erre a célra a Prometheus és a Grafana. A Prometheus képes összegyűjteni a metrikákat az összes Java (Kafka, Zookeeper, Kafka Connect) folyamatból JMX exportáló segítségével – a legegyszerűbb módon. Ha hozzáadjuk a cAdvisor metrikáit, teljesebb képet kaphatunk arról, hogyan használják a Kubernetesben a forrásokat.

Monitorozás

Átláthatóság a rendszerben nagyon fontos – különben nem fogod tudni, mi történik benne. Ma már van egy szilárd eszközkészlet, amely a cloud-native stílusú metrikákra épülő monitorozást biztosít. Két népszerű eszköz erre a célra a Prometheus és a Grafana. A Prometheus képes összegyűjteni a metrikákat az összes Java (Kafka, Zookeeper, Kafka Connect) folyamatból JMX exportáló segítségével – a legegyszerűbb módon. Ha hozzáadjuk a cAdvisor metrikáit, teljesebb képet kaphatunk arról, hogyan használják a Kubernetesben a forrásokat.

A Strimzi nagyon kényelmes Grafana irányítópult példát kínál a Kafka számára. Ez vizualizálja a kulcsfontosságú metrikákat, például a nem replikált szektorokról vagy az offline szektorokról. Minden nagyon világos. Ezeket a metrikákat kiegészítik a források felhasználásának és a teljesítménynek az adatai, valamint a stabilitási mutatók. Így egy alap Kafka klaszter monitort kap ingyen!

Jó dolog a Kafka Kubernetes-en?

Forrás: strimzi.io/docs/master/#kafka_dashboard

Mindehhez jól jönne a kliensek nyomon követése (metrikák a fogyasztókról és a termelőkről), valamint a késleltetési monitoring (ehhez van Burrow) és az átfogó monitorozás – ehhez használja a Kafka Monitor.

Naplózás

A naplózás egy másik nagyon fontos feladat. Győződjön meg róla, hogy minden konténer a Kafka telepítésében naplózva van stdout és stderr, és gondoskodjon róla, hogy a Kubernetes klasztere összesítse az összes naplót egy központi naplózási infrastruktúrába, például Elasticsearch.

Szervizellenőrzés

A Kubernetes élő (liveness) és készenléti (readiness) ellenőrző pontokat használ, hogy eldöntse, normálisan működnek-e a podjai. Ha az élő ellenőrzés nem sikerül, a Kubernetes leállítja ezt a konténert, majd automatikusan újraindítja, ha a visszaállítási szabályzat megfelelően van beállítva. Ha a készenléti ellenőrzés nem sikerül, akkor a Kubernetes elkülöníti ezt a podot a kérdések kiszolgálásától. Így ezekben az esetekben már nincs szükség manuális beavatkozásra, ami nagy előny.

Frissítések kiadása

A StatefulSet-ek támogatják az automatikus frissítéseket: a RollingUpdate stratégia kiválasztásakor minden Kafka pod egyesével frissül. Így minimalizálhatja a leállások időtartamát.

Skálázhatóság

A Kafka klaszter skálázása nem egyszerű feladat. Azonban a Kubernetes nagyon egyszerűvé teszi a podok skálázását egy meghatározott számú replikára, ami azt jelenti, hogy deklaratívan meghatározhat annyi Kafka brókert, amennyit csak kíván. A legnehezebb ebben az esetben a szektorok újbóli hozzárendelése a felfelé történő skálázás után vagy lefelé történő skálázás előtt. Ismét, a Kubernetes segít ebben a feladatban.

Adminisztráció

A feladatok, amelyek a Kafka klaszterének adminisztrálásával kapcsolatosak, különösen a témák létrehozása és a szektorok átvitele, elvégezhetők a rendelkezésre álló shell scriptjeink segítségével, a parancssori interfész megnyitásával a podjainkban. Azonban ez a megoldás nem túl szép. A Strimzi egy másik operátor segítségével támogatja a témák kezelését. Itt van mit még tökéletesíteni.

Biztonsági mentés és helyreállítás

Ezért a Kafka rendelkezésre állása most már a Kubernetes rendelkezésre állásától is függ. Ha a Kubernetes klasztered leáll, a legrosszabb esetben a Kafka klasztered is le fog állni. Murphy törvénye szerint ez biztosan meg fog történni, és adatokat veszítesz. Az ilyen típusú kockázat csökkentése érdekében alaposan dolgozd ki a biztonsági mentési koncepciót. Használhatod a MirrorMakert, egy másik lehetőség S3 használata, ahogyan ezt a a bejegyzésben Zalando-tól.

Zárás

Kis vagy közepes méretű Kafka klasztereknél mindenképpen érdemes Kubernetes-t használni, mivel ez további rugalmasságot biztosít és megkönnyíti a működtetők munkáját. Ha nagyon komoly nem funkcionális követelmények vannak a késleltetésre és/vagy a sávszélességre vonatkozóan, lehet, hogy érdemes egy másik telepítési lehetőséget fontolóra venni.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster