kubernetes 部署redis cluster
前言
Redis cluster的集群关系的维系,并非是依赖于ip的,而是依赖于cluster内部的唯一id, ip只在首次建立集群关系时连接彼此使用,不作为成员连接凭据,取而代之的是id。画外音:只要持有id,容器重启ip怎么变化都不会影响到维系redis cluster的成员关系。
那么id怎么保存的呢?redis cluster在建立起来后,每个主备节点都会保存一份cluster节点的元数据文件,因此,为了保证在kubernetes内pod重启后,集群相关的角色配置等不丢失,此文件必须持久化,因此,适合使用statefulSet来部署。
部署
直接贴部署的yaml文件:
1 | apiVersion: v1 |
部署说明:
- redis配置文件使用configmap挂载
- 共配置6个节点,3主3从,这也是官方文档中说的推荐最小的集群规模了。
- redis cluster node元数据文件很重要,下面会有详细说明。这个文件必须要做持久化,可使用pvc/hostPath等方式。
- 使用redis-trib工具建立cluster,建立好cluster后,后续cluster关系维护不再需要它。
- 网上有不少其他文章中都部署了2个service,包含一个headless service,建cluster时用作服务发现;和一个正常的service,给客户端连接使用。但这个headless service其实根本没有必要,建cluster的时候手动取一次pod ip就好,何必多建一个无用的service
假设你的持久化没有问题,那么,你现在应该有6个运行正常的pod了:
1 | [root@008019 redis-cluster]# kubectl get pods -o wide --all-namespaces | grep app-rds-cluster |
建立集群
因此建立集群的操作只需要执行一次,后续集群关系redis节点之间会基于节点元数据文件自动维护,所以,专门部署一个环境,用来初始化配置集群,部署文件如下:
1 | apiVersion: extensions/v1beta1 |
1 | [root@008019 redis-cluster]# kubectl get pods -o wide --all-namespaces | grep redis-cluster-manager |
安装集群配置工具:
1 | cat >> /etc/yum.repos.d/epel.repo<<'EOF' |
初始化集群:
1 | # 拿到上面获取到的pod ip,执行命令,交互步骤输入yes,不出意外,集群初始化成功 |
连接
选择其中一个
1 | [root@008019 redis-cluster]# kubectl exec -it redis-cluster-manager-5468b99f7f-lxpw7 bash |
使用service 固定ip连接:
1 | [root@008019 ~]# kubectl get service --all-namespaces | grep app-rds-cluster |
主备切换
作为一个高可用集群,主备切换是基本能力,看一看切换过程发生了什么:
1 | # 重启一个master |
有兴趣可以同时删除多个节点试试,6节点,3个为主,按照raft的算法,外加主挂了之后还有备接替上,因此,除非2主+2备或更多节点同时挂掉,不然不会影响redis的服务。