Men-deploy Redis ke GKE menggunakan Spotahome


Redis adalah database NoSQL dalam memori open source yang terutama digunakan untuk penyimpanan dalam cache. 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 tersebut mendapatkan lisensi berdasarkan Apache License 2.0.

Spotahome menawarkan manfaat berikut:

  • Pengelolaan cluster Redis native Kubernetes
  • Ketersediaan tinggi yang disediakan oleh Redis Sentinel
  • Integrasi Prometheus yang lancar untuk visibilitas database
  • Dukungan untuk menetapkan konfigurasi Redis kustom

Tujuan

  • Merencanakan dan men-deploy infrastruktur GKE untuk Redis
  • Men-deploy dan mengonfigurasi operator Redis Spotahome
  • Konfigurasikan 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 yang sangat tersedia ke GKE dengan node pemimpin dan dua replika baca, bersama dengan cluster Redis Sentinel yang terdiri dari tiga replika.

Redis Sentinel adalah sistem pemantauan dan ketersediaan tinggi untuk Redis open source. Alat ini terus memantau instance Redis, termasuk leader dan replika terkaitnya. Jika node leader gagal, Sentinel dapat otomatis mempromosikan salah satu replika menjadi leader baru, sehingga memastikan bahwa selalu ada node leader 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. Hal 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 yang 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 yang berbeda:

Biaya

Dalam dokumen ini, Anda akan 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. 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.

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

  6. 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
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

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

  11. 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
  12. 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.

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 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=redis
    export REGION=us-central1
    

    Ganti PROJECT_ID dengan project ID Google Cloud 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.

Standard

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 aktif (Satu hingga dua node per zona, minimum satu 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.
...

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, konfigurasikan 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 Helm Chart 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 beban kerja, memastikan distribusi yang tepat di seluruh node Kubernetes, dengan memanfaatkan kumpulan node masing-masing dan zona ketersediaan yang berbeda.

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 CPU, permintaan memori, dan batas; 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

Membagikan kredensial Redis kepada 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 mengautentikasi menggunakan sandi yang disimpan di Kubernetes Secret.

  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 mengambil metrik menurut 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 yang bukan nol.

  3. Di Konsol Google Cloud, buka halaman Dashboards.

    Buka Dashboards

  4. Buka dasbor Ringkasan Prometheus Redis. 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