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.
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
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 -
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.
- Replace
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:
Luncurkan sesi Cloud Shell dari konsol Google Cloud, dengan mengklik Aktifkan Cloud Shell di konsol Google Cloud. Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud.
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.Buat clone repositori GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
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.
Tambahkan repositori Helm Chart operator Redis Spotahome:
helm repo add redis-operator https://spotahome.github.io/redis-operator
Tambahkan namespace untuk operator Spotahome dan cluster Redis:
kubectl create ns redis
Deploy operator Spotahome menggunakan alat command line Helm:
helm install redis-operator redis-operator/redis-operator --version 3.2.9 -n redis
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
, dantopologySpreadConstraints
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
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.
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.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
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.
Jalankan Pod klien untuk berinteraksi dengan cluster Redis Anda:
kubectl apply -n redis -f manifests/02-auth/client-pod.yaml
Variabel lingkungan
PASS
mengambil Secretmy-user
dari vault.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
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
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"
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 port9121
- 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.
Buat resource PodMonitoring untuk mengambil metrik menurut labelSelector:
kubectl apply -n redis -f manifests/03-prometheus-metrics/pod-monitoring.yaml
Di konsol Google Cloud, buka halaman GKE Clusters Dashboard.
Dasbor menampilkan rasio penyerapan metrik yang bukan nol.
Di Konsol Google Cloud, buka halaman Dashboards.
Buka dasbor Ringkasan Prometheus Redis. Dasbor menampilkan jumlah koneksi dan kunci. Mungkin perlu waktu beberapa menit agar dasbor disediakan secara otomatis.
Hubungkan ke Pod klien dan siapkan variabel:
kubectl exec -it redis-client -n redis -- /bin/bash
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
Muat ulang halaman dan amati bahwa grafik Perintah Per Detik dan Kunci telah diperbarui untuk menampilkan status database yang sebenarnya.
Keluar dari shell Pod
exit
Pembersihan
Menghapus project
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Menghapus resource satu per satu
Menetapkan variabel lingkungan.
export PROJECT_ID=${PROJECT_ID} export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1
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
dengangke-autopilot
ataugke-standard
.Saat diminta, ketik
yes
.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)")
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
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.