Kubernetes Redis 部署与运维最佳实践
本文档详细介绍了在 Kubernetes 1.26.14 环境中部署 Redis 的完整解决方案,包括单实例、集群和哨兵三种部署模式。主要内容涵盖: 单实例部署:使用 StatefulSet 和 NFS 持久化存储,配置密码保护和数据持久化 集群部署:6节点(3主3从)集群配置,包含集群初始化命令 哨兵模式:1主2从架构的高可用方案 存储配置:使用动态 PVC 和 StorageClass 服务暴
·
Kubernetes 1.26.14 中部署 Redis 最佳实践
文档概述
本文档详细介绍了在 Kubernetes 1.26.14 环境中部署 Redis 的完整解决方案,包括:
- Redis 单实例部署(StatefulSet 模式)
- Redis 集群部署(6节点3主3从)
- Redis 哨兵模式部署(高可用方案)
- NFS 持久化存储配置
- 生产环境监控与告警
- 数据备份与恢复策略
- 性能优化建议
关注公众号 键盘下的小宇宙 并回复关键字 “视频资料”,即可获取我们整理的 Kubernetes、Docker 容器、Python 编程、Linux 运维等教学视频合集(总计 548GB)。本资源仅面向学习交流使用,请遵守版权和使用规范,严禁商用、转售或违规传播。
前提条件
- Kubernetes 集群已搭建完成(版本 1.26.14)
- 后端存储可以访问
- kubectl 命令行工具已配置
一、部署Redis单实例(StatefulSet模式)
2. 创建配置文件 redis-statefulset.yaml
# 密码Secret
apiVersion: v1
kind: Secret
metadata:
name: redis-secret
type: Opaque
data:
password: eW91cl9zZWN1cmVfcGFzc3dvcmQ= # base64编码密码 (执行 echo -n "your_secure_password" | base64 生成)
---
# StatefulSet定义
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis-headless
replicas: 1 # 单实例
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0.12
command: ["sh", "-c", "redis-server --requirepass $REDIS_PASSWORD --appendonly yes --dir /data"]
ports:
- containerPort: 6379
volumeMounts:
- name: data
mountPath: /data
env:
- name: REDIS_PASSWORD # 从Secret注入密码
valueFrom:
secretKeyRef:
name: redis-secret
key: password
volumeClaimTemplates: # 动态PVC
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-redis" # 需提前创建NFS StorageClass
resources:
requests:
storage: 5Gi
---
# Headless Service(内部DNS)
apiVersion: v1
kind: Service
metadata:
name: redis-headless
spec:
clusterIP: None
selector:
app: redis
ports:
- port: 6379
name: redis
---
# NodePort Service(外部访问)
apiVersion: v1
kind: Service
metadata:
name: redis-external
spec:
type: NodePort
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
nodePort: 31000 # 自定义端口范围30000-32767
3. 部署资源
kubectl apply -f redis-statefulset.yaml
二、部署Redis集群(6节点3主3从)
1. 创建集群配置文件 redis-cluster.yaml
# 密码Secret
apiVersion: v1
kind: Secret
metadata:
name: redis-secret
type: Opaque
data:
password: eW91cl9zZWN1cmVfcGFzc3dvcmQ= # base64编码密码
---
# StatefulSet定义
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis-headless
replicas: 6 # 6节点集群
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0.12
command: ["sh", "-c", "redis-server --requirepass $REDIS_PASSWORD --appendonly yes --dir /data --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000"]
ports:
- containerPort: 6379
- containerPort: 16379 # 集群总线端口
volumeMounts:
- name: data
mountPath: /data
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-redis"
resources:
requests:
storage: 10Gi # 集群模式增加存储容量
---
# Headless Service
apiVersion: v1
kind: Service
metadata:
name: redis-headless
spec:
clusterIP: None
selector:
app: redis
ports:
- port: 6379
name: redis
- port: 16379
name: cluster-bus
---
# NodePort Service
apiVersion: v1
kind: Service
metadata:
name: redis-external
spec:
type: NodePort
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
nodePort: 31000
2. 部署集群资源
kubectl apply -f redis-cluster.yaml
# 等待所有Pod就绪
kubectl wait pods -l app=redis --for=condition=ready --timeout=5m
3. 初始化集群
# 获取所有Redis Pod IP
REDIS_POD_IPS=$(kubectl get pods -l app=redis -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
# 进入第一个Pod执行集群初始化
kubectl exec -it redis-0 -- redis-cli -a your_password \
--cluster create \
$REDIS_POD_IPS \
--cluster-replicas 1
# 确认集群状态
kubectl exec -it redis-0 -- redis-cli -a your_password cluster info
三、Redis哨兵模式部署(高可用方案)
1. 创建哨兵配置文件 redis-sentinel.yaml
# 主从Redis部署(1主2从)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-master-slave
spec:
serviceName: redis-master-slave
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0.12
command: ["sh", "-c", "if [ $HOSTNAME = 'redis-master-slave-0' ]; then redis-server --requirepass $REDIS_PASSWORD --masterauth $REDIS_PASSWORD --appendonly yes --dir /data; else redis-server --requirepass $REDIS_PASSWORD --masterauth $REDIS_PASSWORD --slaveof redis-master-slave-0.redis-master-slave 6379 --appendonly yes --dir /data; fi"]
ports:
- containerPort: 6379
volumeMounts:
- name: data
mountPath: /data
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-redis"
resources:
requests:
storage: 5Gi
---
# Redis主从服务
apiVersion: v1
kind: Service
metadata:
name: redis-master-slave
spec:
clusterIP: None
selector:
app: redis
ports:
- port: 6379
name: redis
---
# 哨兵StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-sentinel
spec:
serviceName: redis-sentinel
replicas: 3
selector:
matchLabels:
app: redis-sentinel
template:
metadata:
labels:
app: redis-sentinel
spec:
containers:
- name: sentinel
image: redis:7.0.12
command: ["sh", "-c", "redis-sentinel --sentinel monitor mymaster redis-master-slave-0.redis-master-slave 6379 2 --sentinel auth-pass mymaster $REDIS_PASSWORD --sentinel down-after-milliseconds mymaster 5000 --sentinel failover-timeout mymaster 60000 --sentinel parallel-syncs mymaster 1"]
ports:
- containerPort: 26379
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
---
# 哨兵服务
apiVersion: v1
kind: Service
metadata:
name: redis-sentinel
spec:
clusterIP: None
selector:
app: redis-sentinel
ports:
- port: 26379
name: sentinel
2. 部署哨兵模式
# 部署主从和哨兵
kubectl apply -f redis-sentinel.yaml
# 等待所有Pod就绪
kubectl wait pods -l app=redis --for=condition=ready --timeout=5m
kubectl wait pods -l app=redis-sentinel --for=condition=ready --timeout=5m
# 检查哨兵状态
kubectl exec -it redis-sentinel-0 -- redis-cli -p 26379 sentinel master mymaster
四、关键配置说明
1. 持久化存储
- 使用NFS动态供给(需提前部署StorageClass)
volumeClaimTemplates自动创建PVC,数据目录/data持久化
2. 安全认证
- 通过Secret管理密码,避免明文暴露
requirepass配置强制认证访问
3. 服务暴露
- Headless Service提供内部DNS解析(
redis-0.redis-headless) - NodePort Service允许外部通过节点IP:31000访问
4. 高可用方案
- 集群模式:适用于大规模数据存储和读写分离
- 哨兵模式:适用于需要自动故障转移的高可用场景
- 生产环境推荐:哨兵模式 + 主从复制
五、验证部署
1. 检查部署状态
# 检查资源状态
kubectl get statefulset,pvc,svc -l app=redis
# 测试单实例连接
kubectl exec -it redis-0 -- redis-cli -a your_password ping
# 查看集群状态(集群模式)
kubectl exec -it redis-0 -- redis-cli -a your_password cluster nodes
# 查看哨兵状态(哨兵模式)
kubectl exec -it redis-sentinel-0 -- redis-cli -p 26379 sentinel master mymaster
六、生产环境监控与告警
1. 部署Prometheus Redis Exporter
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-exporter
spec:
replicas: 1
selector:
matchLabels:
app: redis-exporter
template:
metadata:
labels:
app: redis-exporter
spec:
containers:
- name: redis-exporter
image: oliver006/redis_exporter:v1.48.0
args:
- --redis.addr=redis-master-slave-0.redis-master-slave:6379
- --redis.password=$(REDIS_PASSWORD)
ports:
- containerPort: 9121
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
---
apiVersion: v1
kind: Service
metadata:
name: redis-exporter
spec:
selector:
app: redis-exporter
ports:
- port: 9121
targetPort: 9121
2. 配置Prometheus监控
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: redis-monitor
namespace: monitoring
spec:
selector:
matchLabels:
app: redis-exporter
endpoints:
- port: 9121
interval: 15s
3. 配置Grafana仪表盘
导入Redis仪表盘(ID: 763):
- 访问Grafana UI → 仪表盘 → 导入
- 输入仪表盘ID: 763
- 选择Prometheus数据源
4. 配置告警规则
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: redis-alerts
namespace: monitoring
spec:
groups:
- name: redis
rules:
- alert: RedisDown
expr: redis_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Redis实例宕机"
description: "Redis实例 {{ $labels.instance }} 已宕机超过5分钟"
- alert: RedisMemoryUsageHigh
expr: redis_memory_used_bytes / redis_memory_max_bytes * 100 > 80
for: 10m
labels:
severity: warning
annotations:
summary: "Redis内存使用过高"
description: "Redis实例 {{ $labels.instance }} 内存使用率超过80%"
- alert: RedisReplicationBroken
expr: redis_replication_master_link_status{job="redis"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Redis复制中断"
description: "Redis从节点 {{ $labels.instance }} 与主节点复制连接中断"
七、数据备份与恢复
1. 定期备份策略
创建备份CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: redis-backup
spec:
schedule: "0 0 * * *" # 每天凌晨执行
jobTemplate:
spec:
template:
spec:
containers:
- name: redis-backup
image: redis:7.0.12
command:
- /bin/sh
- -c
- |
redis-cli -h redis-master-slave-0.redis-master-slave -a $REDIS_PASSWORD bgsave
sleep 60
redis-cli -h redis-master-slave-0.redis-master-slave -a $REDIS_PASSWORD lastsave
# 复制备份文件到持久存储
cp /data/dump.rdb /backup/redis-$(date +%Y%m%d).rdb
volumeMounts:
- name: backup
mountPath: /backup
- name: redis-data
mountPath: /data
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
restartPolicy: OnFailure
volumes:
- name: backup
persistentVolumeClaim:
claimName: redis-backup-pvc
- name: redis-data
persistentVolumeClaim:
claimName: data-redis-master-slave-0
2. 备份存储配置
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-backup-pvc
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-redis"
resources:
requests:
storage: 100Gi
3. 数据恢复方法
从备份恢复:
# 停止Redis实例
kubectl scale statefulset redis-master-slave --replicas=0
# 复制备份文件到数据目录
kubectl cp /path/to/backup/dump.rdb redis-master-slave-0:/data/
# 重启Redis实例
kubectl scale statefulset redis-master-slave --replicas=3
# 验证数据
kubectl exec -it redis-master-slave-0 -- redis-cli -a your_password KEYS *
4. 灾难恢复演练
定期执行恢复演练:
- 选择非高峰时段
- 创建临时Redis实例
- 从备份恢复数据
- 验证数据完整性
- 清理临时资源
八、生产环境性能优化
1. 内存优化
配置合理的内存限制:
# 在StatefulSet中添加资源限制
resources:
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
Redis内存配置:
# 添加到Redis启动命令
--maxmemory 3gb --maxmemory-policy allkeys-lru
2. 持久化优化
调整AOF策略:
# 添加到Redis启动命令
--appendfsync everysec --no-appendfsync-on-rewrite yes
RDB快照策略:
# 添加到Redis启动命令
--save 900 1 --save 300 10 --save 60 10000
3. 网络优化
调整TCP参数:
# 在StatefulSet中添加
securityContext:
sysctls:
- name: net.core.somaxconn
value: "65535"
- name: net.ipv4.tcp_max_syn_backlog
value: "65535"
4. 集群优化
调整集群参数:
# 添加到Redis启动命令
--cluster-node-timeout 15000 --cluster-slave-validity-factor 10
读写分离配置:
- 主节点:处理写操作
- 从节点:处理读操作
- 使用Redis Sentinel进行自动故障转移
5. 应用层优化
连接池配置:
- 使用连接池管理Redis连接
- 合理设置最大连接数
- 实现连接超时和重试机制
命令优化:
- 避免使用KEYS命令
- 使用SCAN命令替代
- 批量操作使用MSET/MGET
- 复杂查询使用Pipeline
6. 监控与调优
定期性能分析:
- 使用
redis-cli --latency-history分析延迟 - 使用
redis-cli --bigkeys查找大键 - 监控
redis_memory_used_bytes和redis_memory_rss_bytes - 观察
redis_keyspace_hits_total和redis_keyspace_misses_total
调优建议:
- 根据业务场景选择合适的内存淘汰策略
- 对于写入密集型应用,调整AOF策略
- 对于读密集型应用,增加从节点数量
关注微信公众号 Linux容器运维 并回复关键字 “视频资料”,即可获取我们整理的 Kubernetes、Docker 容器、Python 编程、Linux 运维等教学视频合集(总计 548GB)。本资源仅面向学习交流使用,请遵守版权和使用规范,严禁商用、转售或违规传播。
更多推荐

所有评论(0)