Kubernetes Redis集群问题

4

我正在尝试在CentOS上使用Kubernetes创建Redis集群。我的Kubernetes主服务器运行在一个主机上,而两个不同的主机上则运行了Kubernetes从服务器。

etcdctl get /kube-centos/network/config

{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }

这是我的复制控制器

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
  labels:
  app: redis
  role: master
  tier: backend
spec:
  replicas: 6
  template:
    metadata:
      labels:
        app: redis
        role: master
        tier: backend
    spec:
      containers:
      - name: master
        image: redis
        command: 
          - "redis-server"
        args:
          - "/redis-master/redis.conf"
        ports:
        - containerPort: 6379
        volumeMounts:
        - mountPath: /redis-master
          name: config
        - mountPath: /redis-master-data 
          name: data
        volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: redis-config
            items:
            - key: redis-config
              path: redis.conf    

kubectl create -f rc.yaml 是一个命令,用于创建一个Replication Controller。
NAME                           READY     STATUS    RESTARTS   AGE       IP            NODE
redis-master-149tt             1/1       Running   0          8s        172.30.96.4   centos-minion-1
redis-master-14j0k             1/1       Running   0          8s        172.30.79.3   centos-minion-2
redis-master-3wgdt             1/1       Running   0          8s        172.30.96.3   centos-minion-1
redis-master-84jtv             1/1       Running   0          8s        172.30.96.2   centos-minion-1
redis-master-fw3rs             1/1       Running   0          8s        172.30.79.4   centos-minion-2
redis-master-llg9n             1/1       Running   0          8s        172.30.79.2   centos-minion-2

使用的Redis配置文件

appendonly yes
cluster-enabled yes
cluster-config-file /redis-master/nodes.conf
cluster-node-timeout 5000
dir /redis-master
port 6379

我使用以下命令创建Kubernetes服务。

kubectl expose rc redis-master --name=redis-service --port=6379 --target-port=6379 --type=NodePort

该命令用于创建Kubernetes服务,名称为"redis-service",端口为6379,目标端口为6379,并且类型为NodePort。
Name:           redis-service
Namespace:      default
Labels:         app=redis
                role=master
                tier=backend
Selector:       app=redis,role=master,tier=backend
Type:           NodePort
IP:             10.254.229.114
Port:           <unset> 6379/TCP
NodePort:       <unset> 30894/TCP
Endpoints:      172.30.79.2:6379,172.30.79.3:6379,172.30.79.4:6379 + 3     more...
Session Affinity:   None
No events.

现在我已经使所有的pod和service运行起来了。我正在使用redis-trib pod来创建redis集群。
kubectl exec -it redis-trib bash ./redis-trib.rb create --replicas 1 172.30.79.2:6379 172.30.79.3:6379 172.30.79.4:6379 172.30.96.2:6379 172.30.96.3:6379 172.30.96.4:6379
Redis集群已按预期创建,下面是创建集群时的信息。
[OK] All 16384 slots covered.

现在,我应该能够从我的网络中的任何主机上通过kubernetes节点IP(192.168.240.116)和nodePort(30894)访问我的redis-cluster。当我在其中一个kubernetes节点上执行以下命令时,一切正常。

redis-cli -p 30894 -h 192.168.240.116 -c

192.168.240.116:30894> set foo bar
-> Redirected to slot [12182] located at 172.30.79.4:6379
OK
172.30.79.4:6379> 

当我从同一网络中的不同节点(非 Kubernetes 节点)运行相同的命令时,我会看到连接超时错误。

redis-cli -c -p 30894 -h 192.168.240.116

192.168.240.116:30894> set foo bar
-> Redirected to slot [12182] located at 172.30.79.4:6379
Could not connect to Redis at 172.30.79.4:6379: Connection timed out

当使用NodePort服务类型将redis-cluster暴露在kubernetes集群网络之外时,是否无法访问它?

由于我没有在云上托管,因此也无法使用LoadBalancer服务类型。

我已经被这个问题困扰了很长时间。有人能建议我应该使用什么方法来访问我的redis-cluster吗?

谢谢


kube-proxy正在运行,或者是否抛出任何错误? - jaxxstorm
1个回答

3
运行 ./redis-trib.rb create --replicas 1 172.30.79.2:6379 172.30.79.3:6379 172.30.79.4:6379 172.30.96.2:6379 172.30.96.3:6379 172.30.96.4:6379 在这个设置中没有意义。
端口 6379 只能通过您启动的服务访问,但不能直接访问,因此您尝试使用它时会遇到问题。
您可以做的是将每个 POD 暴露为自己的服务,并有一个额外的集群服务来负载均衡外部请求。如 Kelsey Hightower 的示例仓库所示。这样,POD 可以通过内部暴露的端口进行通信,(外部)客户端可以使用负载平衡的集群端口。这也意味着每个 POD 都需要有自己的 ReplicaSet(或 Deployment)。Kelsey 在 YouTube 上有一次长谈,其中详细解释了设置 - YouTube / Slideshare
另一种选择是使用单个 redis 主节点,如其他示例所示。

谢谢。我尝试按照Kelsey的文档链接进行操作,做了一些更改,删除了gcloud设置,并在服务中更改了IP。已创建副本集和服务。当我按照文档中所述创建集群时,它并没有创建集群。相反,我可以看到等待集群加入很长时间并且一直在进行。 > ./redis-trib.rb create --replicas 1 10.254.242.1:6379 10.254.242.2:6379 10.254.242.3:6379 10.254.242.4:6379 10.254.242.5:6379 10.254.242.6:6379 - user3610007
没有看到配置文件,这个问题很难回答。基本思路是每个POD有一个服务和一个部署,并使用复合服务。您可能需要分享更多细节来进行进一步的调试。 - pagid
配置与此链接中的replicaset相同link,仅下面几行(gcePersistentDisk: pdName: "redis-1" fsType: ext4)被替换为**emptyDir: {}以消除gcloud依赖性。对于服务link。我将我的集群IP更改为匹配配置clusterIP:"10.254.242.1"**。 - user3610007
当使用 Pod IP 而不是 Service IP 时创建了集群。你知道为什么吗? - user3610007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接