Salam, Habr!
Pada satu masa, kami adalah yang pertama memperkenalkan topik ini kepada pasaran Rusia
Pengenalan
Kubernetes direka bentuk untuk mengendalikan beban kerja tanpa kewarganegaraan. Biasanya, beban kerja sedemikian dibentangkan dalam bentuk seni bina perkhidmatan mikro, ia ringan, skala mendatar dengan baik, mengikut prinsip aplikasi 12 faktor, dan boleh berfungsi dengan pemutus litar dan monyet huru-hara.
Kafka, sebaliknya, pada dasarnya bertindak sebagai pangkalan data yang diedarkan. Oleh itu, apabila bekerja, anda perlu berurusan dengan keadaan, dan ia jauh lebih berat daripada perkhidmatan mikro. Kubernetes menyokong beban stateful, tetapi seperti yang ditunjukkan oleh Kelsey Hightower dalam dua tweet, mereka harus dikendalikan dengan berhati-hati:
Sesetengah orang merasakan bahawa jika anda melancarkan Kubernetes ke dalam beban kerja stateful, ia menjadi pangkalan data terurus sepenuhnya yang menyaingi RDS. Ini adalah salah. Mungkin, jika anda bekerja keras, menambah komponen tambahan dan menarik pasukan jurutera SRE, anda akan dapat membina RDS di atas Kubernetes.
Saya sentiasa mengesyorkan agar semua orang sentiasa berhati-hati apabila menjalankan beban kerja stateful pada Kubernetes. Kebanyakan orang yang bertanya "bolehkah saya menjalankan beban kerja stateful di Kubernetes" tidak mempunyai pengalaman yang mencukupi dengan Kubernetes, dan selalunya dengan beban kerja yang mereka tanyakan.
Jadi, patutkah anda menjalankan Kafka di Kubernetes? Soalan balas: adakah Kafka akan berfungsi dengan lebih baik tanpa Kubernetes? Itulah sebabnya saya ingin menyerlahkan dalam artikel ini bagaimana Kafka dan Kubernetes saling melengkapi, dan apakah perangkap yang boleh datang dengan menggabungkan mereka.
Masa siap
Mari kita bercakap tentang perkara asas - persekitaran masa jalan itu sendiri
proses
Broker Kafka mesra CPU. TLS mungkin memperkenalkan beberapa overhed. Walau bagaimanapun, pelanggan Kafka mungkin lebih intensif CPU jika mereka menggunakan penyulitan, tetapi ini tidak menjejaskan broker.
memori
Broker Kafka memakan memori. Saiz timbunan JVM biasanya terhad kepada 4-5 GB, tetapi anda juga memerlukan banyak memori sistem kerana Kafka menggunakan cache halaman dengan sangat banyak. Dalam Kubernetes, tetapkan sumber kontena dan had permintaan dengan sewajarnya.
Simpanan data
Penyimpanan data dalam bekas adalah tidak lama - data hilang apabila dimulakan semula. Untuk data Kafka anda boleh menggunakan volum emptyDir
, dan kesannya akan serupa: data broker anda akan hilang selepas selesai. Mesej anda masih boleh disimpan di broker lain sebagai replika. Oleh itu, selepas dimulakan semula, broker yang gagal mesti terlebih dahulu meniru semua data, dan proses ini boleh mengambil banyak masa.
Inilah sebabnya mengapa anda harus menggunakan storan data jangka panjang. Biarkan ia menjadi storan jangka panjang bukan tempatan dengan sistem fail XFS atau, lebih tepat lagi, ext4. Jangan gunakan NFS. Saya memberi amaran kepada awak. NFS versi v3 atau v4 tidak akan berfungsi. Pendek kata, broker Kafka akan ranap jika ia tidak dapat memadamkan direktori data kerana masalah "menamakan semula bodoh" dalam NFS. Jika saya belum meyakinkan anda, berhati-hati
Π‘Π΅ΡΡ
Seperti kebanyakan sistem yang diedarkan, prestasi Kafka sangat bergantung pada mengekalkan kependaman rangkaian pada tahap minimum dan lebar jalur maksimum. Jangan cuba untuk menjadi hos semua broker pada nod yang sama, kerana ini akan mengurangkan ketersediaan. Jika nod Kubernetes gagal, keseluruhan gugusan Kafka akan gagal. Juga, jangan menyebarkan gugusan Kafka di seluruh pusat data. Begitu juga dengan kluster Kubernetes. Kompromi yang baik dalam kes ini ialah memilih zon ketersediaan yang berbeza.
Konfigurasi
Manifesto biasa
Laman web Kubernetes mempunyai
- Di bawah: Pod ialah unit terkecil yang boleh digunakan dalam Kubernetes. Pod mengandungi beban kerja anda dan pod itu sendiri sepadan dengan proses dalam kelompok anda. Satu pod mengandungi satu atau lebih bekas. Setiap pelayan ZooKeeper dalam ensemble dan setiap broker dalam kelompok Kafka akan berjalan dalam pod yang berasingan.
- StatefulSet: StatefulSet ialah objek Kubernetes yang mengendalikan berbilang beban kerja stateful, dan beban kerja tersebut memerlukan penyelarasan. StatefulSets memberikan jaminan mengenai pesanan pod dan keunikannya.
- Perkhidmatan tanpa kepala: Perkhidmatan membolehkan anda menanggalkan pod daripada pelanggan menggunakan nama logik. Kubernetes dalam kes ini bertanggungjawab untuk mengimbangi beban. Walau bagaimanapun, apabila mengendalikan beban kerja stateful, seperti ZooKeeper dan Kafka, pelanggan perlu berkomunikasi dengan contoh tertentu. Di sinilah perkhidmatan tanpa kepala berguna: dalam kes ini, pelanggan masih akan mempunyai nama logik, tetapi anda tidak perlu menghubungi pod secara langsung.
- Jumlah simpanan jangka panjang: Jumlah ini diperlukan untuk mengkonfigurasi storan berterusan blok bukan tempatan yang disebutkan di atas.
Pada
Carta helm
Helm ialah pengurus pakej untuk Kubernetes yang boleh dibandingkan dengan pengurus pakej OS seperti yum, apt, Homebrew atau Chocolatey. Ia memudahkan untuk memasang pakej perisian pratakrif yang diterangkan dalam carta Helm. Carta Helm yang dipilih dengan baik menjadikan tugas sukar untuk mengkonfigurasi semua parameter untuk menggunakan Kafka pada Kubernetes dengan betul. Terdapat beberapa gambar rajah Kafka: yang rasmi terletak
Operator
Oleh kerana Helm mempunyai kelemahan tertentu, alat lain semakin popular: pengendali Kubernetes. Pengendali bukan sahaja membungkus perisian untuk Kubernetes, tetapi juga membenarkan anda menggunakan perisian tersebut dan mengurusnya.
Dalam senarai
Produktiviti
Adalah penting untuk menguji prestasi dengan menanda aras contoh Kafka anda. Ujian sedemikian akan membantu anda mencari kemungkinan kesesakan sebelum masalah timbul. Nasib baik, Kafka sudah menyediakan dua alat ujian prestasi: kafka-producer-perf-test.sh
ΠΈ kafka-consumer-perf-test.sh
. Gunakan secara aktif mereka. Untuk rujukan, anda boleh merujuk kepada keputusan yang diterangkan dalam
Operasi
Pemantauan
Ketelusan dalam sistem adalah sangat penting - jika tidak, anda tidak akan memahami apa yang berlaku di dalamnya. Hari ini terdapat kit alat kukuh yang menyediakan pemantauan berasaskan metrik dalam gaya asli awan. Dua alat popular untuk tujuan ini ialah Prometheus dan Grafana. Prometheus boleh mengumpul metrik daripada semua proses Java (Kafka, Zookeeper, Kafka Connect) menggunakan pengeksport JMX - dengan cara yang paling mudah. Jika anda menambah metrik cAdvisor, anda boleh memahami dengan lebih lengkap cara sumber digunakan dalam Kubernetes.
Strimzi mempunyai contoh papan pemuka Grafana yang sangat mudah untuk Kafka. Ia menggambarkan metrik utama, contohnya, mengenai sektor yang kurang direplikasi atau yang berada di luar talian. Semuanya sangat jelas di sana. Metrik ini dilengkapi dengan penggunaan sumber dan maklumat prestasi, serta penunjuk kestabilan. Jadi anda mendapat pemantauan gugusan Kafka asas secara percuma!
Sumber:
Adalah baik untuk menambah semua ini dengan pemantauan pelanggan (metrik pada pengguna dan pengeluar), serta pemantauan kependaman (untuk ini terdapat
Pembalakan
Pembalakan adalah satu lagi tugas kritikal. Pastikan semua bekas dalam pemasangan Kafka anda dilog masuk stdout
ΠΈ stderr
, dan juga memastikan bahawa kluster Kubernetes anda mengagregatkan semua log masuk ke dalam infrastruktur pembalakan pusat, mis.
Pemeriksaan kesihatan
Kubernetes menggunakan probe keaktifan dan kesediaan untuk memeriksa sama ada pod anda berjalan seperti biasa. Jika semakan keaktifan gagal, Kubernetes akan menghentikan bekas itu dan kemudian memulakan semula secara automatik jika dasar mula semula ditetapkan dengan sewajarnya. Jika semakan kesediaan gagal, Kubernetes mengasingkan pod daripada permintaan servis. Oleh itu, dalam kes sedemikian, campur tangan manual tidak lagi diperlukan sama sekali, yang merupakan tambahan besar.
Melancarkan kemas kini
StatefulSets menyokong kemas kini automatik: jika anda memilih strategi RollingUpdate, setiap satu di bawah Kafka akan dikemas kini secara bergilir. Dengan cara ini, masa henti boleh dikurangkan kepada sifar.
Penskalaan
Menskala gugusan Kafka bukanlah tugas yang mudah. Walau bagaimanapun, Kubernetes menjadikannya sangat mudah untuk menskalakan pod kepada bilangan replika tertentu, yang bermaksud anda boleh mentakrifkan seberapa banyak broker Kafka yang anda suka. Perkara yang paling sukar dalam kes ini ialah menugaskan semula sektor selepas meningkat atau sebelum mengecilkan. Sekali lagi, Kubernetes akan membantu anda dengan tugas ini.
Pentadbiran
Tugas yang berkaitan dengan mentadbir gugusan Kafka anda, seperti mencipta topik dan menetapkan semula sektor, boleh dilakukan menggunakan skrip shell sedia ada dengan membuka antara muka baris arahan dalam pod anda. Walau bagaimanapun, penyelesaian ini tidak begitu cantik. Strimzi menyokong pengurusan topik menggunakan pengendali yang berbeza. Terdapat sedikit ruang untuk penambahbaikan di sini.
Sandarkan dan pulihkan
Kini ketersediaan Kafka juga bergantung pada ketersediaan Kubernetes. Jika gugusan Kubernetes anda gagal, maka dalam senario kes terburuk, gugusan Kafka anda juga akan gagal. Mengikut undang-undang Murphy, ini pasti akan berlaku, dan anda akan kehilangan data. Untuk mengurangkan jenis risiko ini, miliki konsep sandaran yang baik. Anda boleh menggunakan MirrorMaker, pilihan lain ialah menggunakan S3 untuk ini, seperti yang diterangkan dalam ini
Kesimpulan
Apabila bekerja dengan gugusan Kafka bersaiz kecil hingga sederhana, ia pasti berbaloi menggunakan Kubernetes kerana ia memberikan fleksibiliti tambahan dan memudahkan pengalaman pengendali. Jika anda mempunyai kependaman tidak berfungsi dan/atau keperluan pemprosesan yang sangat ketara, maka mungkin lebih baik untuk mempertimbangkan beberapa pilihan penggunaan lain.
Sumber: www.habr.com