簡體   English   中英

Azure Kubernetes 上的 Redis 分片集群

[英]Redis sharded cluster on Azure Kubernetes

我已經按照這些鏈接

  1. https://medium.com/zero-to/setup-persistence-redis-cluster-in-kubertenes-7d5b7ffdbd98
  2. https://github.com/sanderploegsma/redis-cluster

在 AKS 上構建 Redis 分片集群,但它們通過使用 Pod IP 連接,但我需要使用“Python”連接到該集群以將數據輸入其中,由於它們使用 Pod IP 在內部連接,因此我無法連接使用 Python。 或者,不是一個 statefulset 的 6 個副本,我創建了 6 個不同的 statefulsets,其中包含 6 個服務,並且都作為“負載均衡器”對外公開,​​但是他們使用這個命令來創建一個集群

kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 \
$(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

我不知道如何編輯它以使用負載均衡器 IP 而不是 Pod IP,因此使用這 6 個外部 IP 我無法創建集群。 我需要一個 Azure Kubernetes 服務上的 Redis 分片集群,它可以從 Python 庫“redis-py-cluster”外部訪問

提前致謝

理論

您的問題不是很清楚,因為在最初的帖子下沒有答案形成我的評論,但看起來您一直在遵循本指南: 在 Kubernetes 中設置持久性 Redis 集群

讓我們分解您所指的命令:

kubectl exec -it redis-cluster-0 -- redis-trib create --replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

kubectl語法是:

kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]

這就是為什么: kubectl exec -it redis-cluster-0代表“在容器中執行命令”,在redis-cluster-0 pod 上帶有“將標准輸入傳遞到容器”和“標准輸入是 TTY”選項。

第二部分是redis-trib create --replicas 1 <IPs>

$(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

僅列出使用redis-cluster-deployment.yaml創建的 StatefulSet/s 中 pod 的 IP。

考慮到我們在該命令中使用的app=redis-cluster標簽是從spec/template/metadata/labels您可以按照自己喜歡的方式調整命令,或者只是手動列出使用kubectl get pods -l獲取它們的 IP kubectl get pods -l

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
...
spec:
  serviceName: redis-cluster
  replicas: 6
  template:
    metadata:
      labels:
        app: redis-cluster    # This is the label we are using in that command

我的回答

您可以使用 IP 或調整您在kubectl get pods -l ...命令中使用的標簽。 無法提供准確答案,因為我沒有收到重現步驟。

我的嘗試

我不確定您是如何創建 statefulset 的; 但是,您仍然可以在它們上創建一個 redis 集群。

就我而言,我使用了以下 YAML: redis-cluster-deployment-1.yamlredis-cluster-deployment-2.yaml

$ kubectl create -f redis-cluster-deployment-1.yaml 
statefulset.apps/redis-cluster-set-1 created

$ kubectl create -f redis-cluster-deployment-2.yaml 
statefulset.apps/redis-cluster-set-2 created

$ kubectl get pods -o wide 
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE                                            
redis-cluster-set-1-0   1/1     Running   0          52m   10.12.0.22   gke-6v3n
redis-cluster-set-1-1   1/1     Running   0          51m   10.12.1.17   gke-m7z8
redis-cluster-set-1-2   1/1     Running   0          50m   10.12.1.18   gke-m7z8
redis-cluster-set-2-0   1/1     Running   0          51m   10.12.0.23   gke-6v3n
redis-cluster-set-2-1   1/1     Running   0          50m   10.12.1.19   gke-m7z8
redis-cluster-set-2-2   1/1     Running   0          14m   10.12.0.24   gke-6v3n


$ kubectl exec -it redis-cluster-set-1-0 -- redis-trib create --replicas 1 $(kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.12.0.22:6379
10.12.1.17:6379
10.12.1.18:6379
Adding replica 10.12.1.19:6379 to 10.12.0.22:6379
Adding replica 10.12.0.24:6379 to 10.12.1.17:6379
Adding replica 10.12.0.23:6379 to 10.12.1.18:6379
....

這里的重要部分是指定正確的pod nameapp= label 。

就我而言, $(kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')命令會生成以下列表IPs(您可以將它們與上面的輸出進行比較。

$ kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 '
10.12.0.22:6379 10.12.1.17:6379 10.12.1.18:6379 10.12.0.23:6379 10.12.1.19:6379 10.12.0.24:6379

希望有幫助。

更新(2019 年 12 月 6 日):

已經創建了一個服務 LoadBalancer”,我很確定我在“spec”下給出了一個正確的“serviceName”。那個 LoadBalancer 給了我一個外部 Ip。在我創建了一個 redis 分片集群之后,當我嘗試使用python,它只能連接到redis的一個節點並請求其他5個節點,最終因“超時”錯誤而失敗

我做了同樣的事情並在 3 個節點上測試了它的 Redis 集群:

$ kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           
redis-cluster-set-1-0   1/1     Running   0          20h   10.12.1.30
redis-cluster-set-1-1   1/1     Running   0          20h   10.12.0.29
redis-cluster-set-1-2   1/1     Running   0          20h   10.12.1.31

創建了一些數據並嘗試將其從 Redis 集群中取出。

$ kubectl exec -it redis-cluster-set-1-0 -- redis-cli SET Australia Sydney
OK
$ kubectl exec -it redis-cluster-set-1-0 -- redis-cli GET Australia
"Sydney"

它有效,所以我嘗試從集群中的另一個節點查詢相同的數據

$ kubectl exec -it redis-cluster-set-1-2 -- redis-cli GET Australia
(error) MOVED 1738 10.12.1.30:6379

Redis 集群在MOVED響應中回復了內部 IP。

我認為內部 IP 地址是“超時”錯誤的原因。

同時可以直接登錄到那個 pod 中獲取數據

$ kubectl exec -it redis-cluster-set-1-2 -- bash
root@redis-cluster-set-1-2:/data# redis-cli GET Australia
(error) MOVED 1738 10.12.1.30:6379

root@redis-cluster-set-1-2:/data# redis-cli -h 10.12.1.30  GET Australia
"Sydney"

從這個Github 問題來看,redis 似乎沒有通過 Redis 集群代理連接,以糾正節點,而是簡單地將適當服務器的 IP 地址傳遞回客戶端,然后客戶端直接啟動連接。

(稍微偏離主題,但仍然值得一提)。 在檢查時,我發現了 [another document] 解釋了 ( https://cloud.google.com/memorystore/docs/redis/connect-redis-instance-gke ) 如何從 Google Kubernetes 連接到 Redis 實例引擎集群(帶負載均衡器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM