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

我关注了这些链接

  • ,
  • 要在AKS上构建Redis分片集群,但它们是通过Pod IP连接的,但我需要使用“Python”连接到该集群以将数据输入其中,因为它们是通过Pod IP内部连接的,所以我无法使用Python连接。或者,我创建了6个不同的statefulset,其中包含6个服务,并以“负载平衡器”的形式对外公开,而不是一个statefulset的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 ')
    
    我不知道如何编辑它以使用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"