我关注了这些链接
在AKS上构建Redis分片集群,但是它们是使用Pod IP连接的,但是我需要使用“ Python”将其连接到该集群以将数据馈入其中,因为它们是使用Pod IP内部连接的,所以我不是能够使用Python连接。另外,我用一个6个服务创建了6个不同的有状态集,而不是一个有状态集的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 Services上的Redis分片群集,可以从Python库“ redis-py-cluster”
从外部进行访问预先感谢
答案 0 :(得分:0)
理论
由于您的问题尚不清楚,因为在最初的帖子中没有我的评论的答案,但是您似乎一直在遵循本指南:Setup Persistence Redis Cluster in Kubernetes。
让我们分解您所指的命令:
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
窗格上带有“将stdin传递到容器”和“ Stdin是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中的Pod的IP。
考虑到我们在该命令中使用的app=redis-cluster
标签取自spec/template/metadata/labels
,您可以根据自己的喜好调整该命令,也可以只列出通过{ {1}}
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或调整正在使用的标签。
无法提供准确的答案,因为我没有收到重现步骤。
我的尝试:
我不确定您创建状态集的精确程度;但是,您仍然可以在它们上创建redis集群。
就我而言,我使用了以下YAML:redis-cluster-deployment-1.yaml和redis-cluster-deployment-2.yaml。
kubectl get pods -l ...
此处的重要部分是指定正确的$ 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=
命令产生以下IP列表(您可以将它们与上面的输出进行比较。
$(kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
希望有帮助。
更新(2019年12月6日):
已经创建了一个服务“ LoadBalancer”,我很确定我在“ spec”下给出了正确的“ serviceName”。该LoadBalancer给了我一个外部IP。使用python的外部IP,它只能连接到Redis的一个节点,并要求其他5个节点,最终因“超时”错误而失败
我也做了同样的测试 Redis群集位于3个节点上:
$ 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
创建了一些数据,并试图从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
它起作用了,所以我试图从集群中的另一个节点查询相同的数据
$ 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"
Redis群集在$ kubectl exec -it redis-cluster-set-1-2 -- redis-cli GET Australia
(error) MOVED 1738 10.12.1.30:6379
响应中回复了内部IP。
我认为内部IP地址是该“超时”错误的原因。
与此同时,直接登录该Pod时可以获取数据
MOVED
从这个Github Issue看来,redis不会通过Redis集群代理连接以更正节点,而只是将适当服务器的IP地址传回给客户端,然后由客户端直接启动连接。
(稍微偏离主题,但仍然值得一提)。 在检查时,我找到了[另一个文档],该文档解释了(https://cloud.google.com/memorystore/docs/redis/connect-redis-instance-gke)如何从Google Kubernetes Engine集群(使用LoadBalancer)连接到Redis实例。