k8s如何部署redis集群

其他教程   发布日期:2023年06月28日   浏览次数:469

这篇文章主要讲解了“k8s如何部署redis集群”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“k8s如何部署redis集群”吧!

redis集群搭建

1.1使用redis-cli创建集群

  1. # 查看redis的pod对应的ip
  2. kubectl get pod -n jxbp -o wide
  3. >NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  4. redis-0 1/1 Running 0 18h 10.168.235.196 k8s-master <none> <none>
  5. redis-1 1/1 Running 0 18h 10.168.235.225 k8s-master <none> <none>
  6. redis-2 1/1 Running 0 18h 10.168.235.239 k8s-master <none> <none>
  7. redis-3 1/1 Running 0 18h 10.168.235.198 k8s-master <none> <none>
  8. redis-4 1/1 Running 0 18h 10.168.235.222 k8s-master <none> <none>
  9. redis-5 1/1 Running 0 18h 10.168.235.238 k8s-master <none> <none>
  10. # 进入到redis-0容器
  11. kubectl exec -it redis-0 /bin/bash -n jxbp
  12. # 创建master节点(redis-0、redis-2、redis-4)
  13. redis-cli --cluster create 10.168.235.196:6379 10.168.235.239:6379 10.168.235.222:6379 -a jxbd
  14. > Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  15. >>> Performing hash slots allocation on 3 nodes...
  16. Master[0] -> Slots 0 - 5460
  17. Master[1] -> Slots 5461 - 10922
  18. Master[2] -> Slots 10923 - 16383
  19. M: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379
  20. slots:[0-5460] (5461 slots) master
  21. M: 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379
  22. slots:[5461-10922] (5462 slots) master
  23. M: a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379
  24. slots:[10923-16383] (5461 slots) master
  25. Can I set the above configuration? (type 'yes' to accept): yes
  26. >>> Nodes configuration updated
  27. >>> Assign a different config epoch to each node
  28. >>> Sending CLUSTER MEET messages to join the cluster
  29. Waiting for the cluster to join
  30. .
  31. >>> Performing Cluster Check (using node 10.168.235.196:6379)
  32. M: bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379
  33. slots:[0-5460] (5461 slots) master
  34. M: a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379
  35. slots:[10923-16383] (5461 slots) master
  36. M: 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379
  37. slots:[5461-10922] (5462 slots) master
  38. [OK] All nodes agree about slots configuration.
  39. >>> Check for open slots...
  40. >>> Check slots coverage...
  41. [OK] All 16384 slots covered.

注意上面的master节点,会生成对应节点id:

  1. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638
  1. a2cec159bbe2efa11a8f60287b90927bcb214729
  1. 4367e4a45e557406a3112e7b79f82a44d4ce485e
,用于创建slave节点。
  1. # 为每个master节点添加slave节点
  2. # 10.168.235.196:6379的位置可以是任意一个master节点,一般我们用第一个master节点即redis-0的ip地址
  3. # --cluster-master-id参数指定该salve节点对应的master节点的id
  4. # -a参数指定redis的密码
  5. # redis-0的master节点,添加redis-1为slave节点
  6. redis-cli --cluster add-node 10.168.235.225:6379 10.168.235.196:6379 --cluster-slave --cluster-master-id bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 -a jxbd
  7. # redis-2的master节点,添加redis-3为slave节点
  8. redis-cli --cluster add-node 10.168.235.198:6379 10.168.235.239:6379 --cluster-slave --cluster-master-id a2cec159bbe2efa11a8f60287b90927bcb214729 -a jxbd
  9. # redis-4的master节点,添加redis-5为slave节点
  10. redis-cli --cluster add-node 10.168.233.238:6379 10.168.235.222:6379 --cluster-slave --cluster-master-id 4367e4a45e557406a3112e7b79f82a44d4ce485e -a jxbd

显示以下信息,即为添加成功:

[OK] All nodes agree about slots configuration.

[OK] All 16384 slots covered.

[OK] New node added correctly.

坑:

一开始是想用headless的域名创建redis集群的,这样节点重启后就不需要更新ip,但是redis不支持使用域名,所以只能绕了一圈又回到固定ip的方法,和容器环境很不协调。

1.2redis集群状态验证(可选)

  • cluster info

  1. # 进入到redis客户端,集群需要带上-c,有密码需要带上-a
  2. redis-cli -c -a jxbd
  3. # 查看redis集群信息
  4. 127.0.0.1:6379> cluster info
  5. cluster_state:ok
  6. cluster_slots_assigned:16384
  7. cluster_slots_ok:16384
  8. cluster_slots_pfail:0
  9. cluster_slots_fail:0
  10. cluster_known_nodes:6
  11. cluster_size:3
  12. cluster_current_epoch:3
  13. cluster_my_epoch:1
  14. cluster_stats_messages_ping_sent:7996
  15. cluster_stats_messages_pong_sent:7713
  16. cluster_stats_messages_sent:15709
  17. cluster_stats_messages_ping_received:7710
  18. cluster_stats_messages_pong_received:7996
  19. cluster_stats_messages_meet_received:3
  20. cluster_stats_messages_received:15709

注意:

现在进入集群中的任意一个Pod中都可以访问Redis服务,前面我们创建了一个headless类型的Service,kubernetes集群会为该服务分配一个DNS记录,格式为:

  1. $(pod.name)
.
  1. $(headless server.name)
.
  1. ${namespace}
.
  1. svc.cluster.local
,每次访问该服务名时,将会直接进入到redis的节点上。
  1. svc.cluster.local
可省略。 例如:

redis-cli -c -a jxbd -h redis-0.redis-hs.jxbp -p 6379

  • cluster nodes

  1. # 查看redis集群状态
  2. 127.0.0.1:6379> cluster nodes
  3. 70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670306292673 2 connected
  4. 122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.225:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670306290558 1 connected
  5. c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670306291162 3 connected
  6. 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 master - 0 1670306291561 2 connected 5461-10922
  7. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 myself,master - 0 1670306291000 1 connected 0-5460
  8. a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670306292166 3 connected 10923-16383

可以看到3个master,3个slave节点,都是

  1. connected
状态。
  • get,set验证

  1. # 会找到对应的槽进行set操作,去到10.168.235.222节点
  2. set name1 llsydn
  3. -> Redirected to slot [12933] located at 10.168.235.222:6379
  4. OK
  5. # set name1成功
  6. 10.168.235.222:6379> set name1 llsydn
  7. OK
  8. # get name1成功
  9. 10.168.235.222:6379> get name1
  10. "llsydn"

master节点进行set操作,slave节点复制。主从复制

1.3重启pod,验证集群(可选)

  1. # redis-1未重启之前
  2. 10.168.235.239:6379> cluster nodes
  3. 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 myself,master - 0 1670307319000 2 connected 5461-10922
  4. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 master - 0 1670307319575 1 connected 0-5460
  5. 70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670307318000 2 connected
  6. 122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.225:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670307319781 1 connected
  7. c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670307319071 3 connected
  8. a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670307318000 3 connected 10923-16383
  9. # 重启redis-1
  10. kubectl delete pod redis-1 -n jxbp
  11. pod "redis-1" deleted
  12. # redis-1重启之后
  13. 10.168.235.239:6379> cluster nodes
  14. 4367e4a45e557406a3112e7b79f82a44d4ce485e 10.168.235.239:6379@16379 myself,master - 0 1670307349000 2 connected 5461-10922
  15. bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 10.168.235.196:6379@16379 master - 0 1670307349988 1 connected 0-5460
  16. 70220b45e978d0cb3df19b07e55d883b49f4127d 10.168.235.238:6379@16379 slave 4367e4a45e557406a3112e7b79f82a44d4ce485e 0 1670307349000 2 connected
  17. 122b89a51a9bf005e3d47b6d721c65621d2e9a75 10.168.235.232:6379@16379 slave bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 0 1670307350089 1 connected
  18. c2afcb9e83038a47d04bf328ead8033788548234 10.168.235.198:6379@16379 slave a2cec159bbe2efa11a8f60287b90927bcb214729 0 1670307350000 3 connected
  19. a2cec159bbe2efa11a8f60287b90927bcb214729 10.168.235.222:6379@16379 master - 0 1670307348000 3 connected 10923-16383

可以看到重启后的,redis-1节点,虽然ip变了,但是redis集群,还是可以识别到新的ip,集群还是正常的。

10.168.235.225 ---> 10.168.235.232

1.4创建Service服务

前面我们创建了用于实现StatefulSet的Headless Service,但该Service没有Cluster Ip,因此不能用于外界访问。所以,我们还需要创建一个Service,专用于为Redis集群提供访问和负载均衡

这里可以使用

  1. ClusterIP
  1. NodePort
。这里,我使用的是
  1. NodePort

vi redis-ss.yaml

  1. ---
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. labels:
  6. k8s.kuboard.cn/layer: db
  7. k8s.kuboard.cn/name: redis
  8. name: redis-ss
  9. namespace: jxbp
  10. spec:
  11. ports:
  12. - name: imdgss
  13. port: 6379
  14. protocol: TCP
  15. targetPort: 6379
  16. nodePort: 6379
  17. selector:
  18. k8s.kuboard.cn/layer: db
  19. k8s.kuboard.cn/name: redis
  20. type: NodePort

创建名称为:

  1. redis-ss
的服务。

在K8S集群中暴露6379端口,并且会对

  1. labels name
  1. k8s.kuboard.cn/name: redis
的pod进行负载均衡。

然后在K8S集群中,就可以通过

  1. redis-ss:6379
,对redis集群进行访问。
  1. kubectl get service -n jxbp
  2. >NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. redis-hs ClusterIP None <none> 6379/TCP 76m
  4. redis-ss NodePort 10.96.54.201 <none> 6379:6379/TCP 2s

1.5 Springboot项目配置

  1. spring.redis.cluster.nodes=redis-ss:6379

1.6相关疑问分析

至此,大家可能会疑惑,那为什么没有使用稳定的标志,Redis Pod也能正常进行故障转移呢?这涉及了Redis本身的机制。因为,Redis集群中每个节点都有自己的NodeId(保存在自动生成的nodes.conf中),并且该NodeId不会随着IP的变化和变化,这其实也是一种固定的网络标志。也就是说,就算某个Redis Pod重启了,该Pod依然会加载保存的NodeId来维持自己的身份。我们可以在NFS上查看redis-0的nodes.conf文件:

  1. vi /opt/nfs/pv1/nodes.conf
  2. > f6d4993467a4ab1f3fa806f1122edd39f6466394 10.168.235.228:6379@16379 slave ebed24c8fca9ebc16ceaaee0c2bc2e3e09f7b2c0 0 1670316449064 2 connected
  3. ebed24c8fca9ebc16ceaaee0c2bc2e3e09f7b2c0 10.168.235.240:6379@16379 myself,master - 0 1670316450000 2 connected 5461-10922
  4. 955e1236652c2fcb11f47c20a43149dcd1f1f92b 10.168.235.255:6379@16379 master - 0 1670316449565 1 connected 0-5460
  5. 574c40485bb8f6cfaf8618d482efb06f3e323f88 10.168.235.224:6379@16379 slave 955e1236652c2fcb11f47c20a43149dcd1f1f92b 0 1670316449000 1 connected
  6. 91bd3dc859ce51f1ed0e7cbd07b13786297bd05b 10.168.235.237:6379@16379 slave fe0b74c5e461aa22d4d782f891b78ddc4306eed4 0 1670316450672 3 connected
  7. fe0b74c5e461aa22d4d782f891b78ddc4306eed4 10.168.235.253:6379@16379 master - 0 1670316450068 3 connected 10923-16383
  8. vars currentEpoch 3 lastVoteEpoch 0

如上,第一列为NodeId,稳定不变;第二列为IP和端口信息,可能会改变。

这里,我们介绍NodeId的两种使用场景:

当某个Slave Pod断线重连后IP改变,但是Master发现其NodeId依旧, 就认为该Slave还是之前的Slave。

当某个Master Pod下线后,集群在其Slave中选举重新的Master。待旧Master上线后,集群发现其NodeId依旧,会让旧Master变成新Master的slave。

以上就是k8s如何部署redis集群的详细内容,更多关于k8s如何部署redis集群的资料请关注九品源码其它相关文章!