Salutări, Habr!
La un moment dat, am fost primii care au introdus subiectul pe piața rusă
Introducere
Kubernetes este conceput pentru a gestiona sarcinile de lucru fără stat. De obicei, astfel de sarcini de lucru sunt prezentate sub forma unei arhitecturi de microservicii, sunt ușoare, se scalează bine pe orizontală, urmează principiile aplicațiilor cu 12 factori și pot funcționa cu întrerupătoare și maimuțe haos.
Kafka, pe de altă parte, acționează în esență ca o bază de date distribuită. Astfel, atunci când lucrezi, trebuie să faci față statului și este mult mai greu decât un microserviciu. Kubernetes acceptă încărcări cu stare, dar așa cum subliniază Kelsey Hightower în două tweet-uri, acestea ar trebui tratate cu grijă:
Unii oameni consideră că, dacă introduceți Kubernetes într-un volum de lucru cu stare, acesta devine o bază de date complet gestionată, care rivalizează cu RDS. Este gresit. Poate că, dacă munciți suficient de mult, adăugați componente suplimentare și atrageți o echipă de ingineri SRE, veți putea construi RDS pe Kubernetes.
Recomand întotdeauna tuturor să fie extrem de precauți atunci când rulează sarcini de lucru cu stare pe Kubernetes. Majoritatea oamenilor care întreabă „pot rula încărcături de lucru cu stare pe Kubernetes” nu au suficientă experiență cu Kubernetes și adesea cu volumul de lucru despre care întreabă.
Deci, ar trebui să rulați Kafka pe Kubernetes? Contra întrebare: va funcționa Kafka mai bine fără Kubernetes? De aceea vreau să evidențiez în acest articol modul în care Kafka și Kubernetes se completează reciproc și ce capcane pot apărea prin combinarea lor.
Timpul de finalizare
Să vorbim despre lucrul de bază - mediul de rulare în sine
proces
Brokerii Kafka sunt prietenoși cu procesorul. TLS poate introduce unele cheltuieli generale. Cu toate acestea, clienții Kafka pot consuma mai mult CPU dacă folosesc criptarea, dar acest lucru nu îi afectează pe brokerii.
memorie
Brokerii Kafka mănâncă memoria. Dimensiunea heap-ului JVM este de obicei limitată la 4-5 GB, dar veți avea nevoie și de multă memorie de sistem, deoarece Kafka utilizează foarte mult memoria cache a paginii. În Kubernetes, setați resursele containerului și limitele de solicitare în consecință.
Magazin de date
Stocarea datelor în containere este efemeră - datele se pierd la repornire. Pentru datele Kafka puteți folosi un volum emptyDir
, iar efectul va fi similar: datele brokerului dvs. se vor pierde după finalizare. Mesajele dvs. pot fi în continuare stocate pe alți brokeri ca replici. Prin urmare, după o repornire, brokerul eșuat trebuie mai întâi să reproducă toate datele, iar acest proces poate dura mult timp.
Acesta este motivul pentru care ar trebui să utilizați stocarea de date pe termen lung. Să fie stocare non-locală pe termen lung cu sistemul de fișiere XFS sau, mai precis, ext4. Nu folosiți NFS. Te-am avertizat. Versiunile NFS v3 sau v4 nu vor funcționa. Pe scurt, brokerul Kafka se va prăbuși dacă nu poate șterge directorul de date din cauza problemei „redenumire stupidă” din NFS. Dacă nu te-am convins încă, cu mare atenție
rețea
Ca și în cazul majorității sistemelor distribuite, performanța Kafka depinde în mare măsură de menținerea latenței rețelei la un nivel minim și a lățimii de bandă la maximum. Nu încercați să găzduiți toți brokerii pe același nod, deoarece acest lucru va reduce disponibilitatea. Dacă un nod Kubernetes eșuează, întregul cluster Kafka va eșua. De asemenea, nu dispersați clusterul Kafka în centre de date întregi. Același lucru este valabil și pentru cluster-ul Kubernetes. Un compromis bun în acest caz este alegerea diferitelor zone de disponibilitate.
configurație
Manifeste regulate
Site-ul Kubernetes are
- În: Un pod este cea mai mică unitate implementabilă din Kubernetes. Un pod conține volumul dvs. de lucru, iar podul în sine corespunde unui proces din clusterul dvs. Un pod conține unul sau mai multe recipiente. Fiecare server ZooKeeper din ansamblu și fiecare broker din clusterul Kafka vor rula într-un pod separat.
- StatefulSet: Un StatefulSet este un obiect Kubernetes care gestionează mai multe sarcini de lucru cu stare, iar astfel de sarcini necesită coordonare. StatefulSets oferă garanții cu privire la ordonarea podurilor și unicitatea acestora.
- Servicii fără cap: Serviciile vă permit să detașați podurile de la clienți folosind un nume logic. Kubernetes în acest caz este responsabil pentru echilibrarea încărcării. Cu toate acestea, atunci când operează sarcini de lucru cu stare, cum ar fi ZooKeeper și Kafka, clienții trebuie să comunice cu o anumită instanță. Aici sunt utile serviciile fără cap: în acest caz, clientul va avea în continuare un nume logic, dar nu va trebui să contactați direct podul.
- Volumul de stocare pe termen lung: Aceste volume sunt necesare pentru a configura stocarea persistentă a blocului non-local menționată mai sus.
Pe
Tabele de cârmă
Helm este un manager de pachete pentru un Kubernetes care poate fi comparat cu managerii de pachete ale sistemului de operare precum yum, apt, Homebrew sau Chocolatey. Facilitează instalarea pachetelor software predefinite descrise în diagramele Helm. O diagramă Helm bine aleasă face dificilă sarcina de a configura corect toți parametrii pentru a utiliza Kafka pe Kubernetes. Există mai multe diagrame Kafka: cea oficială este localizată
operatori
Deoarece Helm are anumite neajunsuri, un alt instrument câștigă o popularitate considerabilă: operatorii Kubernetes. Operatorul nu numai că pachetează software pentru Kubernetes, dar vă permite și să implementați un astfel de software și să îl gestionați.
În listă
productivitate
Este important să testați performanța prin compararea instanței dvs. Kafka. Astfel de teste vă vor ajuta să găsiți potențiale blocaje înainte să apară probleme. Din fericire, Kafka oferă deja două instrumente de testare a performanței: kafka-producer-perf-test.sh
и kafka-consumer-perf-test.sh
. Folosește-le activ. Pentru referință, puteți consulta rezultatele descrise în
operațiuni
monitorizarea
Transparența în sistem este foarte importantă - altfel nu veți înțelege ce se întâmplă în el. Astăzi există un set de instrumente solid care oferă monitorizare bazată pe metrici în stilul nativ cloud. Două instrumente populare în acest scop sunt Prometheus și Grafana. Prometheus poate colecta valori din toate procesele Java (Kafka, Zookeeper, Kafka Connect) folosind un exportator JMX - în cel mai simplu mod. Dacă adăugați valori cAdvisor, puteți înțelege mai pe deplin cum sunt utilizate resursele în Kubernetes.
Strimzi are un exemplu foarte convenabil de tablou de bord Grafana pentru Kafka. Vizualizează valori cheie, de exemplu, despre sectoarele subreplicate sau cele care sunt offline. Totul este foarte clar acolo. Aceste metrici sunt completate de informații despre utilizarea resurselor și performanță, precum și indicatori de stabilitate. Așa că obții monitorizarea de bază a clusterului Kafka pentru nimic!
Sursa:
Ar fi bine să completam toate acestea cu monitorizarea clienților (metrici asupra consumatorilor și producătorilor), precum și cu monitorizarea latenței (pentru aceasta există
Logare
Logarea este o altă sarcină critică. Asigurați-vă că toate containerele din instalația dvs. Kafka sunt conectate stdout
и stderr
și, de asemenea, asigurați-vă că clusterul dvs. Kubernetes reunește toate jurnalele într-o infrastructură centrală de înregistrare, de ex.
Verificare funcțională
Kubernetes folosește sonde de viabilitate și de pregătire pentru a verifica dacă podurile tale funcționează normal. Dacă verificarea de viabilitate eșuează, Kubernetes va opri acel container și apoi îl va reporni automat dacă politica de repornire este setată corespunzător. Dacă verificarea pregătirii eșuează, Kubernetes izolează podul de solicitările de service. Astfel, în astfel de cazuri, intervenția manuală nu mai este deloc necesară, ceea ce este un mare plus.
Lansarea actualizărilor
StatefulSets acceptă actualizări automate: dacă selectați strategia RollingUpdate, fiecare sub Kafka va fi actualizat pe rând. În acest fel, timpul de nefuncționare poate fi redus la zero.
Scalare
Scalarea unui cluster Kafka nu este o sarcină ușoară. Cu toate acestea, Kubernetes face foarte ușor să scalați pod-urile la un anumit număr de replici, ceea ce înseamnă că puteți defini în mod declarativ cât de mulți brokeri Kafka doriți. Cel mai dificil lucru în acest caz este reatribuirea sectoarelor după mărire sau înainte de reducere. Din nou, Kubernetes vă va ajuta cu această sarcină.
administrare
Sarcinile legate de administrarea clusterului dvs. Kafka, cum ar fi crearea de subiecte și reatribuirea sectoarelor, pot fi efectuate folosind scripturi shell existente prin deschiderea interfeței de linie de comandă în pod-urile dvs. Cu toate acestea, această soluție nu este foarte frumoasă. Strimzi acceptă gestionarea subiectelor folosind un operator diferit. Există un loc de îmbunătățire aici.
Backup și restaurare
Acum, disponibilitatea lui Kafka va depinde și de disponibilitatea Kubernetes. Dacă clusterul dvs. Kubernetes eșuează, atunci, în cel mai rău caz, clusterul dvs. Kafka va eșua. Conform legii lui Murphy, acest lucru se va întâmpla cu siguranță și veți pierde date. Pentru a reduce acest tip de risc, aveți un concept bun de rezervă. Puteți utiliza MirrorMaker, o altă opțiune este să utilizați S3 pentru aceasta, așa cum este descris în aceasta
Concluzie
Când lucrați cu clustere Kafka de dimensiuni mici și mijlocii, merită cu siguranță să utilizați Kubernetes, deoarece oferă flexibilitate suplimentară și simplifică experiența operatorului. Dacă aveți cerințe foarte semnificative de latență nefuncțională și/sau de debit, atunci poate fi mai bine să luați în considerare o altă opțiune de implementare.
Sursa: www.habr.com