Men-deploy Redis ke GKE menggunakan Spotahome


Redis adalah database NoSQL dalam memori open source yang terutama digunakan untuk caching. Redis memiliki replikasi bawaan, skrip Lua, pengusiran LRU, transaksi, persistensi di disk, dan ketersediaan tinggi.

Panduan ini ditujukan untuk administrator platform, arsitek cloud, dan tenaga profesional operasi yang tertarik untuk men-deploy cluster Redis di Google Kubernetes Engine (GKE).

Panduan ini menunjukkan cara menggunakan operator Redis Spotahome untuk men-deploy cluster Redis.

Operator diberi lisensi berdasarkan Lisensi Apache 2.0.

Spotahome menawarkan manfaat berikut:

  • Pengelolaan cluster Redis yang kompatibel dengan Kubernetes
  • Ketersediaan tinggi yang disediakan oleh Redis Sentinel
  • Integrasi Prometheus yang lancar untuk kemampuan pengamatan database
  • Dukungan untuk menyetel konfigurasi Redis kustom

Tujuan

  • Merencanakan dan men-deploy infrastruktur GKE untuk Redis
  • Men-deploy dan mengonfigurasi operator Redis Spotahome
  • Konfigurasi Redis menggunakan operator untuk memastikan ketersediaan, keamanan, kemampuan observasi, dan performa

Arsitektur deployment

Dalam tutorial ini, Anda akan menggunakan operator Redis Spotahome untuk men-deploy dan mengonfigurasi cluster Redis dengan ketersediaan tinggi ke GKE dengan node utama dan dua replika baca, beserta cluster Redis Sentinel yang terdiri dari tiga replika.

Redis Sentinel adalah sistem ketersediaan tinggi dan pemantauan untuk Redis open source. Aplikasi ini terus memantau instance Redis, termasuk leader dan replika terkaitnya. Jika node pemimpin gagal, Sentinel dapat secara otomatis mempromosikan salah satu replika untuk menjadi pemimpin baru, sehingga memastikan bahwa selalu ada node pemimpin yang berfungsi untuk pembacaan dan penulisan data. Saat peristiwa penting terjadi di cluster Redis, seperti kegagalan pemimpin atau peristiwa failover, Sentinel dapat memberi tahu administrator atau sistem lain melalui email atau mekanisme notifikasi lainnya.

Anda juga men-deploy cluster GKE regional yang sangat tersedia untuk Redis, dengan beberapa node Kubernetes yang tersebar di beberapa zona ketersediaan. Penyiapan ini membantu memastikan fault tolerance, skalabilitas, dan redundansi geografis. Konfigurasi ini memungkinkan update dan pemeliharaan berkelanjutan sekaligus memberikan SLA untuk waktu beroperasi dan ketersediaan. Untuk mengetahui informasi selengkapnya, lihat Cluster regional.

Diagram berikut menunjukkan cara cluster Redis berjalan di beberapa node dan zona dalam cluster GKE:

Dalam diagram, Redis StatefulSet di-deploy di tiga node di tiga zona berbeda. Anda mengontrol cara GKE men-deploy StatefulSet ke node dan zona dengan menetapkan aturan afinitas dan penyebaran topologi Pod pada spesifikasi resource kustom RedisFailover.

Jika satu zona gagal menggunakan konfigurasi yang direkomendasikan, GKE akan menjadwalkan ulang Pod pada node baru.

Diagram berikut menunjukkan Deployment Sentinel yang dijadwalkan di tiga node di tiga zona berbeda:

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru 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. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  4. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  7. Enable the Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager APIs:

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  8. Install the Google Cloud CLI.

  9. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.

  10. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  13. Enable the Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager APIs:

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  14. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/storage.objectViewer, roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin, roles/gkebackup.admin, roles/monitoring.viewer

    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.
  15. Menyiapkan lingkungan Anda

    Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software yang akan 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 Google Cloud konsol, dengan mengklik Ikon aktivasi Cloud Shell Aktifkan Cloud Shell di Google Cloud konsol. Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud .

    2. Menetapkan variabel lingkungan:

      export PROJECT_ID=PROJECT_ID
      export KUBERNETES_CLUSTER_PREFIX=redis
      export REGION=us-central1
      

      Ganti PROJECT_ID dengan Google Cloud project ID Anda.

    3. Buat clone repositori GitHub:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
      
    4. Ubah ke direktori kerja:

      cd kubernetes-engine-samples/databases/redis-spotahome
      

    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.

    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=terraform/gke-standard init
    terraform -chdir=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
    • Dua node pool dengan penskalaan otomatis diaktifkan (Satu hingga dua node per zona, minimum satu node per zona)
    • ServiceAccount dengan izin logging dan pemantauan
    • Pencadangan untuk GKE pada pemulihan dari bencana
    • Google Cloud Managed Service for Prometheus untuk pemantauan cluster

    Outputnya mirip dengan hal berikut ini:

    ...
    Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
    ...
    

    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=terraform/gke-autopilot init
    terraform -chdir=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.
    ...
    

    Hubungkan ke cluster

    Dengan menggunakan Cloud Shell, konfigurasi kubectl untuk berkomunikasi dengan cluster:

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

    Men-deploy operator Spotahome ke cluster Anda

    Di bagian ini, Anda akan men-deploy operator Spotahome ke cluster Kubernetes menggunakan diagram Helm, lalu men-deploy cluster Redis.

    1. Tambahkan repositori Chart Helm operator Redis Spotahome:

      helm repo add redis-operator https://spotahome.github.io/redis-operator
      
    2. Tambahkan namespace untuk operator Spotahome dan cluster Redis:

      kubectl create ns redis
      
    3. Deploy operator Spotahome menggunakan alat command line Helm:

      helm install redis-operator redis-operator/redis-operator --version 3.2.9 -n redis
      
    4. Periksa status deployment operator Spotahome menggunakan Helm:

      helm ls -n redis
      

      Outputnya mirip dengan hal berikut ini:

      NAME             NAMESPACE    REVISION    UPDATED                                STATUS      CHART                   APP VERSION
      redis-operator    redis      1           2023-09-12 13:21:48.179503 +0200 CEST    deployed    redis-operator-3.2.9    1.2.4
      

    Men-deploy Redis

    Konfigurasi dasar untuk instance cluster Redis mencakup komponen berikut:

    • Tiga replika node Redis: satu leader dan dua replika baca.
    • Tiga replika node Sentinel, yang membentuk kuorum.
    • Alokasi resource CPU dari satu permintaan CPU dan dua batas CPU, dengan permintaan dan batas memori 4 GB untuk Redis, serta CPU 100 m/500 m dan 500 MB untuk Sentinel.
    • Toleransi, nodeAffinities, dan topologySpreadConstraints dikonfigurasi untuk setiap workload, dan memastikan distribusi yang tepat di seluruh node Kubernetes, dengan memanfaatkan node pool masing-masing dan berbagai zona ketersediaan.

    Konfigurasi ini menampilkan penyiapan minimal yang diperlukan untuk membuat cluster Redis siap produksi.

    Membuat cluster Redis dasar

    1. Buat Secret dengan kredensial pengguna:

      export PASSWORD=$(openssl rand -base64 12)
      kubectl create secret generic my-user -n redis \
          --from-literal=password="$PASSWORD"
      

      Operator tidak memiliki fitur untuk membuat kredensial, dan sandi database harus dibuat sebelumnya.

    2. Buat cluster Redis baru menggunakan konfigurasi dasar:

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

      Perintah ini membuat resource kustom RedisFailover dari operator Spotahome yang menentukan permintaan dan batas CPU, memori; serta taint dan afinitas untuk mendistribusikan replika Pod yang disediakan di seluruh node Kubernetes.

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

      kubectl wait pods -l redisfailovers.databases.spotahome.com/name=my-cluster --for condition=Ready --timeout=300s -n redis
      
    4. Pastikan workload Redis telah dibuat:

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

      Outputnya mirip dengan hal berikut ini:

      NAME                                READY   STATUS  RESTARTS   AGE
      pod/redis-operator-5dc65cb7cc-krlcs   1/1   Running   0         49m
      pod/rfr-my-cluster-0                2/2     Running   0         60s
      pod/rfr-my-cluster-1                2/2     Running   0         60s
      pod/rfr-my-cluster-2                2/2     Running   0         60s
      pod/rfs-my-cluster-8475dfd96c-h5zvw   1/1   Running   0         60s
      pod/rfs-my-cluster-8475dfd96c-rmh6f   1/1   Running   0         60s
      pod/rfs-my-cluster-8475dfd96c-shzxh   1/1   Running   0         60s
      
      NAME                    TYPE        CLUSTER-IP  EXTERNAL-IP   PORT(S)   AGE
      service/redis-my-cluster ClusterIP   10.52.14.87   <none>       6389/TCP    55s
      service/redis-operator   ClusterIP   10.52.13.217   <none>      9710/TCP    49m
      service/rfr-my-cluster   ClusterIP   None           <none>      9121/TCP    61s
      service/rfs-my-cluster   ClusterIP   10.52.15.197   <none>      26379/TCP   61s
      
      NAME                            READY   AGE
      statefulset.apps/rfr-my-cluster   3/3   61s
      
      NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/redis-operator   1/1    1           1           50m
      deployment.apps/rfs-my-cluster   3/3    3           3           62s
      
      NAME                                        MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
      poddisruptionbudget.policy/rfr-my-cluster   2               N/A             1                   64s
      poddisruptionbudget.policy/rfs-my-cluster   2               N/A             1                   63s
      

    Operator membuat resource berikut:

    • Deployment StatefulSet dan Sentinel Redis
    • Tiga replika Pod untuk Redis
    • Tiga replika Pod untuk Sentinel
    • Dua PodDisruptionBudgets, yang memastikan minimal dua replika tersedia untuk konsistensi cluster
    • Layanan rfr-my-cluster, yang mengekspos metrik Redis
    • Layanan redis-my-cluster, yang menargetkan node leader cluster Redis
    • Layanan rfs-my-cluster, yang memungkinkan klien terhubung ke cluster melalui Sentinel. Dukungan Sentinel diperlukan untuk library klien.

    Membagikan kredensial Redis

    Anda dapat membagikan kredensial Redis kepada klien menggunakan metode autentikasi lama operator Spotahome

    Anda harus menggunakan sandi database menggunakan setelan requirepass. Sandi ini kemudian digunakan oleh semua klien. Untuk mengelola pengguna tambahan, gunakan perintah Redis CLI.

    apiVersion: databases.spotahome.com/v1
    kind: RedisFailover
    metadata:
      name: my-cluster
    spec:
      ...
      auth:
        secretPath: my-user
    

    Berbagi kredensial Redis dengan klien menggunakan metode ini memiliki batasan berikut:

    • Spotahome tidak menyediakan Resource Kustom untuk pengelolaan pengguna. Anda dapat menyimpan kredensial di Secret dan merujuknya dalam spesifikasi auth.
    • Tidak ada metode untuk mengamankan koneksi dengan enkripsi TLS menggunakan resource kustom.
    • Pembaruan kredensial secara langsung tidak didukung.

    Menghubungkan ke Redis

    Anda dapat men-deploy klien Redis dan melakukan autentikasi menggunakan sandi yang disimpan di Secret Kubernetes.

    1. Jalankan Pod klien untuk berinteraksi dengan cluster Redis Anda:

      kubectl apply -n redis -f manifests/02-auth/client-pod.yaml
      

      Variabel lingkungan PASS mengambil Secret my-user dari vault.

    2. Tunggu hingga Pod siap, lalu hubungkan ke Pod:

      kubectl wait pod redis-client --for=condition=Ready --timeout=300s -n redis
      kubectl exec -it redis-client -n redis -- /bin/bash
      
    3. Pastikan koneksi berfungsi:

      redis-cli -h redis-my-cluster -a $PASS --no-auth-warning SET my-key "testvalue"
      

      Outputnya mirip dengan hal berikut ini:

      OK
      
    4. Dapatkan nilai my-key:

      redis-cli -h redis-my-cluster -a $PASS --no-auth-warning GET my-key
      

      Outputnya mirip dengan hal berikut ini:

      "testvalue"
      
    5. Keluar dari shell Pod

      exit
      

    Memahami cara Prometheus mengumpulkan metrik untuk cluster Redis Anda

    Diagram berikut menunjukkan cara kerja pengumpulan metrik Prometheus:

    Dalam diagram, cluster pribadi GKE berisi:

    • Pod Redis yang mengumpulkan metrik di jalur / dan port 9121
    • Pengumpul berbasis Prometheus yang memproses metrik dari Pod Redis
    • Resource PodMonitoring yang mengirim metrik ke Cloud Monitoring

    Google Cloud Managed Service for Prometheus mendukung pengumpulan metrik dalam format Prometheus. Cloud Monitoring menggunakan dasbor terintegrasi untuk metrik Redis.

    Operator Spotahome mengekspos metrik cluster dalam format Prometheus menggunakan redis_exporter sebagai sidecar.

    1. Buat resource PodMonitoring untuk meng-scrape metrik berdasarkan labelSelector:

      kubectl apply -n redis -f manifests/03-prometheus-metrics/pod-monitoring.yaml
      
    2. Di konsol Google Cloud , buka halaman GKE Clusters Dashboard.

      Buka Dasbor Cluster GKE

      Dasbor menampilkan rasio penyerapan metrik bukan nol.

    3. Di konsol Google Cloud , buka halaman Dashboards.

      Buka Dashboards

    4. Buka dasbor Redis Prometheus Overview. Dasbor menampilkan jumlah koneksi dan kunci. Mungkin perlu waktu beberapa menit agar dasbor disediakan secara otomatis.

    5. Hubungkan ke Pod klien dan siapkan variabel:

      kubectl exec -it redis-client -n redis -- /bin/bash
      
    6. Gunakan alat redis-cli untuk membuat kunci baru:

      for i in {1..50}; do \
        redis-cli -h redis-my-cluster -a $PASS \
        --no-auth-warning SET mykey-$i "myvalue-$i"; \
      done
      
    7. Muat ulang halaman dan amati bahwa grafik Perintah Per Detik dan Kunci telah diperbarui untuk menampilkan status database yang sebenarnya.

    8. Keluar dari shell Pod

      exit
      

    Pembersihan

    Menghapus project

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Menghapus resource satu per satu

    1. Menetapkan variabel lingkungan.

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

      export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
      terraform -chdir=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 berikutnya