Salam, Habr!
Pada suatu waktu, kami adalah orang pertama yang memperkenalkan topik tersebut ke pasar Rusia
pengenalan
Kubernetes dirancang untuk menangani beban kerja tanpa kewarganegaraan. Biasanya, beban kerja seperti itu disajikan dalam bentuk arsitektur layanan mikro, ringan, dapat diskalakan dengan baik secara horizontal, mengikuti prinsip aplikasi 12 faktor, dan dapat bekerja dengan pemutus sirkuit dan monyet chaos.
Kafka, di sisi lain, pada dasarnya bertindak sebagai database terdistribusi. Jadi, saat bekerja, Anda harus berurusan dengan negara, dan ini jauh lebih berat daripada layanan mikro. Kubernetes mendukung muatan stateful, namun seperti yang ditunjukkan oleh Kelsey Hightower dalam dua tweetnya, muatan tersebut harus ditangani dengan hati-hati:
Beberapa orang merasa bahwa jika Anda memasukkan Kubernetes ke dalam beban kerja stateful, maka Kubernetes akan menjadi database yang terkelola sepenuhnya dan menyaingi RDS. Ini salah. Mungkin, jika Anda bekerja cukup keras, menambahkan komponen tambahan, dan menarik tim insinyur SRE, Anda akan mampu membangun RDS di atas Kubernetes.
Saya selalu menyarankan agar semua orang sangat berhati-hati saat menjalankan beban kerja stateful di Kubernetes. Kebanyakan orang yang bertanya “bisakah saya menjalankan beban kerja stateful di Kubernetes” tidak memiliki cukup pengalaman dengan Kubernetes, dan sering kali mereka menanyakan beban kerja tersebut.
Jadi, haruskah Anda menjalankan Kafka di Kubernetes? Pertanyaan balasan: apakah Kafka akan bekerja lebih baik tanpa Kubernetes? Itu sebabnya saya ingin menyoroti dalam artikel ini bagaimana Kafka dan Kubernetes saling melengkapi, dan kendala apa yang mungkin timbul jika menggabungkan keduanya.
Waktu penyelesaian
Mari kita bicara tentang hal mendasar - lingkungan runtime itu sendiri
proses
Broker Kafka ramah terhadap CPU. TLS mungkin menimbulkan beberapa overhead. Namun, klien Kafka mungkin lebih intensif CPU jika mereka menggunakan enkripsi, namun hal ini tidak memengaruhi broker.
ingatan
Broker Kafka memakan memori. Ukuran heap JVM biasanya dibatasi hingga 4-5 GB, namun Anda juga memerlukan banyak memori sistem karena Kafka menggunakan cache halaman dengan sangat banyak. Di Kubernetes, tetapkan sumber daya container dan batas permintaan yang sesuai.
Penyimpanan data
Penyimpanan data dalam container bersifat sementara - data hilang saat dimulai ulang. Untuk data Kafka Anda bisa menggunakan volume emptyDir
, dan efeknya akan serupa: data broker Anda akan hilang setelah selesai. Pesan Anda masih dapat disimpan di broker lain sebagai replika. Oleh karena itu, setelah restart, broker yang gagal harus mereplikasi semua data terlebih dahulu, dan proses ini bisa memakan banyak waktu.
Inilah sebabnya mengapa Anda harus menggunakan penyimpanan data jangka panjang. Biarlah penyimpanan jangka panjang non-lokal dengan sistem file XFS atau, lebih tepatnya, ext4. Jangan gunakan NFS. Aku sudah memperingatkanmu. NFS versi v3 atau v4 tidak akan berfungsi. Singkatnya, broker Kafka akan crash jika tidak dapat menghapus direktori data karena masalah "ganti nama yang bodoh" di NFS. Jika saya belum meyakinkan Anda, berhati-hatilah
Сеть
Seperti kebanyakan sistem terdistribusi, kinerja Kafka sangat bergantung pada menjaga latensi jaringan seminimal mungkin dan bandwidth maksimal. Jangan mencoba menghosting semua broker di node yang sama, karena ini akan mengurangi ketersediaan. Jika node Kubernetes gagal, seluruh cluster Kafka akan gagal. Selain itu, jangan menyebarkan cluster Kafka ke seluruh pusat data. Hal yang sama berlaku untuk cluster Kubernetes. Kompromi yang baik dalam hal ini adalah memilih zona ketersediaan yang berbeda.
Konfigurasi
Manifesto reguler
Situs web Kubernetes memiliki
- Bawah: Pod adalah unit terkecil yang dapat di-deploy di Kubernetes. Sebuah pod berisi beban kerja Anda, dan pod itu sendiri berhubungan dengan proses di klaster Anda. Sebuah pod berisi satu atau lebih container. Setiap server ZooKeeper dalam ansambel dan setiap broker di cluster Kafka akan berjalan di pod terpisah.
- StatefulSet: StatefulSet adalah objek Kubernetes yang menangani beberapa beban kerja stateful, dan beban kerja tersebut memerlukan koordinasi. StatefulSets memberikan jaminan mengenai pemesanan pod dan keunikannya.
- Layanan tanpa kepala: Layanan memungkinkan Anda melepaskan pod dari klien menggunakan nama logis. Kubernetes dalam hal ini bertanggung jawab atas penyeimbangan beban. Namun, saat mengoperasikan beban kerja stateful, seperti ZooKeeper dan Kafka, klien perlu berkomunikasi dengan instans tertentu. Di sinilah layanan tanpa kepala berguna: dalam hal ini, klien masih memiliki nama logis, tetapi Anda tidak perlu menghubungi pod secara langsung.
- Volume penyimpanan jangka panjang: Volume ini diperlukan untuk mengonfigurasi penyimpanan persisten blok non-lokal yang disebutkan di atas.
Pada
Grafik helm
Helm adalah pengelola paket untuk Kubernetes yang dapat dibandingkan dengan pengelola paket OS seperti yum, apt, Homebrew, atau Chocolatey. Ini memudahkan untuk menginstal paket perangkat lunak yang telah ditentukan sebelumnya yang dijelaskan dalam bagan Helm. Bagan Helm yang dipilih dengan baik memudahkan tugas sulit tentang cara mengonfigurasi semua parameter dengan benar untuk menggunakan Kafka di Kubernetes. Ada beberapa diagram Kafka: diagram resmi berada
Operator
Karena Helm memiliki kekurangan tertentu, alat lain yang mendapatkan popularitas besar: operator Kubernetes. Operator tidak hanya mengemas perangkat lunak untuk Kubernetes, tetapi juga mengizinkan Anda untuk menerapkan perangkat lunak tersebut dan mengelolanya.
Dalam daftar
Performa
Penting untuk menguji kinerja dengan melakukan tolok ukur pada instans Kafka Anda. Tes semacam itu akan membantu Anda menemukan potensi hambatan sebelum masalah muncul. Untungnya, Kafka sudah menyediakan dua alat pengujian kinerja: kafka-producer-perf-test.sh
и kafka-consumer-perf-test.sh
. Manfaatkan mereka secara aktif. Sebagai referensi, Anda dapat merujuk pada hasil yang dijelaskan dalam
Operasi
Pemantauan
Transparansi dalam sistem sangat penting - jika tidak, Anda tidak akan mengerti apa yang terjadi di dalamnya. Saat ini terdapat toolkit solid yang menyediakan pemantauan berbasis metrik dalam gaya cloud native. Dua alat populer untuk tujuan ini adalah Prometheus dan Grafana. Prometheus dapat mengumpulkan metrik dari semua proses Java (Kafka, Zookeeper, Kafka Connect) menggunakan eksportir JMX - dengan cara yang paling sederhana. Jika Anda menambahkan metrik cAdvisor, Anda dapat lebih memahami bagaimana sumber daya digunakan di Kubernetes.
Strimzi memiliki contoh dasbor Grafana yang sangat nyaman untuk Kafka. Ini memvisualisasikan metrik utama, misalnya, tentang sektor yang kurang direplikasi atau sektor yang sedang offline. Semuanya sangat jelas di sana. Metrik ini dilengkapi dengan pemanfaatan sumber daya dan informasi kinerja, serta indikator stabilitas. Jadi, Anda mendapatkan pemantauan klaster Kafka dasar secara gratis!
Sumber:
Akan lebih baik jika melengkapi semua ini dengan pemantauan klien (metrik pada konsumen dan produsen), serta pemantauan latensi (untuk ini ada
Penebangan
Pencatatan log adalah tugas penting lainnya. Pastikan semua kontainer di instalasi Kafka Anda masuk stdout
и stderr
, dan juga memastikan bahwa klaster Kubernetes Anda mengumpulkan semua log ke dalam infrastruktur logging pusat, misalnya.
Pengujian Fungsional
Kubernetes menggunakan pemeriksaan keaktifan dan kesiapan untuk memeriksa apakah pod Anda berjalan normal. Jika pemeriksaan keaktifan gagal, Kubernetes akan menghentikan container tersebut dan kemudian memulai ulang secara otomatis jika kebijakan mulai ulang diatur dengan tepat. Jika pemeriksaan kesiapan gagal, Kubernetes akan mengisolasi pod dari permintaan layanan. Oleh karena itu, dalam kasus seperti ini, intervensi manual tidak lagi diperlukan sama sekali, dan ini merupakan nilai tambah yang besar.
Meluncurkan pembaruan
StatefulSets mendukung pembaruan otomatis: jika Anda memilih strategi RollingUpdate, setiap pembaruan di bawah Kafka akan diperbarui secara bergantian. Dengan cara ini, downtime dapat dikurangi menjadi nol.
penskalaan
Menskalakan klaster Kafka bukanlah tugas yang mudah. Namun, Kubernetes mempermudah penskalaan pod ke sejumlah replika tertentu, yang berarti Anda dapat secara deklaratif menentukan broker Kafka sebanyak yang Anda inginkan. Hal tersulit dalam hal ini adalah menugaskan kembali sektor-sektor setelah peningkatan atau sebelum penurunan. Sekali lagi, Kubernetes akan membantu Anda dalam tugas ini.
administrasi
Tugas yang terkait dengan pengelolaan klaster Kafka Anda, seperti membuat topik dan menetapkan ulang sektor, dapat dilakukan menggunakan skrip shell yang ada dengan membuka antarmuka baris perintah di pod Anda. Namun, solusi ini tidak terlalu bagus. Strimzi mendukung pengelolaan topik menggunakan operator berbeda. Ada beberapa ruang untuk perbaikan di sini.
Cadangkan dan pulihkan
Kini ketersediaan Kafka juga akan bergantung pada ketersediaan Kubernetes. Jika klaster Kubernetes Anda gagal, dalam skenario terburuk, klaster Kafka Anda juga akan gagal. Menurut hukum Murphy, ini pasti akan terjadi dan Anda akan kehilangan data. Untuk mengurangi risiko jenis ini, milikilah konsep cadangan yang baik. Anda dapat menggunakan MirrorMaker, opsi lainnya adalah menggunakan S3 untuk ini, seperti yang dijelaskan di sini
Kesimpulan
Saat bekerja dengan cluster Kafka berukuran kecil hingga menengah, penggunaan Kubernetes sangat bermanfaat karena memberikan fleksibilitas tambahan dan menyederhanakan pengalaman operator. Jika Anda memiliki latensi non-fungsional dan/atau persyaratan throughput yang sangat signifikan, mungkin lebih baik mempertimbangkan beberapa opsi penerapan lainnya.
Sumber: www.habr.com