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.
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
- 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.
- Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
-
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.
-
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
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 - Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
-
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.
-
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
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 -
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.
- Ganti
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:
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
: Google Cloud Anda dengan project ID.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.
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.
Tambahkan repositori Helm Chart operator Spotahome Redis:
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 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
, dantopologySpreadConstraints
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
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 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.
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
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 port9121
- 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.
Buat resource PodMonitoring untuk menyalin metrik berdasarkan labelSelector:
kubectl apply -n redis -f manifests/03-prometheus-metrics/pod-monitoring.yaml
Di konsol Google Cloud, buka halaman Dasbor Cluster GKE.
Dasbor menampilkan rasio penyerapan metrik dengan nilai bukan nol.
Di Konsol Google Cloud, buka halaman Dashboards.
Buka dasbor Redis Prometheus Overview. Dasbor menunjukkan jumlah koneksi dan kunci. Mungkin perlu waktu beberapa menit agar dasbor otomatis disediakan.
Menghubungkan ke Pod klien dan menyiapkan 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 Commands Per Second dan Keys telah diperbarui untuk menampilkan status database yang sebenarnya.
Keluar dari shell Pod
exit
Pembersihan
Menghapus project
Menghapus project Google Cloud:
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 selanjutnya
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.