Men-deploy Apache Kafka ke GKE menggunakan Confluent


Panduan ini menunjukkan cara menggunakan operator Confluent for Kubernetes (CFK) untuk men-deploy cluster Apache Kafka di Google Kubernetes Engine (GKE).

Kafka adalah sistem pesan open source yang terdistribusi untuk menangani data streaming real-time, throughput tinggi, dan volume tinggi. Anda dapat menggunakan Kafka untuk membangun pipeline data streaming yang memindahkan data dengan andal ke berbagai sistem dan aplikasi untuk pemrosesan serta analisis.

Panduan ini ditujukan untuk para administrator platform, arsitek cloud, dan profesional operasi yang ingin men-deploy cluster Kafka di GKE.

Anda juga dapat menggunakan operator CFK untuk men-deploy komponen Confluent Platform lain, seperti pusat Confluent Control berbasis web, Schema Registry, atau KsqlDB. Namun, panduan ini hanya berfokus pada deployment Kafka.

Tujuan

  • Merencanakan dan men-deploy infrastruktur GKE untuk Apache Kafka
  • Men-deploy dan mengonfigurasi operator CFK
  • Konfigurasikan Apache Kafka menggunakan operator CFK untuk memastikan ketersediaan, keamanan, kemampuan observasi, dan performa

Manfaat

CFK menawarkan manfaat berikut:

  • Pembaruan berkelanjutan otomatis untuk perubahan konfigurasi.
  • Upgrade berkelanjutan otomatis tanpa memengaruhi ketersediaan Kafka.
  • Jika terjadi kegagalan, CFK akan memulihkan Kafka Pod dengan ID broker Kafka, konfigurasi, dan volume penyimpanan persisten yang sama.
  • Awareness rak otomatis untuk menyebarkan replika partisi di berbagai rak (atau zona), yang meningkatkan ketersediaan broker Kafka dan membatasi risiko kehilangan data.
  • Dukungan untuk ekspor metrik gabungan ke Prometheus.

Arsitektur deployment

Setiap partisi data dalam cluster Kafka memiliki satu broker leader dan dapat memiliki satu atau beberapa broker pengikut. Broker pemimpin menangani semua operasi baca dan tulis ke partisi. Setiap broker pengikut secara pasif mereplikasi broker pemimpin.

Dalam penyiapan Kafka standar, Anda juga menggunakan layanan open source yang disebut ZooKeeper untuk mengoordinasikan cluster Kafka. Layanan ini membantu dengan memilih pemimpin di antara broker dan memicu failover jika terjadi kegagalan.

Anda juga dapat men-deploy konfigurasi Kafka tanpa Zookeeper dengan mengaktifkan Mode KRaft, tetapi metode ini dianggap tidak siap produksi karena kurangnya dukungan untukResource KafkaTopic, dan autentikasi kredensial.

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

Cluster Kubernetes yang sangat tersedia di Google Cloud mengandalkan cluster regional yang mencakup beberapa node dan zona ketersediaan. Konfigurasi ini meningkatkan fault tolerance, skalabilitas, dan redundansi geografis. Dengan konfigurasi ini, Anda juga dapat melakukan update dan pemeliharaan berkelanjutan sekaligus memberikan SLA untuk waktu beroperasi dan ketersediaan. Untuk mengetahui informasi selengkapnya, lihat Cluster regional.

Diagram deployment

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

Dalam diagram, Kafka StatefulSet di-deploy di tiga node di tiga zona berbeda. Anda dapat mengontrol konfigurasi ini dengan menetapkan aturan afinitas dan penyebaran topologi Pod yang diperlukan pada Kafka 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 StatefulSet ZooKeeper yang di-deploy ke tiga node, di tiga zona berbeda:

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 GKE, Backup for GKE, Compute Engine, Identity and Access Management, 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 GKE, Backup for GKE, Compute Engine, Identity and Access Management, 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: role/storage.objectViewer, role/logging.logWriter, roles/container.clusterAdmin, role/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 singkat ini.

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 kafka-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 kafka-cluster --region us-central1"

Hubungkan ke cluster

Konfigurasi kubectl untuk berkomunikasi dengan cluster:

gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --region ${REGION}

Men-deploy operator CFK ke cluster Anda

Di bagian ini, Anda akan men-deploy operator Confluent for Kubernetes (CFK) menggunakan diagram Helm, lalu men-deploy cluster Kafka.

  1. Tambahkan repositori Confluent Helm Chart:

    helm repo add confluentinc https://packages.confluent.io/helm
    
  2. Tambahkan namespace untuk operator CFK dan cluster Kafka:

    kubectl create ns kafka
    
  3. Deploy operator cluster CFK menggunakan Helm:

    helm install confluent-operator confluentinc/confluent-for-kubernetes -n kafka
    

    Untuk memungkinkan CFK mengelola resource di semua namespace, tambahkan parameter --set-namespaced=false ke perintah Helm.

  4. Pastikan operator Confluent telah berhasil di-deploy menggunakan Helm:

    helm ls -n kafka
    

    Outputnya mirip dengan hal berikut ini:

    NAME                  NAMESPACE  REVISION UPDATED                                  STATUS      CHART                                APP VERSION
    confluent-operator    kafka      1        2023-07-07 10:57:45.409158 +0200 CEST    deployed    confluent-for-kubernetes-0.771.13    2.6.0
    

Men-deploy 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 dihasilkan oleh CFK.
  • Java MaxHeapSize dan MinHeapSize ditetapkan ke 4 GB untuk Kafka.
  • Alokasi resource CPU sebesar 1 permintaan CPU dan 2 batas CPU, serta permintaan dan batas memori 5 GB untuk Kafka (4 GB untuk layanan utama dan 0,5 GB untuk pengekspor metrik) dan 3 GB untuk Zookeeper (2 GB untuk layanan utama dan 0,5 GB untuk pengekspor metrik).
  • Penyimpanan sebesar 100 GB dialokasikan ke setiap Pod menggunakan storageClass premium-rwo, 100 untuk Kafka Data, dan 90/10 untuk Zookeeper Data/Log.
  • 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 menggunakan Certificate Authority yang Anda berikan.

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 pasangan CA:

    openssl genrsa -out ca-key.pem 2048
    openssl req -new -key ca-key.pem -x509 \
      -days 1000 \
      -out ca.pem \
      -subj "/C=US/ST=CA/L=Confluent/O=Confluent/OU=Operator/CN=MyCA"
    

    Confluent untuk Kubernetes menyediakan sertifikat yang dihasilkan secara otomatis untuk komponen Platform Confluent agar digunakan untuk enkripsi jaringan TLS. Anda harus membuat dan menyediakan Certificate Authority (CA).

  2. Buat Secret Kubernetes untuk certificate authority:

    kubectl create secret tls ca-pair-sslcerts --cert=ca.pem --key=ca-key.pem -n kafka
    

    Nama Secret sudah sudah ditentukan

  3. Buat cluster Kafka baru menggunakan konfigurasi dasar:

    kubectl apply -n kafka -f kafka-confluent/manifests/01-basic-cluster/my-cluster.yaml
    

    Perintah ini membuat resource kustom Kafka dan resource kustom Zookeeper dari operator CFK yang mencakup batas dan permintaan CPU dan memori, permintaan penyimpanan blok, serta taint dan afinitas untuk mendistribusikan Pod yang disediakan di seluruh node Kubernetes.

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

    kubectl wait pods -l app=my-cluster --for condition=Ready --timeout=300s -n kafka
    
  5. Pastikan workload Kafka telah dibuat:

    kubectl get pod,svc,statefulset,deploy,pdb -n kafka
    

    Outputnya mirip dengan hal berikut ini:

    NAME                                    READY   STATUS  RESTARTS   AGE
    pod/confluent-operator-864c74d4b4-fvpxs   1/1   Running   0        49m
    pod/my-cluster-0                        1/1   Running   0        17m
    pod/my-cluster-1                        1/1   Running   0        17m
    pod/my-cluster-2                        1/1   Running   0        17m
    pod/zookeeper-0                         1/1   Running   0        18m
    pod/zookeeper-1                         1/1   Running   0        18m
    pod/zookeeper-2                         1/1   Running   0        18m
    
    NAME                          TYPE      CLUSTER-IP   EXTERNAL-IP   PORT(S)                                                        AGE
    service/confluent-operator    ClusterIP   10.52.13.164   <none>      7778/TCP                                                       49m
    service/my-cluster            ClusterIP   None         <none>      9092/TCP,8090/TCP,9071/TCP,7203/TCP,7777/TCP,7778/TCP,9072/TCP   17m
    service/my-cluster-0-internal   ClusterIP   10.52.2.242  <none>      9092/TCP,8090/TCP,9071/TCP,7203/TCP,7777/TCP,7778/TCP,9072/TCP   17m
    service/my-cluster-1-internal   ClusterIP   10.52.7.98   <none>      9092/TCP,8090/TCP,9071/TCP,7203/TCP,7777/TCP,7778/TCP,9072/TCP   17m
    service/my-cluster-2-internal   ClusterIP   10.52.4.226  <none>      9092/TCP,8090/TCP,9071/TCP,7203/TCP,7777/TCP,7778/TCP,9072/TCP   17m
    service/zookeeper             ClusterIP   None         <none>      2181/TCP,7203/TCP,7777/TCP,3888/TCP,2888/TCP,7778/TCP          18m
    service/zookeeper-0-internal  ClusterIP   10.52.8.52   <none>      2181/TCP,7203/TCP,7777/TCP,3888/TCP,2888/TCP,7778/TCP          18m
    service/zookeeper-1-internal  ClusterIP   10.52.12.44  <none>      2181/TCP,7203/TCP,7777/TCP,3888/TCP,2888/TCP,7778/TCP          18m
    service/zookeeper-2-internal  ClusterIP   10.52.12.134   <none>      2181/TCP,7203/TCP,7777/TCP,3888/TCP,2888/TCP,7778/TCP          18m
    
    NAME                        READY   AGE
    statefulset.apps/my-cluster   3/3   17m
    statefulset.apps/zookeeper  3/3   18m
    
    NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/confluent-operator   1/1   1          1         49m
    
    NAME                                  MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    poddisruptionbudget.policy/my-cluster   N/A           1               1                   17m
    poddisruptionbudget.policy/zookeeper  N/A           1               1                   18m
    

Operator membuat resource berikut:

  • Dua StatefulSets untuk Kafka dan ZooKeeper.
  • Tiga Pod untuk replika broker Kafka.
  • Tiga Pod untuk replika ZooKeeper.
  • Dua resource PodDisruptionBudget, memastikan maksimum satu replika yang tidak tersedia untuk konsistensi cluster.
  • my-cluster Layanan yang berfungsi sebagai server bootstrap untuk klien Kafka yang terhubung dari dalam cluster Kubernetes. Semua pemroses Kafka internal tersedia di Layanan ini.
  • zookeeper Layanan yang memungkinkan broker Kafka terhubung ke node ZooKeeper sebagai klien.

Autentikasi dan pengelolaan pengguna

Bagian ini menunjukkan cara mengaktifkan autentikasi dan otorisasi untuk mengamankan Pemroses Kafka dan berbagi kredensial dengan klien.

Confluent untuk Kubernetes mendukung berbagai metode autentikasi untuk Kafka, seperti:

  • Autentikasi SASL/PLAIN: Klien menggunakan nama pengguna dan sandi untuk autentikasi. Nama pengguna dan sandi disimpan di sisi server dalam secret Kubernetes.
  • SASL/PLAIN dengan autentikasi LDAP: Klien menggunakan nama pengguna dan sandi untuk autentikasi. Kredensial disimpan di server LDAP.
  • Autentikasi mTLS: Klien menggunakan sertifikat TLS untuk autentikasi.

Batasan

  • CFK tidak menyediakan Resource Kustom untuk pengelolaan pengguna. Namun, Anda dapat menyimpan kredensial di Secret dan merujuk ke Secret di spesifikasi pemroses.
  • Meskipun tidak ada Resource Kustom untuk mengelola ACL secara langsung, Confluent for Kubernetes resmi memberikan panduan tentang cara mengonfigurasi ACL menggunakan Kafka CLI.

Membuat pengguna

Bagian ini menunjukkan cara men-deploy operator CFK sebagai demonstrasi dari kemampuan pengelolaan pengguna, termasuk:

  • Cluster Kafka dengan autentikasi berbasis sandi (SASL/PLAIN) yang diaktifkan di salah satu pemroses
  • KafkaTopic dengan 3 replika
  • Kredensial pengguna dengan izin baca dan tulis
  1. Buat Secret dengan kredensial pengguna:

    export USERNAME=my-user
    export PASSWORD=$(openssl rand -base64 12)
    kubectl create secret generic my-user-credentials -n kafka \
      --from-literal=plain-users.json="{\"$USERNAME\":\"$PASSWORD\"}"
    

    Kredensial harus disimpan dalam format berikut:

    {
    "username1": "password1",
    "username2": "password2",
    ...
    "usernameN": "passwordN"
    }
    
  2. Konfigurasikan cluster Kafka untuk menggunakan pemroses dengan autentikasi SCRAM-SHA-512, autentikasi berbasis sandi pada port 9094:

    kubectl apply -n kafka -f kafka-confluent/manifests/02-auth/my-cluster.yaml
    
  3. Siapkan topik dan Pod klien untuk berinteraksi dengan cluster Kafka serta jalankan perintah Kafka:

    kubectl apply -n kafka -f kafka-confluent/manifests/02-auth/my-topic.yaml
    kubectl apply -n kafka -f kafka-confluent/manifests/02-auth/kafkacat.yaml
    

    GKE memasang my-user-credentials Secret ke Pod klien sebagai Volume.

  4. Saat Pod klien sudah siap, hubungkan ke Pod dan mulai buat serta gunakan pesan menggunakan kredensial yang diberikan:

    kubectl wait pod kafkacat --for=condition=Ready --timeout=300s -n kafka
    kubectl exec -it kafkacat -n kafka -- /bin/sh
    
  5. Buat pesan menggunakan kredensial my-user, lalu gunakan pesan untuk memverifikasi tanda terimanya.

    export USERNAME=$(cat /my-user/plain-users.json|cut -d'"' -f 2)
    export PASSWORD=$(cat /my-user/plain-users.json|cut -d'"' -f 4)
    echo "Message from my-user" |kcat \
      -b my-cluster.kafka.svc.cluster.local:9094 \
      -X security.protocol=SASL_SSL \
      -X sasl.mechanisms=PLAIN \
      -X sasl.username=$USERNAME \
      -X sasl.password=$PASSWORD  \
      -t my-topic -P
    kcat -b my-cluster.kafka.svc.cluster.local:9094 \
      -X security.protocol=SASL_SSL \
      -X sasl.mechanisms=PLAIN \
      -X sasl.username=$USERNAME \
      -X sasl.password=$PASSWORD  \
      -t my-topic -C
    

    Outputnya mirip dengan hal berikut ini:

    Message from my-user
    % Reached end of topic my-topic [1] at offset 1
    % Reached end of topic my-topic [2] at offset 0
    % Reached end of topic my-topic [0] at offset 0
    

    Ketik CTRL+C untuk menghentikan proses penggunaan. Jika Anda mendapatkan error Connect refused, tunggu beberapa menit lalu coba lagi.

  6. Keluar dari shell Pod

    exit
    

Cadangan dan pemulihan dari bencana (disaster recovery)

Dengan operator Confluent, Anda dapat menerapkan strategi pencadangan yang efisien dengan mengikuti pola tertentu.

Anda dapat menggunakan Pencadangan untuk GKE untuk mencadangkan:

  • Manifes resource Kubernetes.
  • Resource kustom Confluent API dan definisinya yang diekstrak dari server Kubernetes API cluster yang sedang dicadangan.
  • 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 manual untuk cluster Kafka. Anda harus mencadangkan:

  • Konfigurasi Kafka, yang mencakup semua resource kustom Confluent API seperti KafkaTopicsatauConnect
  • Data, yang disimpan di PersistentVolumes pada broker Kafka

Dengan menyimpan manifes resource Kubernetes, termasuk konfigurasi Confluent, di repositori Git, Anda tidak perlu melakukan pencadangan terpisah untuk konfigurasi Kafka karena resource dapat diterapkan kembali 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:
  ...
  dataVolumeCapacity: 100Gi
  storageClass:
  name: 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 Confluent yang sudah ada (Kafka, KafkaTopic, Zookeeper, 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)")
    
  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