Panduan ini akan menunjukkan cara menggunakan operator Strimzi untuk men-deploy cluster Apache Kafka.
Kafka adalah sistem fitur pesan terdistribusi dan open source yang dirancang untuk menangani data streaming real-time, bervolume tinggi, dan memiliki throughput tinggi. Platform ini memungkinkan Anda membangun pipeline data streaming untuk transfer data yang andal di berbagai sistem dan aplikasi, agar dapat mendukung tugas pemrosesan dan analisis.
Operator adalah ekstensi software yang menggunakan resource kustom untuk mengelola aplikasi dan komponen terkait. Untuk mempelajari lebih lanjut motivasi dalam menggunakan operator, lihat Pola operator di dokumentasi Kubernetes open source. Operator Strimzi menawarkan fleksibilitas dalam memilih opsi deployment serta memungkinkan Anda menggunakan taint dan toleransi Kubernetes untuk menjalankan Kafka pada node khusus.
Panduan ini ditujukan untuk para administrator platform, arsitek cloud, dan profesional operasi yang ingin men-deploy cluster Kafka di GKE.
Solusi ini menjadi titik awal yang bagus jika Anda ingin mempelajari cara men-deploy cluster Kafka menggunakan operator pihak ketiga untuk mengotomatiskan pengelolaan dan mengurangi error. Jika Anda lebih memilih kontrol operasional yang lebih terperinci, lihat Men-deploy cluster Kafka yang sangat tersedia di GKE.
Menyiapkan lingkungan
Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software
yang Anda perlukan untuk tutorial ini, termasuk
kubectl
, gcloud CLI, Helm, dan Terraform.
Untuk menyiapkan lingkungan Anda dengan Cloud Shell, ikuti langkah-langkah berikut:
Luncurkan sesi Cloud Shell dari Google Cloud konsol, dengan mengklik
Aktifkan Cloud Shell di Google Cloud konsol. Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud .
Menetapkan variabel lingkungan:
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=kafka export REGION=us-central1
Ganti
PROJECT_ID
: Google Cloud Anda dengan project ID Anda.Buat clone repositori GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Ubah ke direktori kerja:
cd kubernetes-engine-samples/streaming/
Membuat infrastruktur cluster
Di bagian ini, Anda akan menjalankan skrip Terraform untuk membuat cluster GKE regional pribadi yang sangat tersedia. Langkah-langkah berikut memungkinkan akses publik ke bidang kontrol. Untuk membatasi akses, buat cluster pribadi.
Anda dapat menginstal operator menggunakan cluster Standard atau Autopilot.
Standar
Diagram berikut menunjukkan cluster GKE Standard regional pribadi yang di-deploy ke tiga zona yang berbeda:
Untuk men-deploy infrastruktur ini, jalankan perintah berikut dari Cloud Shell:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=kafka/terraform/gke-standard init
terraform -chdir=kafka/terraform/gke-standard apply -var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
Saat diminta, ketik yes
. Anda mungkin perlu menunggu beberapa menit agar perintah ini selesai
dan cluster akan menampilkan status siap.
Terraform membuat resource berikut:
- Jaringan VPC dan subnet pribadi untuk node Kubernetes.
- Router untuk mengakses internet melalui NAT.
- Cluster GKE pribadi di region
us-central1
. - 2 node pool dengan penskalaan otomatis aktif (1-2 node per zona, minimum 1 node per zona)
ServiceAccount
dengan izin logging dan pemantauan.- Pencadangan untuk GKE pada pemulihan dari bencana (disaster recovery).
- Google Cloud Managed Service for Prometheus untuk pemantauan cluster.
Outputnya mirip dengan hal berikut ini:
...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
Outputs:
kubectl_connection_command = "gcloud container clusters get-credentials strimzi-cluster --region us-central1"
Autopilot
Diagram berikut menunjukkan cluster GKE Autopilot regional pribadi:
Untuk men-deploy infrastruktur, jalankan perintah berikut dari Cloud Shell:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=kafka/terraform/gke-autopilot init
terraform -chdir=kafka/terraform/gke-autopilot apply -var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
Saat diminta, ketik yes
. Anda mungkin perlu menunggu beberapa menit agar perintah ini selesai
dan cluster akan menampilkan status siap.
Terraform membuat resource berikut:
- Jaringan VPC dan subnet pribadi untuk node Kubernetes.
- Router untuk mengakses internet melalui NAT.
- Cluster GKE pribadi di region
us-central1
. ServiceAccount
dengan izin logging dan pemantauan- Google Cloud Managed Service for Prometheus untuk pemantauan cluster.
Output yang ada mirip dengan berikut ini:
...
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
Outputs:
kubectl_connection_command = "gcloud container clusters get-credentials strimzi-cluster --region us-central1"
Menghubungkan ke cluster
Konfigurasi kubectl
untuk berkomunikasi dengan cluster:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --region ${REGION}
Men-deploy operator Strimzi ke cluster Anda
Di bagian ini, Anda akan men-deploy operator Strimzi menggunakan chart Helm. Ada juga beberapa cara lain untuk men-deploy Strimzi.
Tambahkan repositori Chart Helm Strimzi:
helm repo add strimzi https://strimzi.io/charts/
Tambahkan namespace untuk Operator Strimzi dan cluster Kafka:
kubectl create ns kafka
Deploy operator cluster Strimzi menggunakan Helm:
helm install strimzi-operator strimzi/strimzi-kafka-operator -n kafka
Untuk men-deploy cluster Kafka dan Operator Cluster ke berbagai namespace, tambahkan parameter
--set watchNamespaces="{kafka-namespace,kafka-namespace-2,...}"
ke perintah helm.Pastikan Operator Cluster Strimzi berhasil di-deploy menggunakan Helm:
helm ls -n kafka
Output yang ada mirip dengan berikut ini:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION strimzi-operator kafka 1 2023-06-27 11:22:15.850545 +0200 CEST deployed strimzi-kafka-operator-0.35.0 0.35.0
Men-deploy Kafka
Setelah operator di-deploy ke cluster, Anda siap men-deploy instance cluster Kafka.
Di bagian ini, Anda akan men-deploy Kafka dalam konfigurasi dasar, lalu mencoba berbagai skenario konfigurasi lanjutan untuk memenuhi persyaratan ketersediaan, keamanan, dan kemampuan observasi.
Konfigurasi dasar
Konfigurasi dasar untuk instance Kafka mencakup komponen berikut:
- Tiga replika broker Kafka, dengan minimal dua replika yang tersedia diperlukan untuk konsistensi cluster.
- Tiga replika node ZooKeeper, yang membentuk cluster.
- Dua pemroses Kafka: satu tanpa autentikasi, dan satu lagi menggunakan autentikasi TLS dengan sertifikat yang dibuat oleh Strimzi.
- Java MaxHeapSize dan MinHeapSize disetel ke 4 GB untuk Kafka dan 2 GB untuk ZooKeeper.
- Alokasi resource CPU dari 1 permintaan CPU dan 2 batas CPU untuk Kafka dan ZooKeeper, beserta permintaan memori 5 GB dan batas untuk Kafka (4 GB untuk layanan utama dan 0,5 GB untuk pengekspor metrik) dan 2,5 GB untuk ZooKeeper (2 GB untuk layanan utama dan 0,5 GB untuk pengekspor metrik).
- Operator entitas dengan permintaan dan batas berikut:
tlsSidecar
: CPU 100 m/500 m dan memori 128 Mi.topicOperator
: CPU 100 m/500 m dan memori 512 Mi.userOperator
: CPU 500 m dan memori 2 Gi.
- Penyimpanan sebesar 100 GB dialokasikan ke setiap Pod menggunakan
premium-rwo
storageClass
. - Toleransi, nodeAffinities, dan podAntiAffinities dikonfigurasi untuk setiap workload, dan memastikan distribusi yang tepat di seluruh node, dengan memanfaatkan node pool masing-masing dan berbagai zona.
- Komunikasi di dalam cluster diberi keamanan dari sertifikat yang ditandatangani sendiri: Certificate Authority (CA) yang terpisah untuk cluster dan klien (mTLS). Anda juga dapat menyetel konfigurasi agar dapat menggunakan Certificate Authority yang lain.
Konfigurasi ini menampilkan penyiapan minimal yang diperlukan untuk membuat cluster Kafka siap produksi. Bagian berikut menunjukkan konfigurasi kustom yang dapat menangani berbagai aspek seperti keamanan cluster, Daftar Kontrol Akses (ACL), pengelolaan topik, pengelolaan sertifikat, dan banyak lagi.
Membuat cluster Kafka dasar
Buat cluster Kafka baru menggunakan konfigurasi dasar:
kubectl apply -n kafka -f kafka-strimzi/manifests/01-basic-cluster/my-cluster.yaml
Perintah ini membuat resource kustom Kafka dari operator Strimzi yang berisi permintaan dan batas bagi CPU dan memori, permintaan block storage, serta kombinasi taint dan afinitas untuk mendistribusikan Pod yang disediakan ke seluruh node Kubernetes.
Tunggu beberapa menit selagi Kubernetes memulai workload yang diperlukan:
kubectl wait kafka/my-cluster --for=condition=Ready --timeout=600s -n kafka
Pastikan workload Kafka telah dibuat:
kubectl get pod,service,deploy,pdb -l=strimzi.io/cluster=my-cluster -n kafka
Output yang ada mirip dengan berikut ini:
NAME READY STATUS RESTARTS AGE pod/my-cluster-entity-operator-848698874f-j5m7f 3/3 Running 0 44m pod/my-cluster-kafka-0 1/1 Running 0 5m pod/my-cluster-kafka-1 1/1 Running 0 5m pod/my-cluster-kafka-2 1/1 Running 0 5m pod/my-cluster-zookeeper-0 1/1 Running 0 6m pod/my-cluster-zookeeper-1 1/1 Running 0 6m pod/my-cluster-zookeeper-2 1/1 Running 0 6m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-cluster-kafka-bootstrap ClusterIP 10.52.8.80 <none> 9091/TCP,9092/TCP,9093/TCP 5m service/my-cluster-kafka-brokers ClusterIP None <none> 9090/TCP,9091/TCP,9092/TCP,9093/TCP 5m service/my-cluster-zookeeper-client ClusterIP 10.52.11.144 <none> 2181/TCP 6m service/my-cluster-zookeeper-nodes ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 6m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-cluster-entity-operator 1/1 1 1 44m NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE poddisruptionbudget.policy/my-cluster-kafka 2 N/A 1 5m poddisruptionbudget.policy/my-cluster-zookeeper 2 N/A 1 6m
Operator membuat resource berikut:
- Dua
StrimziPodSets
untuk Kafka dan ZooKeeper. - Tiga Pod untuk replika broker Kafka.
- Tiga Pod untuk replika ZooKeeper.
- Dua
PodDisruptionBudgets
, yang memastikan ketersediaan atas minimum dua replika untuk konsistensi cluster. - Layanan bernama
my-cluster-kafka-bootstrap
yang berfungsi sebagai server bootstrap untuk klien Kafka yang terhubung dari dalam cluster Kubernetes. Semua pemroses Kafka internal tersedia di Layanan ini. - Layanan headless bernama
my-cluster-kafka-brokers
yang mengaktifkan resolusi DNS pada alamat IP Pod broker Kafka secara langsung. Layanan ini digunakan untuk komunikasi antar broker. - Layanan bernama
my-cluster-zookeeper-client
yang memungkinkan broker Kafka terhubung ke node ZooKeeper sebagai klien. - Layanan headless bernama
my-cluster-zookeeper-nodes
yang mengaktifkan resolusi DNS pada alamat IP Pod ZooKeeper secara langsung. Layanan ini digunakan untuk menghubungkan antar replika ZooKeeper. - Deployment bernama
my-cluster-entity-operator
yang berisi operator topik dan operator pengguna serta memfasilitasi pengelolaan resource kustomKafkaTopics
danKafkaUsers
.
Anda juga dapat mengonfigurasi dua NetworkPolicies
agar dapat memfasilitasi konektivitas ke
pemroses Kafka dari Pod dan Namespace mana pun. Kebijakan ini juga akan
membatasi koneksi broker ke ZooKeeper, serta memungkinkan komunikasi antara
Pod cluster dan port Layanan internal yang eksklusif untuk komunikasi cluster.
Autentikasi dan pengelolaan pengguna
Bagian ini menunjukkan cara mengaktifkan autentikasi dan otorisasi untuk mengamankan Pemroses Kafka dan berbagi kredensial dengan klien.
Strimzi menyediakan metode berbasis Kubernetes untuk pengelolaan pengguna menggunakan
User Operator
terpisah dan resource kustom Kubernetes yang sesuai,
KafkaUser
,
yang menentukan konfigurasi pengguna. Konfigurasi pengguna mencakup setelan
untuk autentikasi dan otorisasi, serta penyediaan pengguna terkait di
Kafka.
Strimzi dapat membuat pemroses dan pengguna Kafka yang mendukung beberapa mekanisme autentikasi seperti autentikasi berbasis nama pengguna dan sandi (SCRAM-SHA-512) atau TLS. Anda juga dapat menggunakan autentikasi OAuth 2.0, yang sering dianggap sebagai pendekatan yang lebih baik dibandingkan saat menggunakan sandi atau sertifikat untuk autentikasi berkat pengelolaan kredensial eksternal dan keamanannya yang lebih baik.
Men-deploy cluster Kafka
Bagian ini menunjukkan cara men-deploy operator Strimzi sebagai demonstrasi dari kemampuan pengelolaan pengguna, termasuk:
- Cluster Kafka dengan autentikasi berbasis sandi (SCRAM-SHA-512) yang diaktifkan di salah satu pemroses.
KafkaTopic
dengan 3 replika.KafkaUser
dengan ACL yang menyatakan bahwa pengguna memiliki izin baca dan tulis ke topik terkait.
Konfigurasikan cluster Kafka Anda agar dapat menggunakan pemroses dengan autentikasi SCRAM-SHA-512 berbasis sandi pada port 9094 dan otorisasi sederhana:
kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/my-cluster.yaml
Buat
Topic
,User
, dan Pod klien untuk menjalankan perintah terhadap cluster Kafka:kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/topic.yaml kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/my-user.yaml
Secret
my-user
dengan kredensial pengguna yang dipasang ke Pod klien sebagai Volume.Kredensial ini mengonfirmasi bahwa pengguna memiliki izin untuk memublikasikan pesan ke topik menggunakan pemroses yang mengaktifkan autentikasi berbasis sandi (SCRAM-SHA-512).
Buat pod klien:
kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/kafkacat.yaml
Tunggu beberapa menit hingga Pod klien menjadi
Ready
, lalu hubungkan ke Pod:kubectl wait --for=condition=Ready pod --all -n kafka --timeout=600s kubectl exec -it kafkacat -n kafka -- /bin/sh
Buat pesan baru dengan kredensial
my-user
, lalu coba gunakan pesan tersebut:echo "Message from my-user" |kcat \ -b my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9094 \ -X security.protocol=SASL_SSL \ -X sasl.mechanisms=SCRAM-SHA-512 \ -X sasl.username=my-user \ -X sasl.password=$(cat /my-user/password) \ -t my-topic -P kcat -b my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9094 \ -X security.protocol=SASL_SSL \ -X sasl.mechanisms=SCRAM-SHA-512 \ -X sasl.username=my-user \ -X sasl.password=$(cat /my-user/password) \ -t my-topic -C
Output yang ada mirip dengan berikut ini:
Message from my-user % Reached end of topic my-topic [0] at offset 0 % Reached end of topic my-topic [2] at offset 1 % Reached end of topic my-topic [1] at offset 0
Ketik
CTRL+C
untuk menghentikan proses penggunaan.Keluar dari shell Pod
exit
Cadangan dan pemulihan dari bencana (disaster recovery)
Meskipun operator Strimzi tidak menawarkan fungsi pencadangan bawaan, Anda dapat menerapkan strategi pencadangan yang efisien dengan mengikuti pola tertentu.
Anda dapat menggunakan Pencadangan untuk GKE untuk mencadangkan:
- Manifes resource Kubernetes.
- Resource kustom Strimzi API beserta definisinya yang diekstrak dari server Kubernetes API pada cluster yang sedang dicadangkan.
- Volume yang sesuai dengan resource PersistentVolumeClaim ditemukan dalam manifes.
Untuk mengetahui informasi selengkapnya tentang cara mencadangkan dan memulihkan cluster Kafka menggunakan Pencadangan untuk GKE, lihat Persiapan pemulihan dari bencana (disaster recovery).
Anda juga dapat melakukan pencadangan cluster Kafka yang telah di-deploy menggunakan operator Strimzi. Anda harus mencadangkan:
- Konfigurasi Kafka, yang mencakup semua resource kustom
Strimzi API seperti
KafkaTopics
danKafkaUsers
. - Data terkait, yang disimpan di PersistentVolume broker Kafka.
Dengan menyimpan manifes resource Kubernetes, termasuk konfigurasi Strimzi, di repositori Git, Anda dapat tidak perlu melakukan pencadangan terpisah untuk konfigurasi Kafka, karena resource dapat diterapkan ulang ke cluster Kubernetes baru jika diperlukan.
Untuk mengamankan pemulihan data Kafka jika instance server Kafka, atau
cluster Kubernetes tempat Kafka di-deploy, hilang, sebaiknya Anda mengonfigurasi
kelas penyimpanan Kubernetes yang digunakan untuk volume penyediaan bagi broker
Kafka dengan opsi reclaimPolicy
ditetapkan ke Retain
. Sebaiknya Anda
juga mengambil
snapshot
dari volume broker Kafka.
Manifes berikut menjelaskan StorageClass yang menggunakan reclaimPolicy
opsi Retain
:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: premium-rwo-retain
...
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
Contoh berikut menunjukkan StorageClass yang ditambahkan ke spec
pada
resource kustom cluster Kafka:
# ...
spec:
kafka:
# ...
storage:
type: persistent-claim
size: 100Gi
class: premium-rwo-retain
Dengan konfigurasi ini, PersistentVolume yang disediakan menggunakan kelas penyimpanan tidak akan dihapus meskipun PersistentVolumeClaim yang berkaitan dihapus.
Untuk memulihkan instance Kafka di cluster Kubernetes baru menggunakan data instance broker dan konfigurasi yang ada:
- Terapkan resource kustom Strimzi Kafka yang sudah ada (
Kakfa
,KafkaTopic
,KafkaUser
, dll.) ke cluster Kubernetes baru - Update PersistentVolumeClaims dengan nama instance broker Kafka yang baru
ke PersistentVolumes lama menggunakan properti
spec.volumeName
pada PersistentVolumeClaim.