Azure Kubernetes上的Redis分片群集

时间:2019-12-01 17:05:44

标签: python-3.x azure kubernetes redis redis-cluster

我关注了这些链接

  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连接。另外,我用一个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”

从外部进行访问

预先感谢

1 个答案:

答案 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.yamlredis-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实例。