使用客製 config 在 kubenetes 上建立 Redis cluster

之前筆記 在 Kubernetes 部署 Redis Cluster 紀錄到如何使用 KubeDB Operator 來建立 redis cluster,不過之前筆記內容是透過預設值來進行安裝與設定,而在面對不同情境的現實需求(eg.改變最大連線數、指定 log 位置、RDB 與 AOF 的策略….etc)下就顯得有些捉襟見肘,所以今天就來紀錄一下如何在 Kubernetes 上透過 KubeDB 安裝 redis cluster 時使用自有設定值

基本環境說明

以下 VM 透過 Azure 建立

  1. CentOS 7.6 * 4

    • Standard B2ms
    • 2 vcpus, 8 GiB memory
    • 200 GB Standard SSD
  2. VM 配置說明

    請確保各個 node 間可以透過 host name 連線

    NameIP用途
    node110.0.0.4ansible-client
    node210.0.0.5master,etcd
    node310.0.0.6node,etcd
    node410.0.0.7node,etcd
  3. Kubernetes 1.16.3

  4. Kubespray 2.12

  5. Helm v2.14.3

    測試時如高於這個版本,會造成安裝失敗

  6. KubeDB v0.13.0-rc.0

    測試時如低於這個版本,會造成安裝失敗

  7. Redis 5.0.3

安裝 KubeDB Operator

以下使用 Helm 安裝,也可以使用 script 來執行安裝,請參考 Installation GuideScript tab 內容

  1. 加入 appscode (KudeDB 的開發公司) 的 helm repo

    helm repo add appscode https://charts.appscode.com/stable/
    
  2. 更新 Helm repo

    helm repo update
    
  3. 安裝 kubedb operator chart

    helm install appscode/kubedb --name kubedb-operator --version v0.13.0-rc.0 --set apiserver.enableMutatingWebhook=false --set apiserver.enableValidatingWebhook=false --namespace kube-system
    
    • 未關閉 apiserver.enableMutatingWebhook 錯誤

      使用 kubedb 建立 redis 時會出現錯誤

      • 錯誤訊息

        Error from server (InternalError): error when creating "redis-cluster.yaml": Internal error occurred: failed calling webhook "redis.mutators.kubedb.com": the server is currently unable to handle the request
        
      • 錯誤截圖

        4webhookfail

    • 未關閉 apiserver.enableValidatingWebhook 錯誤

      使用 kubedb 建立 redis 時會出現錯誤

      • 錯誤訊息

        Error from server (InternalError): error when creating "redis-cluster.yaml": Internal error occurred: failed calling webhook "redis.validators.kubedb.com": the server is currently unable to handle the request
        
      • 錯誤截圖

        5validatefail

  4. 確認成功註冊 CRD

    kubectl get crds -l app=kubedb
    

    1registcrd

  5. 安裝 KubeDB catalog

    helm install appscode/kubedb-catalog --name kubedb-catalog --version v0.13.0-rc.0   --namespace kube-system
    
  6. 確認成功安裝

    KubeDB operator pods 是 Running

    kubectl get pods --all-namespaces -l app=kubedb
    

    2operatorrunning

安裝 KubeDB CLI

  1. 下載編譯完成的 sh

    wget -O kubedb https://github.com/kubedb/cli/releases/download/v0.13.0-rc.0/kubedb-linux-amd64 \
    && chmod +x kubedb \
    && sudo mv kubedb /usr/local/bin/
    
  2. 確認成功安裝

    kubedb version
    

    1kubedbversion

準備 redis.conf 進行安裝

  1. 建立測試用 namespace

    kubectl create ns demo
    
  2. redis.conf

    cluster-enabled yes
    cluster-config-file /data/nodes.conf
    cluster-node-timeout 5000
    cluster-migration-barrier 1
    dir /data
    appendonly yes
    
    maxclients 50000
    
    requirepass  pass.123
    masterauth pass.123
    rename-command FLUSHALL ""
    rename-command FLUSHDB ""
    
  3. 將 redis.conf 建立成一個 configMap

    kubectl create configmap -n demo rd-custom-config --from-file=./redis.conf
    
  4. redis cluster 安裝用 yaml

    使用上面加入的 configMap 來安裝 (透過 spec.configSource.configMap.name)

    apiVersion: kubedb.com/v1alpha1
    kind: Redis
    metadata:
      name: redis-cluster
      namespace: demo
    spec:
      version: 5.0.3-v1
      configSource:
        configMap:
          name: rd-custom-config
      mode: Cluster
      cluster:
        master: 3
        replicas: 1
      storageType: Durable
      storage:
        resources:
          requests:
            storage: 1Gi
        storageClassName: "local-redis"
        accessModes:
        - ReadWriteOnce
      terminationPolicy: Pause
      updateStrategy:
        type: RollingUpdate
    
  5. 使用 redis-cluster.yaml 建立 Redis

    kubedb create -f redis-cluster.yaml
    
  6. 確認成功安裝

    • 檢查 type 為 redis 且名稱為 redis-cluster 的所有 resource 狀態

      kubedb describe redis -n demo redis-cluster
      
    • 成功建立 三 個 StatefulSet 且各有 二 個 pod 運行中

      kubedb get statefulset -n demo
      

      8statefulsetok

    • 連線至 redis 中確認 cluster 狀態

      kubectl -n demo exec -it redis-cluster-shard0-0 -- redis-cli -a pass.123 cluster nodes
      

      2clusterinfo

心得

KubeDB 在 redis 安裝時使用客製 config,我實測下 v0.12.0 會無法成功建立 cluster 需改用 KubeDB v0.13.0-rc.0,官方 GitHub 有其他人反應相同 issue:[redis] Redis cluster with custom config file not working,另個問題是 Helm v2.16.3 也無法正確完成安裝,需要改用 Helm v2.14.3 就可以暫時解決問題,官方 GitHub 有其他人反應相同 issue:[Helm Chart catalog fails to be installed - validators.kubedb.com/v1alpha1: the server is currently unable to handle the request

其中 [redis] Redis cluster with custom config file not working 官方人員提到因為 securitty 因素,不支援 requirepass 設定,實測下倒是 ok

不知道是太少人用還是穩定性真的待加強,我自己照著官方上的文件操作數十次,從來不曾一次搞定過,總是得要一直翻查 issue 看看有沒有人遇到一樣問題跟如何解決,這點在實際使用上個人覺得頗為困擾,但畢竟人家也是佛心免費提供,實在不忍苛責呀

參考資訊

  1. 在 Kubernetes 部署 Redis Cluster
  2. Using Custom Configuration File
  3. [redis] Redis cluster with custom config file not working
  4. Installation Guide
  5. Helm Chart catalog fails to be installed - validators.kubedb.com/v1alpha1: the server is currently unable to handle the request