Men-deploy Apache Kafka ke GKE menggunakan Strimzi


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.

Tujuan

  • Merencanakan dan men-deploy infrastruktur GKE untuk Apache Kafka
  • Men-deploy dan mengonfigurasi operator Strimzi
  • Mengonfigurasi Apache Kafka menggunakan operator Strimzi

Manfaat

Penggunaan Strimzi memiliki manfaat berikut:

  • Operator Strimzi memberikan pendekatan yang disederhanakan dan berbasis Kubernetes untuk mengelola cluster Kafka. Strimzi menggunakan resource kustom yang mewakili pengguna dan topik Kafka, sehingga pengelolaan cluster menjadi jauh lebih mudah dan sesuai dengan praktik terbaik Kubernetes.
  • Strimzi memprioritaskan keamanan secara default dengan membuat sertifikat untuk para pemroses dan mendukung metode autentikasi yang aman seperti TLS, SCRAM-SHA, dan OAuth. Strimzi juga menangani NetworkPolicy untuk semua pemroses Kafka.
  • Strimzi tidak menggunakan dependensi eksternal. Platform ini memiliki cluster Kafka dan ZooKeeper dengan pengekspor metrik bawaan, sehingga Anda tidak perlu menggunakan alat tambahan. Anda juga dapat menyesuaikan konfigurasi broker untuk memenuhi persyaratan tertentu.

Arsitektur deployment

Cluster Kafka terdiri dari satu atau beberapa server, yang dikenal sebagai broker. Server tersebut berkolaborasi untuk mengelola aliran data masuk dan memfasilitasi pesan publikasi-langganan bagi klien Kafka, yang disebut sebagai konsumen.

Setiap partisi data dalam cluster Kafka memiliki broker pemimpin, yang bertanggung jawab untuk mengelola semua operasi baca dan tulis ke partisi tersebut. Partisi ini juga dapat memiliki satu atau beberapa broker pengikut yang secara pasif mereplikasi tindakan broker pemimpin.

Dalam penyiapan umum, ZooKeeper mengoordinasikan cluster Kafka dengan membantu memilih pemimpin di antara broker, dan memastikan failover dapat berjalan lancar jika terjadi masalah.

Anda juga dapat men-deploy konfigurasi Kafka tanpa Zookeeper dengan mengaktifkan mode KRaft, tetapi metode ini tidak dianggap siap produksi oleh komunitas Strimzi karena tidak memiliki dukungan untuk resource KafkaTopic, autentikasi kredensial, dan lainnya.

Ketersediaan dan pemulihan dari bencana (disaster recovery)

Tutorial ini menggunakan node pool dan zona yang terpisah untuk cluster Kafka dan ZooKeeper guna memastikan ketersediaan tinggi dan mempersiapkan proses pemulihan dari bencana (disaster recovery).

Penggunaan beberapa node dan zona sangat penting untuk mencapai cluster Kubernetes yang memiliki ketersediaan tinggi di Google Cloud. Alasannya sebagai berikut:

  • Fault tolerance: Beberapa node yang ada akan mendistribusikan workload di seluruh cluster, memastikan bahwa jika satu node gagal, node lainnya dapat mengambil alih tugas, sehingga mencegah periode nonaktif dan gangguan layanan.
  • Skalabilitas: Penggunaan beberapa node akan memastikan penskalaan horizontal dapat menambahkan atau menghapus node sesuai kebutuhan, sehingga memastikan alokasi resource yang optimal dan mengakomodasi peningkatan permintaan workload dan traffic.
  • Ketersediaan tinggi: Penggunaan beberapa zona dalam satu region akan memastikan redundansi dan meminimalkan risiko titik tunggal kegagalan. Jika seluruh zona ketersediaan mengalami pemadaman, cluster dapat terus berjalandi zona lain, sehingga mempertahankan ketersediaan layanan.
  • Redundansi geografis: Dengan menjangkau node di berbagai region, data dan layanan cluster akan dapat terdistribusi secara geografis, sehingga memberikan ketahanan terhadap bencana alam, pemadaman listrik, atau gangguan lokal lainnya yang mungkin memengaruhi satu zona.
  • Update dan pemeliharaan berkelanjutan: Penggunaan beberapa zona akan memastikan bahwa update dan pemeliharaan berkelanjutan dapat dilakukan pada setiap node tanpa memengaruhi keseluruhan ketersediaan cluster. Hal ini memastikan layanan yang berkelanjutan, sekaligus memungkinkan update dan patch harus ada diterapkan dengan lancar.
  • Perjanjian Tingkat Layanan (SLA): Google Cloud menyediakan SLA untuk deployment multi-zona, yang menjamin tingkat waktu beroperasi dan ketersediaan minimum.

Diagram deployment

Diagram berikut menunjukkan cluster Kafka yang berjalan pada beberapa node dan zona dalam cluster GKE:

Pada diagram, StrimziPodSet Kafka di-deploy ke tiga node, di tiga zona yang berbeda. Anda dapat mengontrol konfigurasi ini dengan menetapkan aturan afinitas dan penyebaran topologi Pod yang diperlukan pada StrimziPodSet spesifikasi resource kustom.

Jika satu Zona gagal menggunakan konfigurasi yang direkomendasikan, GKE akan menjadwalkan ulang Pod pada node baru dan mereplikasi data dari replika yang lain, bagi Kafka dan Zookeeper.

Diagram berikut menunjukkan StrimziPodSet ZooKeeper yang di-deploy ke tiga node, di tiga zona berbeda:

Resource kustom StrimziPodSet

Tutorial ini menggunakan resource kustom StrimziPodSet yang diperkenalkan di Strimzi versi 0.29, bukan StatefulSets.

Resource StrimziPodSet menawarkan skalabilitas yang lebih baik untuk cluster dan memungkinkan Anda meneruskan opsi konfigurasi, sehingga Anda dapat membuat perubahan yang lebih terperinci pada Pod. Resource StrimziPodSet aktif secara default di Strimzi versi 0.35 dan yang lebih baru.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Aktifkan API Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager:

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Buat atau pilih project Google Cloud.

    • Membuat project Google Cloud:

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk project Google Cloud yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Aktifkan API Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager:

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/storage.objectViewer, roles/logging.logWriter, roles/container.clusterAdmin, roles/container.serviceAgent, roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageAdmin, roles/iam.serviceAccountAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

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:

  1. Luncurkan sesi Cloud Shell dari konsol Google Cloud, dengan mengklik Ikon aktivasi Cloud Shell Aktifkan Cloud Shell di konsol Google Cloud. Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud.

  2. 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.

  3. Buat clone repositori GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 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.

Outputnya mirip dengan hal 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.

  1. Tambahkan repositori Chart Helm Strimzi:

    helm repo add strimzi https://strimzi.io/charts/
    
  2. Tambahkan namespace untuk Operator Strimzi dan cluster Kafka:

    kubectl create ns kafka
    
  3. 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.

  4. Pastikan Operator Cluster Strimzi berhasil di-deploy menggunakan Helm:

    helm ls -n kafka
    

    Outputnya mirip dengan hal 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

  1. 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.

  2. Tunggu beberapa menit selagi Kubernetes memulai workload yang diperlukan:

    kubectl wait kafka/my-cluster --for=condition=Ready --timeout=600s -n kafka
    
  3. Pastikan workload Kafka telah dibuat:

    kubectl get pod,service,deploy,pdb -l=strimzi.io/cluster=my-cluster -n kafka
    

    Outputnya mirip dengan hal 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 kustom KafkaTopics dan KafkaUsers.

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.
  1. 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
    
  2. 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).

  3. Membuat pod klien:

    kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/kafkacat.yaml
    
  4. 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
    
  5. 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
    

    Outputnya mirip dengan hal 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.

  6. 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 dan KafkaUsers.
  • 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:

  1. Terapkan resource kustom Strimzi Kafka yang sudah ada (Kakfa, KafkaTopic, KafkaUser, dll.) ke cluster Kubernetes baru
  2. Update PersistentVolumeClaims dengan nama instance broker Kafka yang baru ke PersistentVolumes lama menggunakan properti spec.volumeName pada PersistentVolumeClaim.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

    Menghapus project Google Cloud:

    gcloud projects delete PROJECT_ID

Menghapus resource satu per satu

Jika Anda telah menggunakan project yang sudah ada dan tidak ingin menghapusnya, hapus resource individual tersebut.

  1. Menetapkan variabel lingkungan.

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=kafka
    export REGION=us-central1
    
  2. Jalankan perintah terraform destroy:

    export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
    terraform -chdir=kafka/terraform/FOLDER destroy -var project_id=${PROJECT_ID}   \
      -var region=${REGION}  \
      -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
    

    Ganti FOLDER dengan gke-autopilot atau gke-standard.

    Saat diminta, ketik yes.

  3. Temukan semua disk yang tidak terpasang:

    export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,zone)")
    

    Langkah ini harus dilakukan, karena Strimzi akan menggunakan parameter deleteClaim: false untuk penyimpanan secara default. Jika Anda menghapus cluster, semua disk akan tetap tersedia.

  4. Hapus disk:

    for i in $disk_list; do
      disk_name=$(echo $i| cut -d'|' -f1)
      disk_zone=$(echo $i| cut -d'|' -f2|sed 's|.*/||')
      echo "Deleting $disk_name"
      gcloud compute disks delete $disk_name --zone $disk_zone --quiet
    done
    

Langkah selanjutnya