Python 3.x Azure Kubernetes上的Redis碎片群集
我关注了这些链接Python 3.x Azure Kubernetes上的Redis碎片群集,python-3.x,azure,kubernetes,redis,redis-cluster,Python 3.x,Azure,Kubernetes,Redis,Redis Cluster,我关注了这些链接 , 要在AKS上构建Redis分片集群,但它们是通过Pod IP连接的,但我需要使用“Python”连接到该集群以将数据输入其中,因为它们是通过Pod IP内部连接的,所以我无法使用Python连接。或者,我创建了6个不同的statefulset,其中包含6个服务,并以“负载平衡器”的形式对外公开,而不是一个statefulset的6个副本,但是他们使用这个命令来创建集群 kubectl exec -it redis-cluster-0 -- redis-cli --clus
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 ')
我不知道如何编辑它以使用loadbalancer IP而不是Pod IP,因此使用这6个外部IP我无法创建集群。我需要Azure Kubernetes服务上的Redis分片集群,可以从Python库“Redis py cluster”外部访问该集群
提前感谢理论 你的问题不是很清楚,因为在最初的帖子下我的评论没有答案,但看起来你一直在遵循以下指南: 让我们分解您引用的命令:
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上有“将stdin传递到容器”和“stdin是TTY”选项
第二部分是redis trib创建——副本1和
$(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
仅列出使用创建的状态集中的POD的IP
考虑到我们在该命令中使用的app=redis cluster
标签取自spec/template/metadata/labels
,您可以按照自己喜欢的方式调整该命令,或者只是手动列出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
我的回答:
您可以使用IPs或调整在命令的kubectl get pods-l…
部分中使用的标签。
无法提供准确答案,因为我没有收到复制步骤
我的尝试:
我不确定你到底是如何创建你的状态集的;但是,您仍然可以在它们上创建redis群集
在我的例子中,我使用了以下YAML:和
这里的重要部分是指定正确的pod名称
和app=
标签
在我的例子中,$(kubectl get pods-l app=redis cluster set app-o jsonpath='{range.items[*]}{.status.podIP}:6379')
命令生成以下IP列表(您可以将它们与上面的输出进行比较)
$ 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”,并且我非常确定我在“规范”下给出了一个正确的“serviceName”“。该LoadBalancer为我提供了一个外部Ip。在我创建了一个redis分片集群后,当我尝试使用python连接到该外部Ip时,它只能连接到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"
由此看来,redis并没有通过redis集群代理连接到正确的节点,而是简单地将相应服务器的IP地址传递回客户机,然后客户机直接启动连接
(有点离题,但仍然值得一提)。
检查时,我发现了一个[另一个文档]解释()如何从Google Kubernetes引擎集群(使用LoadBalancer)连接到Redis实例。>“或者,我创建了6个不同的状态集,其中包含6个服务,并作为“负载均衡器”对外公开“,但他们用来创建集群的这个命令。”不清楚。你能提供一个吗?嘿@Nick,谢谢你的回答,我能够创建一个集群非常好,我的问题是因为Redis集群的节点都是POD IP(内部IP地址)对于kubernetes,我无法使用python库redis py cluster从kubernetes外部连接到它们。@Dherudev,我明白了。需要使用一些服务从外部连接()。例如-NodePort。服务到位后,我电脑上的redis cli工具可以到达redis群集(在K8s上)当我遵循这一点时,我已经创建了一个带有“type:LoadBalancer”的服务,我很确定我在“spec”下给出了一个正确的“serviceName”“。该LoadBalancer为我提供了一个外部Ip。在我创建了一个redis分片群集后,当我尝试使用python连接到该外部Ip时,它只能连接到redis的一个节点,并请求其他5个节点,最终因“超时”而失败。”错误我已更新了我的答案。我认为问题在于Redis节点具有内部IP地址,因此客户端不可能联系适当的节点来满足该请求。感谢您澄清此问题。
$ 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"