在 Kubernetes 上部署 Redis 集群推荐使用 StatefulSet 配合 Headless Service,适用于需要稳定网络标识和持久化存储的生产环境。配置核心在于确保每个 Pod 拥有独立 PVC 和固定 DNS 名称,风险边界在于存储类动态供给能力和网络策略配置。
先说结论:StatefulSet 是管理 Redis 集群状态的标准控制器,能保障故障恢复后数据与网络身份一致。
- 适合:高可用架构、数据持久化要求高的场景
- 先准备:可用的 StorageClass 和 Headless Service 配置
- 验收:Pod 状态 Running 且集群槽位分配完整
命令速用版
# 应用配置
kubectl apply -f redis-statefulset.yaml
# 检查 Pod 和 PVC
kubectl get pods -l app=redis
kubectl get pvc -l app=redis
# 验证集群状态
kubectl exec redis-cluster-0 -- redis-cli `--cluster` check 127.0.0.1:6379为什么会这样
StatefulSet 为每个 Pod 提供稳定的网络标识和持久化存储,满足 Redis Cluster 协议需求。Redis 集群依赖节点间固定的主机名进行 Gossip 通信和槽位分配,Deployment 的随机 Pod 名称会导致集群无法发现节点或数据丢失。StatefulSet 的有序部署机制也避免了并发启动引发的数据竞争问题。
分步处理
1. 准备存储类
确认集群中存在支持动态供给的 StorageClass,如 NFS 或云厂商块存储。执行kubectl get storageclass查看默认存储类,若无需手动创建。
2. 创建 Headless Service
定义clusterIP: None的 Service,为 StatefulSet 提供稳定 DNS。配置示例:
apiVersion: v1
kind: Service
metadata:
name: redis-cluster
spec:
clusterIP: None
ports:
- port: 6379
selector:
app: redis3. 部署 StatefulSet
配置serviceName指向 Headless Service,设置volumeClaimTemplates申请持久卷。副本数建议设为 3 的倍数以匹配主从架构。配置示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cluster
spec:
serviceName: redis-cluster
replicas: 6
template:
spec:
containers:
- name: redis
image: redis:7.0
command: ["redis-server", "`--cluster-enabled`", "yes"]
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: standard
resources:
requests:
storage: 5Gi4. 初始化集群
待 Pod 全部就绪后,进入任意 Pod 执行集群创建命令,分配 16384 个哈希槽。若配置密码,需在命令中附加-a参数。
怎么验证是否生效
检查 Pod 状态是否为Running且重启次数为 0。查看 PVC 是否处于Bound状态。进入 Pod 执行redis-cli cluster info,确认cluster_state为ok且槽位分配无空缺。
常见坑
- Headless Service 缺失:若 Service 未设置
clusterIP: None,Pod 无法获得固定 DNS 名称,集群发现失败。 - 存储类配置错误:若 StorageClass 不支持动态供给,PVC 将一直 Pending,Pod 无法启动。
- 副本数不当:Redis 集群通常建议至少 3 主 3 从,副本数过少可能导致高可用失效。
- 密码认证问题:若启用密码,集群初始化和管理命令均需携带密码,否则连接被拒绝。
常见问题
StatefulSet 和 Deployment 部署 Redis 有什么区别?
StatefulSet 提供稳定网络标识和独立存储,Deployment 则不具备。Redis 集群需要固定节点身份,因此必须用 StatefulSet。
如何扩容 Redis 集群节点?
修改 StatefulSet 的replicas字段增加 Pod 数量,然后执行redis-cli `--cluster` add-node将新节点加入集群并迁移槽位。
数据持久化如何保障?
通过volumeClaimTemplates绑定持久卷,即使 Pod 重建,数据仍保留在 PV 中。建议开启 AOF 或 RDB 持久化配置。
参考来源
- K8S Redis 5.0.3 集群部署:3 主 3 从 StatefulSet + NFS 存储完整配置
- Kubernetes Redis 部署与运维最佳实践
- 在 Kubernetes 上部署高可用 Redis 集群的完整实践指南-CSDN 博客
- 《K8s StatefulSet 实战:部署高可用 Redis 集群》
- KubeSphere 实战:用 StatefulSet 部署 Redis 集群的完整流程与避坑指南