[英]Redis sharded cluster on Azure Kubernetes
我已經按照這些鏈接
在 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.yaml和redis-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 name
和app=
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.