Kubernetes 上部署 Redis 集群用 StatefulSet 要怎么配置?

文章导读
在 Kubernetes 上部署 Redis 集群推荐使用 StatefulSet 配合 Headless Service,适用于需要稳定网络标识和持久化存储的生产环境。配置核心在于确保每个 Pod 拥有独立 PVC 和固定 DNS 名称,风险边界在于存储类动态供给能力和网络策略配置。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 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: redis

3. 部署 StatefulSet
配置serviceName指向 Headless Service,设置volumeClaimTemplates申请持久卷。副本数建议设为 3 的倍数以匹配主从架构。配置示例:

Kubernetes 上部署 Redis 集群用 StatefulSet 要怎么配置?
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: 5Gi

4. 初始化集群
待 Pod 全部就绪后,进入任意 Pod 执行集群创建命令,分配 16384 个哈希槽。若配置密码,需在命令中附加-a参数。

怎么验证是否生效

检查 Pod 状态是否为Running且重启次数为 0。查看 PVC 是否处于Bound状态。进入 Pod 执行redis-cli cluster info,确认cluster_stateok且槽位分配无空缺。

常见坑

  • 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 集群的完整流程与避坑指南