[英]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.