繁体   English   中英

Azure Kubernetes 上的 Redis 分片集群

[英]Redis sharded cluster on Azure Kubernetes

我已经按照这些链接

  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。 或者,不是一个 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.yamlredis-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 nameapp= 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM