Tervehdys, Habr!
Kerran olimme ensimmäiset, jotka toivat aiheen Venäjän markkinoille
Esittely
Kubernetes on suunniteltu käsittelemään tilattomia työkuormia. Tyypillisesti tällaiset työmäärät esitetään mikropalveluarkkitehtuurin muodossa, ne ovat kevyitä, skaalautuvat hyvin vaakasuoraan, noudattavat 12-faktoristen sovellusten periaatteita ja toimivat katkaisijoiden ja kaaosapinoiden kanssa.
Kafka puolestaan toimii pohjimmiltaan hajautettuna tietokantana. Siten työskennellessään joutuu käsittelemään tilaa, ja se on paljon raskaampaa kuin mikropalvelu. Kubernetes tukee tilallisia kuormia, mutta kuten Kelsey Hightower huomauttaa kahdessa twiitissä, niitä tulee käsitellä varoen:
Jotkut ihmiset ajattelevat, että jos siirrät Kubernetesin tilallisen työtaakan, siitä tulee täysin hallittu tietokanta, joka kilpailee RDS:n kanssa. Tämä on väärin. Jos työskentelet tarpeeksi kovasti, lisäät lisäkomponentteja ja houkuttelet SRE-insinööritiimin, pystyt rakentamaan RDS:n Kubernetesin päälle.
Suosittelen aina, että kaikki noudattavat äärimmäistä varovaisuutta ajaessaan tilallisia työkuormia Kubernetesissa. Useimmilla ihmisillä, jotka kysyvät "Voinko suorittaa tilapitoisia työkuormia Kubernetesissa", ei ole tarpeeksi kokemusta Kubernetesista, ja usein heidän kysyttävästä työkuormasta.
Joten, pitäisikö sinun ajaa Kafkaa Kubernetesissa? Vastakysymys: toimiiko Kafka paremmin ilman Kubernetesia? Siksi haluan tässä artikkelissa korostaa, kuinka Kafka ja Kubernetes täydentävät toisiaan ja mitä sudenkuoppia niiden yhdistäminen voi aiheuttaa.
Valmistumisaika
Puhutaanpa perusasiasta - itse ajonaikaisesta ympäristöstä
prosessi
Kafka-välittäjät ovat prosessoriystävällisiä. TLS saattaa aiheuttaa yleiskustannuksia. Kafka-asiakkaat voivat kuitenkin olla prosessoriintensiivisempiä, jos he käyttävät salausta, mutta tämä ei vaikuta välittäjiin.
Память
Kafka-välittäjät syövät muistia. JVM-keon koko on yleensä rajoitettu 4-5 Gt:iin, mutta tarvitset myös paljon järjestelmämuistia, koska Kafka käyttää sivuvälimuistia erittäin voimakkaasti. Aseta Kubernetesissa säilöresurssi ja pyyntörajat sen mukaisesti.
Tietovarasto
Tietojen tallennus säilöissä on lyhytaikaista - tiedot menetetään uudelleenkäynnistyksen yhteydessä. Kafka-datalle voit käyttää äänenvoimakkuutta emptyDir
, ja vaikutus on samanlainen: välittäjätietosi menetetään valmistumisen jälkeen. Viestisi voidaan edelleen tallentaa muille välittäjille replikoina. Siksi epäonnistuneen välittäjän on uudelleenkäynnistyksen jälkeen ensin kopioitava kaikki tiedot, ja tämä prosessi voi viedä paljon aikaa.
Tästä syystä sinun tulee käyttää pitkäaikaista tietojen tallennusta. Olkoon se ei-paikallinen pitkäaikainen tallennus XFS-tiedostojärjestelmällä tai tarkemmin sanottuna ext4. Älä käytä NFS:ää. Varoitin sinua. NFS-versiot v3 tai v4 eivät toimi. Lyhyesti sanottuna Kafka-välittäjä kaatuu, jos se ei pysty poistamaan tietohakemistoa NFS:n "tyhmän uudelleennimeämis"-ongelman vuoksi. Jos en ole vielä vakuuttanut sinua, niin huolellisesti
Сеть
Kuten useimpien hajautettujen järjestelmien kohdalla, Kafkan suorituskyky riippuu suuresti verkon latenssin pitämisestä minimissä ja kaistanleveyden maksimoinnissa. Älä yritä isännöidä kaikkia välittäjiä samassa solmussa, koska tämä heikentää saatavuutta. Jos Kubernetes-solmu epäonnistuu, koko Kafka-klusteri epäonnistuu. Älä myöskään jaa Kafka-klusteria kokonaisiin palvelinkeskuksiin. Sama koskee Kubernetes-klusteria. Hyvä kompromissi tässä tapauksessa on valita eri saatavuusvyöhykkeet.
kokoonpano
Säännölliset manifestit
Kubernetesin verkkosivuilla on
- alapuolella: Pod on Kubernetesin pienin käyttöön otettava yksikkö. Pod sisältää työkuormasi, ja itse pod vastaa klusterisi prosessia. Pallo sisältää yhden tai useamman säiliön. Jokainen ZooKeeper-palvelin ryhmässä ja jokainen välittäjä Kafka-klusterissa toimivat erillisessä kotelossa.
- StatefulSet: StatefulSet on Kubernetes-objekti, joka käsittelee useita tilallisia työkuormia, ja tällaiset työkuormat vaativat koordinointia. StatefulSets antaa takuun podien tilauksesta ja niiden ainutlaatuisuudesta.
- Päättömät palvelut: Palvelujen avulla voit irrottaa podeja asiakkaista käyttämällä loogista nimeä. Kubernetes vastaa tässä tapauksessa kuormituksen tasapainottamisesta. Kuitenkin käytettäessä tilallisia työkuormia, kuten ZooKeeper ja Kafka, asiakkaiden on kommunikoitava tietyn esiintymän kanssa. Tässä päättömät palvelut ovat hyödyllisiä: tässä tapauksessa asiakkaalla on edelleen looginen nimi, mutta sinun ei tarvitse ottaa yhteyttä suoraan podiin.
- Pitkäaikainen varastointitilavuus: Näitä taltioita tarvitaan yllä mainitun ei-paikallisen lohkon pysyvän tallennustilan määrittämiseen.
Päälle
Ruorikaaviot
Helm on Kubernetesin paketinhallinta, jota voidaan verrata käyttöjärjestelmän paketinhallintaohjelmiin, kuten yum, apt, Homebrew tai Chocolatey. Sen avulla on helppo asentaa valmiita ohjelmistopaketteja, jotka on kuvattu Helm kaavioissa. Hyvin valittu Helm-kaavio helpottaa kaikkien parametrien oikein konfigurointia Kafkan käyttöä varten Kubernetesissa. Kafka-kaavioita on useita: virallinen sijaitsee
toimijoiden
Koska Helmissä on tiettyjä puutteita, toinen työkalu on saavuttamassa huomattavaa suosiota: Kubernetes-operaattorit. Operaattori ei vain pakkaa ohjelmistoja Kubernetesille, vaan myös mahdollistaa tällaisten ohjelmistojen käyttöönoton ja hallinnan.
Luettelossa
Suorituskyky
On tärkeää testata suorituskykyä vertaamalla Kafka-esiintymääsi. Tällaiset testit auttavat sinua löytämään mahdolliset pullonkaulat ennen kuin ongelmia ilmenee. Onneksi Kafka tarjoaa jo kaksi suorituskyvyn testaustyökalua: kafka-producer-perf-test.sh
и kafka-consumer-perf-test.sh
. Käytä niitä aktiivisesti. Viitteeksi voit katsoa kohdassa kuvatut tulokset
toiminnot
seuranta
Järjestelmän läpinäkyvyys on erittäin tärkeää - muuten et ymmärrä, mitä siinä tapahtuu. Nykyään on olemassa vankka työkalupakki, joka tarjoaa mittauspohjaista seurantaa pilvipohjaisella tyylillä. Kaksi suosittua työkalua tähän tarkoitukseen ovat Prometheus ja Grafana. Prometheus voi kerätä mittareita kaikista Java-prosesseista (Kafka, Zookeeper, Kafka Connect) JMX-vientiohjelman avulla - yksinkertaisimmalla tavalla. Jos lisäät cAdvisor-mittareita, voit ymmärtää paremmin, kuinka resursseja käytetään Kubernetesissa.
Strimzillä on erittäin kätevä esimerkki Grafana-kojelaudasta Kafkalle. Se visualisoi keskeisiä mittareita, esimerkiksi alikopioituista tai offline-tilassa olevista sektoreista. Siellä kaikki on hyvin selvää. Näitä mittareita täydentävät resurssien käyttö- ja suorituskykytiedot sekä vakausindikaattorit. Joten saat Kafka-klusterin perusvalvonnan turhaan!
Lähde:
Kaikkea tätä olisi kiva täydentää asiakasseurannalla (mittarit kuluttajista ja tuottajista) sekä latenssiseurannalla (tätä varten on
Kirjaaminen
Kirjaus on toinen tärkeä tehtävä. Varmista, että kaikki Kafka-asennuksesi säiliöt on kirjattu sisään stdout
и stderr
, ja varmista myös, että Kubernetes-klusterisi kokoaa kaikki lokit keskitettyyn lokiinfrastruktuuriin, esim.
Toiminnallinen testaus
Kubernetes käyttää elävyys- ja valmiusantureita tarkistaakseen, toimivatko podit normaalisti. Jos elävyyden tarkistus epäonnistuu, Kubernetes pysäyttää kyseisen säilön ja käynnistää sen sitten automaattisesti uudelleen, jos uudelleenkäynnistyskäytäntö on asetettu vastaavasti. Jos valmiustarkastus epäonnistuu, Kubernetes eristää podin huoltopyynnöistä. Tällaisissa tapauksissa manuaalista puuttumista ei siis enää tarvita, mikä on iso plussa.
Otetaan käyttöön päivityksiä
StatefulSets tukee automaattisia päivityksiä: jos valitset RollingUpdate-strategian, jokainen Kafka-kohdassa päivitetään vuorotellen. Tällä tavalla seisokit voidaan vähentää nollaan.
Skaalaus
Kafka-klusterin skaalaus ei ole helppo tehtävä. Kubernetes tekee kuitenkin erittäin helpoksi skaalata podit tiettyyn määrään replikoita, mikä tarkoittaa, että voit määritellä deklaratiivisesti niin monta Kafka-välittäjää kuin haluat. Vaikeinta tässä tapauksessa on sektoreiden uudelleenjako skaalauksen jälkeen tai ennen pienentämistä. Jälleen Kubernetes auttaa sinua tässä tehtävässä.
antaminen
Kafka-klusterin hallintaan liittyvät tehtävät, kuten aiheiden luominen ja sektoreiden uudelleenmäärittely, voidaan tehdä käyttämällä olemassa olevia shell-skriptejä avaamalla komentoriviliittymä podeissasi. Tämä ratkaisu ei kuitenkaan ole kovin kaunis. Strimzi tukee aiheiden hallintaa eri operaattorilla. Tässä on parantamisen varaa.
Varmuuskopiointi ja palautus
Nyt Kafkan saatavuus riippuu myös Kubernetesin saatavuudesta. Jos Kubernetes-klusterisi epäonnistuu, pahimmassa tapauksessa myös Kafka-klusterisi epäonnistuu. Murphyn lain mukaan tämä tapahtuu varmasti, ja menetät tietoja. Tämäntyyppisen riskin vähentämiseksi on hyvä varmuuskopiointikonsepti. Voit käyttää MirrorMakeria, toinen vaihtoehto on käyttää S3:a tässä kuvatulla tavalla
Johtopäätös
Pienten ja keskikokoisten Kafka-klustereiden kanssa työskennellessä kannattaa ehdottomasti käyttää Kubernetesia, sillä se lisää joustavuutta ja yksinkertaistaa käyttökokemusta. Jos sinulla on erittäin merkittäviä ei-toiminnallisia viive- ja/tai suoritustehovaatimuksia, voi olla parempi harkita jotain muuta käyttöönottovaihtoehtoa.
Lähde: will.com