Men-deploy Redis ke GKE menggunakan Spotahome


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

Panduan ini ditujukan bagi 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 ini dilisensikan berdasarkan Lisensi Apache 2.0.

Spotahome menawarkan manfaat berikut:

  • Pengelolaan cluster Redis berbasis Kubernetes
  • Ketersediaan tinggi disediakan oleh Redis Sentinel
  • Integrasi Prometheus yang lancar untuk kemampuan observasi database
  • Dukungan untuk menyetel 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 menggunakan operator Redis Spotahome untuk men-deploy dan mengonfigurasi cluster Redis yang sangat tersedia ke GKE dengan node pemimpin dan dua replika baca, beserta cluster Redis Sentinel yang terdiri dari tiga replika.

Redis Sentinel adalah sistem dengan ketersediaan tinggi dan pemantauan untuk Redis open source. Platform ini terus memantau instance Redis, termasuk pemimpin dan replika terkaitnya. Jika node pemimpin gagal, Sentinel dapat otomatis mempromosikan salah satu replika untuk menjadi pemimpin baru, sehingga memastikan selalu ada node pemimpin yang berfungsi yang tersedia untuk pembacaan dan penulisan data. Saat peristiwa signifikan terjadi di cluster Redis, seperti kegagalan posisi teratas atau peristiwa failover, Sentinel dapat memberi tahu administrator atau sistem lainnya 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 menyediakan SLA untuk waktu beroperasi dan ketersediaan. Untuk mengetahui informasi selengkapnya, lihat Cluster regional.

Diagram berikut menunjukkan bagaimana 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, dengan 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 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. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Menginstal Google Cloud CLI.
  3. Untuk initialize gcloud CLI, jalankan perintah berikut:

    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. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  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. Menginstal Google Cloud CLI.
  8. Untuk initialize gcloud CLI, jalankan perintah berikut:

    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. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  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. Berikan peran ke Akun Google Anda. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut: 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:EMAIL_ADDRESS" --role=ROLE
    • Ganti PROJECT_ID dengan project ID Anda.
    • Ganti EMAIL_ADDRESS dengan alamat email Anda.
    • Ganti ROLE dengan setiap peran individual.

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 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: 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/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
  • {i>Router<i} untuk mengakses internet melalui NAT
  • Cluster GKE pribadi di region us-central1
  • Dua kumpulan node dengan penskalaan otomatis diaktifkan (Satu hingga dua node per zona, minimum satu node per zona)
  • ServiceAccount dengan izin logging dan pemantauan
  • Pencadangan GKE untuk 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
  • {i>Router<i} 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 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 chart Helm, lalu men-deploy cluster Redis.

  1. Tambahkan repositori Helm Chart operator Spotahome Redis:

    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 pemimpin dan dua replika baca.
  • Tiga replika node Sentinel, 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, menggunakan kumpulan node masing-masing dan zona ketersediaan yang berbeda.

Konfigurasi ini mewakili penyiapan minimal yang diperlukan untuk membuat cluster Redis yang 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 beban kerja 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 Redis StatefulSet dan Sentinel
  • Tiga replika Pod untuk Redis
  • Tiga replika Pod untuk Sentinel
  • Dua PodDisruptionBudgets, memastikan minimal dua replika yang tersedia untuk konsistensi cluster
  • Layanan rfr-my-cluster, yang mengekspos metrik Redis
  • Layanan redis-my-cluster, yang menargetkan node pemimpin 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 dengan klien menggunakan metode autentikasi lama operator Spotahome

Anda harus menggunakan sandi database menggunakan setelan requirepass. {i>Password<i} ini kemudian digunakan oleh semua klien. Untuk mengelola pengguna tambahan, gunakan perintah CLI Redis.

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.
  • Update kredensial secara live tidak didukung.

Hubungkan ke Redis

Anda dapat men-deploy klien Redis dan mengautentikasi menggunakan sandi yang disimpan dalam 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
    

Pahami 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
  • Kolektor berbasis Prometheus yang memproses metrik dari Pod Redis
  • Resource PodMonitoring yang mengirimkan 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 bantuan.

  1. Buat resource PodMonitoring untuk menyalin metrik berdasarkan labelSelector:

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

    Buka Dasbor Cluster GKE

    Dasbor menampilkan rasio penyerapan metrik dengan nilai bukan nol.

  3. Di Konsol Google Cloud, buka halaman Dashboards.

    Buka Dashboards

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

  5. Menghubungkan ke Pod klien dan menyiapkan 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 Commands Per Second dan Keys telah diperbarui untuk menampilkan status database yang sebenarnya.

  8. Keluar dari shell Pod

    exit
    

Pembersihan

Menghapus project

    Menghapus project Google Cloud:

    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 selanjutnya