一、问题分析
本质上来说,在 k8s 上部署一个 redis 集群和部署一个普通应用没有什么太大的区别,但需要注意下面几个问题:
-
Redis 是一个有状态应用
这是部署 redis 集群时我们最需要注意的问题,当我们把 redis 以 pod 的形式部署在 k8s 中时,每个 pod 里缓存的数据都是不一样的,而且 pod 的 IP 是会随时变化,这时候如果使用普通的 deployment 和 service 来部署 redis-cluster 就会出现很多问题,因此需要改用 StatefulSet + Headless Service 来解决
-
数据持久化
redis 虽然是基于内存的缓存,但还是需要依赖于磁盘进行数据的持久化,以便服务出现问题重启时可以恢复已经缓存的数据。在集群中,我们需要使用共享文件系统 + PV(持久卷)的方式来让整个集群中的所有 pod 都可以共享同一份持久化储存
二、概念介绍
在开始之前先来详细介绍一下几个概念和原理。
1、Headless Service
简单的说,Headless Service 就是没有指定 Cluster IP 的 Service,相应的,在 k8s 的 dns 映射里,Headless Service 的解析结果不是一个 Cluster IP,而是它所关联的所有 Pod 的 IP 列表
2、StatefulSet
StatefulSet
是 k8s 中专门用于解决有状态应用部署的一种资源,总的来说可以认为它是Deployment/RC
的一个变种,它有以下几个特性:
-
StatefulSet 管理的每个 Pod 都有唯一的文档/网络标识,并且按照数字规律生成,而不是像 Deployment 中那样名称和 IP 都是随机的(比如 StatefulSet 名字为 redis,那么 pod 名就是 redis-0, redis-1 ...)
-
StatefulSet 中 ReplicaSet 的启停顺序是严格受控的,操作第 N 个 pod 一定要等前 N-1 个执行完才可以
-
StatefulSet 中的 Pod 采用稳定的持久化储存,并且对应的 PV 不会随着 Pod 的删除而被销毁
另外需要说明的是,StatefulSet 必须要配合 Headless Service 使用,它会在 Headless Service 提供的 DNS 映射上再加一层,最终形成精确到每个 pod 的域名映射,格式如下:
$(podname).$(headless service name)
复制代码
有了这个映射,就可以在配置集群时使用域名替代 IP,实现有状态应用集群的管理
三、方案
借助 StatefulSet 和 Headless Service,集群的部署方案设计如下(图片来自参考文章):
配置步骤大概罗列如下:文章来源:https://www.toymoban.com/news/detail-722351.html
-
配置共享文件系统 NFS文章来源地址https://www.toymoban.com/news/detail-722351.html
到了这里,关于Kubernetes 构建 Redis 集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!