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. 灾难恢复演练

定期执行恢复演练

  1. 选择非高峰时段
  2. 创建临时Redis实例
  3. 从备份恢复数据
  4. 验证数据完整性
  5. 清理临时资源

八、生产环境性能优化

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. 监控与调优

定期性能分析

  1. 使用redis-cli --latency-history分析延迟
  2. 使用redis-cli --bigkeys查找大键
  3. 监控redis_memory_used_bytesredis_memory_rss_bytes
  4. 观察redis_keyspace_hits_totalredis_keyspace_misses_total

调优建议

  • 根据业务场景选择合适的内存淘汰策略
  • 对于写入密集型应用,调整AOF策略
  • 对于读密集型应用,增加从节点数量

关注微信公众号 Linux容器运维 并回复关键字 “视频资料”,即可获取我们整理的 Kubernetes、Docker 容器、Python 编程、Linux 运维等教学视频合集(总计 548GB)。本资源仅面向学习交流使用,请遵守版权和使用规范,严禁商用、转售或违规传播。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐