使用 Redis Enterprise 將 Redis 部署至 GKE

本指南說明如何將 Redis Enterprise 部署至 Google Kubernetes Engine (GKE) 叢集。

Redis 是開放原始碼的記憶體內 NoSQL 資料庫,主要用於快取。內建複寫、Lua 指令碼、LRU 逐出、交易、磁碟上持續性及高可用性。

Redis Enterprise 是企業級解決方案,可擴充 Redis 開放原始碼,簡化管理作業,包括地理位置複製資料分配、作業輸送量線性擴充、資料分層、進階安全功能等。

Redis Enterprise 的每種部署選項都有不同的定價,包括: 軟體雲端混合式和多雲

本指南適用於有興趣在 Google Kubernetes Engine (GKE) 上部署 Redis Enterprise 的平台管理員、雲端架構師和營運專員。

設定環境

在本教學課程中,您將使用 Cloud Shell 管理Google Cloud上託管的資源。Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectlgcloud CLITerraform

如要使用 Cloud Shell 設定環境,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,按一下Cloud Shell 啟用圖示Google Cloud 控制台中的「啟用 Cloud Shell」,即可啟動 Cloud Shell 工作階段。系統會在 Google Cloud 控制台的底部窗格啟動工作階段。

  2. 設定環境變數:

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

    PROJECT_ID: your Google Cloud 替換為您的專案 ID

  3. 複製 GitHub 存放區:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 變更為工作目錄:

    cd kubernetes-engine-samples/databases/redis-enterprise-operator
    

建立叢集基礎架構

在本節中,您將執行 Terraform 指令碼,建立私人、高可用性的地區 GKE 叢集和 VPC。

下圖顯示部署在三個不同可用區的私有區域標準 GKE 叢集:

如要部署這項基礎架構,請在 Cloud Shell 中執行下列指令:

  cd terraform/gke-standard
  export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
  terraform init
  terraform apply -var project_id=${PROJECT_ID}   \
    -var region=${REGION}  \
    -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

系統顯示提示訊息時,請輸入 yes。這個指令可能需要幾分鐘才能完成,且叢集會顯示就緒狀態。

Terraform 會建立下列資源:

  • Kubernetes 節點的虛擬私有雲網路和私有子網路
  • 透過 NAT 存取網際網路的路由器
  • us-central1 地區中的私人 GKE 叢集
  • 啟用自動調度資源的節點集區 (每個區域一到兩個節點,每個區域至少一個節點)

輸出結果會與下列內容相似:

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

連線至叢集

使用 Cloud Shell 設定 kubectl 與叢集通訊:

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

將 Redis Enterprise 運算子部署至叢集

在本節中,您將Redis Enterprise 運算子部署至 Kubernetes 叢集。

  1. 為 REC 及其應用程式建立命名空間:

    kubectl create namespace rec-ns
    kubectl create namespace application
    
  2. 為命名空間加上標籤:

    kubectl label namespace rec-ns connection=redis
    kubectl label namespace application connection=redis
    
  3. 取得最新版本的 Redis Enterprise Operator 套件:

    VERSION=`curl --silent https://api.github.com/repos/RedisLabs/redis-enterprise-k8s-docs/releases/latest | grep tag_name | awk -F'"' '{print $4}'`
    
  4. 安裝 Redis Enterprise 運算子:

    kubectl apply -n rec-ns -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml
    

    輸出結果會與下列內容相似:

    role.rbac.authorization.k8s.io/redis-enterprise-operator created
    rolebinding.rbac.authorization.k8s.io/redis-enterprise-operator created
    serviceaccount/redis-enterprise-operator created
    service/admission created
    customresourcedefinition.apiextensions.k8s.io/redisenterpriseclusters.app.redislabs.com created
    customresourcedefinition.apiextensions.k8s.io/redisenterprisedatabases.app.redislabs.com created
    customresourcedefinition.apiextensions.k8s.io/redisenterpriseremoteclusters.app.redislabs.com created
    customresourcedefinition.apiextensions.k8s.io/redisenterpriseactiveactivedatabases.app.redislabs.com created
    deployment.apps/redis-enterprise-operator created
    

部署 Redis Enterprise 叢集

  1. 將資訊清單套用至叢集:

    kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yaml
    

    這個指令可能需要幾分鐘才能完成。

  2. 檢查 REC 部署狀態:

    kubectl get rec -n rec-ns
    

    輸出結果會與下列內容相似:

    NAME      NODES   VERSION    STATE     SPEC STATUS   LICENSE STATE   SHARDS LIMIT   LICENSE EXPIRATION DATE   AGE
    gke-rec   3       7.2.4-52   Running   Valid         Valid           4              2023-09-29T20:15:32Z      4m7s
    

    STATE 變成 RUNNING,叢集就準備就緒。

選用:設定准入控制器

您可以視需要設定基礎架構,在部署時驗證資料庫。

  1. 設定許可控制器,並檢查許可 TLS Secret 是否存在:

    kubectl get secret admission-tls -n rec-ns
    
  2. 取得認證:

    export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
    
  3. 將憑證複製到 webhook.yaml 檔案:

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    
  4. 部署驗證 Webhook:

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    

    准入控制器會驗證標籤命名空間的資料庫語法。

  5. 建立無法運作的資料庫,驗證准入控制器:

    kubectl apply -n rec-ns -f - << EOF
    apiVersion: app.redislabs.com/v1alpha1
    kind: RedisEnterpriseDatabase
    metadata:
      name: redis-enterprise-database
    spec:
      evictionPolicy: illegal
    EOF
    

    輸出結果會與下列內容相似:

    Error from server: error when creating "STDIN": admission webhook "redisenterprise.admission.redislabs" denied the request: 'illegal' is an invalid value for 'eviction_policy'. Possible values are ['volatile-lru', 'volatile-ttl', 'volatile-random', 'allkeys-lru', 'allkeys-random', 'noeviction', 'volatile-lfu', 'allkeys-lfu']
    

建立命名空間

根據預設,Redis Enterprise Operator 無權在自身命名空間以外執行動作。如要允許 Redis Enterprise Operator 在其他命名空間中建立 REDB 和資料庫端點,您必須設定 RBAC。

  1. 在應用程式命名空間中套用對應的角色和角色繫結:

    kubectl apply -f manifests/01-basic-cluster/role.yaml -n application
    kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
    
  2. rec-ns 命名空間中建立叢集角色和叢集角色繫結:

    kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role.yaml
    kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role_binding.yaml
    
  3. 編輯 REC ConfigMap,加入應用程式命名空間的控制項:

    kubectl patch ConfigMap/operator-environment-config --type merge -p '{"data": {"REDB_NAMESPACES_LABEL": "connection=redis"}}' -n rec-ns
    

    系統會修補標示為 ConfigMap 的每個命名空間。

  4. rec-ns 命名空間中,檢查 Redis 基礎架構中資源的狀態:

    kubectl get pod,deploy,svc,rec,statefulset,cm,secrets -n rec-ns
    

    輸出結果會與下列內容相似:

    NAME                                             READY   STATUS    RESTARTS        AGE
    pod/gke-rec-0                                    2/2     Running   0               172m
    pod/gke-rec-1                                    2/2     Running   0               171m
    pod/gke-rec-2                                    2/2     Running   0               168m
    pod/gke-rec-services-rigger-5f885f59dc-gc79g     1/1     Running   0               172m
    pod/redis-enterprise-operator-6668ccd8dc-kx29z   2/2     Running   2 (5m58s ago)   5h
    
    NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/gke-rec-services-rigger     1/1     1            1           172m
    deployment.apps/redis-enterprise-operator   1/1     1            1           5h
    
    NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
    service/admission      ClusterIP   10.52.11.13   <none>        443/TCP             5h
    service/gke-rec        ClusterIP   10.52.5.44    <none>        9443/TCP,8001/TCP   172m
    service/gke-rec-prom   ClusterIP   None          <none>        8070/TCP            172m
    service/gke-rec-ui     ClusterIP   10.52.3.29    <none>        8443/TCP            172m
    
    NAME                                               NODES   VERSION    STATE     SPEC STATUS   LICENSE STATE   SHARDS LIMIT   LICENSE EXPIRATION DATE   AGE
    redisenterprisecluster.app.redislabs.com/gke-rec   3       7.2.4-52   Running   Valid         Valid           4              2023-10-05T11:07:20Z      172m
    
    NAME                       READY   AGE
    statefulset.apps/gke-rec   3/3     172m
    
    NAME                                    DATA   AGE
    configmap/gke-rec-bulletin-board        1      172m
    configmap/gke-rec-health-check          5      172m
    configmap/kube-root-ca.crt              1      5h2m
    configmap/operator-environment-config   1      5h
    
    NAME                   TYPE     DATA   AGE
    secret/admission-tls   Opaque   2      5h
    secret/gke-rec         Opaque   2      172m
    

部署 Redis Enterprise 資料庫

  1. 在應用程式命名空間中建立 Redis Enterprise 資料庫:

    kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
    
  2. 檢查 REDB 狀態:

    kubectl get redb --all-namespaces
    

    輸出結果會與下列內容相似:

    NAMESPACE       NAME       VERSION   PORT    CLUSTER   SHARDS   STATUS   SPEC STATUS   AGE
    application   app-db   7.2.0     12999   gke-rec   1        active   Valid         15s
    
  3. 確認每個 REDB 的服務是否正在執行:

    kubectl get svc --all-namespaces
    

    輸出結果會與下列內容相似:

    NAMESPACE      NAME      TYPE          CLUSTER-IP   EXTERNAL-IP                           PORT(S)    AGE
    application  app-db  ExternalName  <none>       redis-12999.rec-ns.svc.cluster.local  12999/TCP  72m
    
  4. 確認密鑰已建立:

    kubectl get secrets -n application
    

    輸出結果會與下列內容相似:

    NAME            TYPE     DATA   AGE
    redb-app-db   Opaque   3      96m
    

使用密碼驗證

您可以使用應用程式命名空間中具有 redis-cli 的 Pod 連線至 REDB。用戶端 Pod 會使用應用程式命名空間 (REDB) 中的可用密鑰建立連線。

使用自訂資源 REDB 建立的資料庫僅支援不含 ACL 的密碼驗證

  1. 建立用戶端 Pod:

    kubectl apply -n application -f manifests/03-auth/client_pod.yaml
    
  2. 連線至用戶端 Pod:

    kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
    
  3. 連線至資料庫:

    redis-cli -h $SERVICE -p $PORT --pass $PASS
    
  4. 建立金鑰:

    SET mykey "Hello World"
    

    輸出結果會與下列內容相似:

    OK
    
  5. 取得金鑰:

    GET mykey
    

    輸出結果會與下列內容相似:

    "Hello World"
    
  6. 退出 Pod 殼層

    exit
    

瞭解 Prometheus 如何收集 Redis 叢集的指標

下圖顯示 Prometheus 指標的收集方式:

在圖表中,GKE 私人叢集包含:

  • 在路徑 / 和通訊埠 8070 上收集指標的 Redis Pod
  • 以 Prometheus 為基礎的收集器,可處理 Redis Pod 的指標
  • 將指標傳送至 Cloud Monitoring 的 PodMonitoring 資源

Redis Enterprise 運算子會以 Prometheus 格式公開叢集指標。

  1. 建立 metrics-proxy Deployment:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yaml
    

    由於運算子只提供具有自行簽署憑證的 HTTPS 端點,且 PodMonitoring 資源不支援停用 TLS 憑證驗證,因此您可以使用 metrics-proxy Pod 做為這個端點的反向 Proxy,在 HTTP 連接埠上公開指標。

  2. 建立 PodMonitoring 資源,透過 labelSelector 抓取指標:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
    
  3. 在 Google Cloud 控制台中,前往「GKE Clusters Dashboard」(GKE 叢集資訊主頁) 頁面。

    前往 GKE 叢集資訊主頁

    資訊主頁會顯示非零指標的擷取率。

建立資訊主頁

您可以建立資訊主頁來查看指標。

  1. 建立資訊主頁:

    gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
    

    輸出結果會與下列內容相似:

    Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
    
  2. 前往 Google Cloud 控制台的「資訊主頁」頁面。

    前往資訊主頁

  3. 開啟 Redis Enterprise Cluster 資訊主頁。自動佈建資訊主頁可能需要幾分鐘的時間。

驗證匯出的指標

如要驗證指標,請建立新的資料庫並檢查指標。

  1. 開啟 Redis Enterprise Cluster 資訊主頁

  2. 建立額外的 Redis 資料庫:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/c-rdb.yaml
    

    資訊主頁上的「資料庫數量」應會更新。

  3. 建立用戶端 Pod,連線至新資料庫:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
    
  4. 連線至用戶端 Pod 並準備變數:

    kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
    
  5. 使用 redis-cli 工具建立新金鑰:

    for i in {1..50}; do \
      redis-cli -h $SERVICE -p $PORT -a $PASS \
      --no-auth-warning SET mykey-$i "myvalue-$i"; \
    done
    
  6. 重新整理頁面,觀察圖表是否已更新,顯示實際的資料庫狀態。

  7. 退出 Pod 殼層

    exit