# k8s-redis-cluster **Repository Path**: bertxue/k8s-redis-cluster ## Basic Information - **Project Name**: k8s-redis-cluster - **Description**: 使用k8s 部署三主三丛redis集群 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 12 - **Created**: 2022-02-18 - **Last Updated**: 2022-02-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## k8s 上部署 Redis 三主三从 集群 ### 参考地址 - https://rancher.com/blog/2019/deploying-redis-cluster/ - https://www.cnblogs.com/winstom/p/11881882.html ### 什么是Redis群集 Redis Cluster是一组Redis实例,旨在通过对数据库进行分区来扩展数据库,从而使其更具弹性。 群集中的每个成员(无论是主副本还是辅助副本)都管理哈希槽的子集。如果主机无法访问,则其从机将升级为主机。在由三个主节点组成的最小Redis群集中,每个主节点都有一个从节点(以实现最小的故障转移),每个主节点都分配有一个介于0到16,383之间的哈希槽范围。节点A包含从0到5000的哈希槽,节点B从5001到10000,节点C从10001到16383。 群集内部的通信是通过内部总线进行的,使用八卦协议传播有关群集的信息或发现新节点。 ### 在Kubernetes中部署Redis集群 在Kubernetes中部署Redis集群面临挑战,因为每个Redis实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色。为此,我们需要结合使用Kubernetes StatefulSets和PersistentVolumes ### 部署 ```bash # 创建pv kubectl apply -f redis-pv.yaml kubectl get pv # 创建statefulset kubectl apply -f redis-sts.yaml kubectl get pods -l app=redis-cluster # 创建service kubectl apply -f redis-svc.yaml # 初始化 Redis Cluster # 下一步是形成Redis集群。为此,我们运行以下命令并键入yes以接受配置。前三个节点成为主节点,后三个节点成为从节点。 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 ') # 加入namespace kubectl exec -n redis-ns -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -n redis-ns -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ') # 上面的命令 最后 多了 :6379 这个端口号 导致不成功 # 解决 运行下面的命令, 拷贝最后 :6379 之前的字符串 # kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ' # 运行命令 # kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 拷贝的字符串 # 验证集群部署 kubectl exec -it redis-cluster-0 -- redis-cli cluster info # 验证集群部署 namespace redis-ns kubectl exec -n redis-ns -it redis-cluster-0 -- redis-cli cluster info # 默认namespace for x in $(seq 0 5); do echo "redis-cluster-$x"; kubectl exec redis-cluster-$x -- redis-cli role; echo; done ## 添加 namespace redis-ns for x in $(seq 0 5); do echo "redis-cluster-$x"; kubectl exec -n redis-ns redis-cluster-$x -- redis-cli role; echo; done ``` ## 测试Redis集群 > 我们想使用集群,然后模拟节点的故障。对于前一项任务,我们将部署一个简单的Python应用程序,而对于后者,我们将删除一个节点并观察集群行为。 ### 部署点击计数器应用 > 我们将一个简单的应用程序部署到集群中,并在其前面放置一个负载平衡器。此应用程序的目的是在将计数器值作为HTTP响应返回之前,增加计数器并将其存储在Redis集群中。 ```bash $ kubectl apply -f app-deployment-service.yaml service/hit-counter-lb created deployment.apps/hit-counter-app created # 在此过程中,如果我们继续加载页面,计数器将继续增加,并且在删除Pod之后,我们看到没有数据丢失。 $ curl `kubectl get svc hit-counter-lb -o json|jq -r .spec.clusterIP` I have been hit 20 times since deployment. $ curl `kubectl get svc hit-counter-lb -o json|jq -r .spec.clusterIP` I have been hit 21 times since deployment. $ curl `kubectl get svc hit-counter-lb -o json|jq -r .spec.clusterIP` I have been hit 22 times since deployment. $ kubectl delete pods redis-cluster-0 pod "redis-cluster-0" deleted $ kubectl delete pods redis-cluster-1 pod "redis-cluster-1" deleted $ curl `kubectl get svc hit-counter-lb -o json|jq -r .spec.clusterIP` I have been hit 23 times since deployment. ```