Kubernetes 环境下 Redis 5.0.3 高可用集群部署实战指南1. 生产级 Redis 集群架构设计在 Kubernetes 中部署有状态服务需要特别考虑数据持久化和网络稳定性问题。Redis 集群作为典型的有状态服务采用 3 主 3 从架构可同时保证数据高可用和读写性能。本方案核心组件包括StatefulSet确保每个 Pod 拥有稳定的网络标识和持久化存储Headless Service为集群内部提供直接的 Pod-to-Pod 通信NFS 持久化存储保障数据安全性和节点故障恢复能力NodePort Service实现集群外部安全访问关键设计考量1. 数据分片16384 个哈希槽均匀分布在 3 个主节点 2. 故障转移从节点自动升级替代故障主节点 3. 网络拓扑每个 Pod 获得固定 DNS 名称redis-app-0.redis-service 4. 存储隔离每个 Pod 独占 PV 防止数据竞争2. 基础环境准备2.1 NFS 存储服务配置持久化存储是 Redis 集群可靠性的基石NFS 服务配置需特别注意生产环境优化# NFS 服务端配置以 CentOS 为例 yum install -y nfs-utils rpcbind mkdir -p /data/nfs/redis echo /data/nfs/redis *(rw,sync,no_subtree_check,no_root_squash) /etc/exports # 生产环境建议配置 cat /etc/sysconfig/nfs EOF RPCNFSDARGS-N 4 -N 5 RPCMOUNTDOPTS--manage-gids -n EOF systemctl enable --now nfs-server rpcbind exportfs -arv性能优化参数对比参数默认值优化值说明rsize/wsize819265536单次读写块大小timeo60030请求超时(0.1秒)retrans35失败重试次数hard/soft-hard持久化挂载方式2.2 Kubernetes 存储类配置创建专用 StorageClass 实现动态 PV 供给apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: redis-nfs-sc provisioner: example.com/nfs parameters: archiveOnDelete: false mountOptions: - nolock - tcp - rsize65536 - wsize65536 - timeo30 - retrans5提示生产环境建议为 NFS 配置独立网络隔离和 QoS 保障避免存储性能影响业务3. Redis 集群核心配置3.1 StatefulSet 定义完整 StatefulSet 配置包含以下关键要素apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-app namespace: redis-cluster spec: serviceName: redis-headless-service replicas: 6 podManagementPolicy: Parallel # 加速集群启动 updateStrategy: type: RollingUpdate rollingUpdate: partition: 0 selector: matchLabels: app: redis-cluster-app template: metadata: labels: app: redis-cluster-app spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: [redis-cluster-app] topologyKey: kubernetes.io/hostname containers: - name: redis image: redis:5.0.3-alpine resources: requests: cpu: 500m memory: 1Gi limits: memory: 2Gi command: [redis-server] args: [/etc/redis/redis.conf, --protected-mode, no] ports: - containerPort: 6379 name: client - containerPort: 16379 name: gossip volumeMounts: - name: redis-conf mountPath: /etc/redis - name: redis-data mountPath: /data livenessProbe: exec: command: [redis-cli, ping] initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: [redis-cli, ping] initialDelaySeconds: 5 periodSeconds: 5 volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: [ ReadWriteOnce ] storageClassName: redis-nfs-sc resources: requests: storage: 10Gi关键配置解析Pod 反亲和性确保 Redis 实例分散在不同节点资源限制防止内存溢出导致节点故障健康检查结合 liveness 和 readiness 保障服务连续性并行启动podManagementPolicy 加速集群初始化3.2 网络服务配置Headless Service 定义apiVersion: v1 kind: Service metadata: name: redis-headless-service namespace: redis-cluster spec: clusterIP: None ports: - port: 6379 name: client - port: 16379 name: gossip selector: app: redis-cluster-app外部访问 ServiceNodePort 方式apiVersion: v1 kind: Service metadata: name: redis-external-service namespace: redis-cluster spec: type: NodePort ports: - port: 6379 targetPort: 6379 nodePort: 32679 selector: app: redis-cluster-app注意生产环境建议配合 NetworkPolicy 限制访问源 IP 范围4. 集群初始化与运维4.1 集群引导流程# 获取所有 Pod IP REDIS_NODES$(kubectl get pods -n redis-cluster -l appredis-cluster-app -o jsonpath{range.items[*]}{.status.podIP}:6379 ) # 执行集群创建命令 kubectl exec -n redis-cluster redis-app-0 -- \ redis-cli --cluster create --cluster-replicas 1 ${REDIS_NODES} # 验证集群状态 kubectl exec -n redis-cluster redis-app-0 -- redis-cli cluster nodes预期输出示例e6b6538a... 10.244.1.23:637916379 master - 0 1620000000000 3 connected 10923-16383 a1b2c3d4... 10.244.1.24:637916379 slave e6b6538a... 0 1620000001000 3 connected ...4.2 日常运维操作集群扩容操作# 扩展 StatefulSet 副本数 kubectl scale statefulset redis-app -n redis-cluster --replicas8 # 添加新节点到集群 NEW_NODES$(kubectl get pods -n redis-cluster -l appredis-cluster-app -o jsonpath{range.items[6:8]}{.status.podIP}:6379 ) kubectl exec -n redis-cluster redis-app-0 -- redis-cli --cluster add-node ${NEW_NODES}数据备份方案# 创建持久化快照 kubectl exec -n redis-cluster redis-app-0 -- redis-cli save # NFS 存储自动备份脚本 */30 * * * * rsync -avz /data/nfs/redis/ backup-server:/redis-backup/$(date \%Y\%m\%d-\%H\%M)5. 性能调优与监控5.1 Redis 关键参数优化redis.conf 核心配置# 内存管理 maxmemory 2gb maxmemory-policy allkeys-lru # 持久化优化 appendfsync everysec auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 集群参数 cluster-node-timeout 15000 cluster-slave-validity-factor 105.2 Prometheus 监控配置Redis Exporter 部署示例apiVersion: apps/v1 kind: Deployment metadata: name: redis-exporter namespace: redis-cluster spec: replicas: 1 selector: matchLabels: app: redis-exporter template: metadata: labels: app: redis-exporter annotations: prometheus.io/scrape: true prometheus.io/port: 9121 spec: containers: - name: redis-exporter image: oliver006/redis_exporter:v1.45.0 args: - --redis.addrredis-headless-service.redis-cluster.svc.cluster.local:6379 - --redis.password${REDIS_PASSWORD} ports: - containerPort: 9121关键监控指标指标名称告警阈值说明redis_up1服务可用性redis_memory_used_bytes90% maxmemory内存使用率redis_connected_clients5000客户端连接数redis_latency_msp99 200请求延迟6. 故障排查指南常见问题处理流程Pod 启动失败kubectl describe pod -n redis-cluster redis-app-0 kubectl logs -n redis-cluster redis-app-0集群状态异常kubectl exec -n redis-cluster redis-app-0 -- redis-cli cluster info kubectl exec -n redis-cluster redis-app-0 -- redis-cli --cluster check 127.0.0.1:6379网络连接问题kubectl run -it --rm debug-tool --imagenicolaka/netshoot \ --restartNever -- bash # 在调试容器中测试 dig redis-headless-service.redis-cluster.svc.cluster.local telnet redis-app-0.redis-headless-service 6379性能问题检查清单NFS 服务器 IO 负载iostat -x 1节点网络带宽iftop -i eth0Redis 慢查询slowlog get 10内存碎片率info memory