Redis持久化-k8s

Redis持久化-k8s

概要

  • 由于Redis在K8s上跑,随着容器重启或重建Redis的数据也会销毁,所以需要持久化配置把重建前的数据保存,随容器重启或重建自动导入新创建的容器中,本文采用Redis的混合模式作为持久化配置。

k8s-KubeSphere

k8s-configMap

  • 创建k8s的配置字典(redis-conf),设置Redis的配置文件的持久化参数,开启混合模式作为持久化。
kind: ConfigMap
apiVersion: v1
metadata:
  name: redis-conf
  namespace: yyds-sys
data:
  redis.conf: |-
    ##配置示例
    port 6379
    bind 0.0.0.0
    requirepass yyds-2025
    ## 启用 AOF 持久化
    appendonly yes
    ## 启用混合持久化 (Redis 4.0+)
    aof-use-rdb-preamble yes
    ## AOF 同步策略
    appendfsync everysec
    appendfilename "appendonly.aof"
    ## RDB 触发规则
    save 900 1
    save 300 10
    save 60 10000
    ## 持久化文件存储目录
    dir /data
    dbfilename dump.rdb
    ## AOF 重写配置
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb

k8s-pv

  • 创建k8s的持久卷(redis-data-pv),用于保存Redis持久化的数据
kind: PersistentVolume
apiVersion: v1
metadata:
  name: redis-data-pv
  finalizers:
    - kubernetes.io/pv-protection
spec:
  capacity:
    storage: 20Gi
  hostPath:
    path: /data/redis-data/
    type: DirectoryOrCreate
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: redis
  volumeMode: Filesystem

k8s-pvc

  • 创建k8s的持久卷声明(redis-data-pvc),用于挂载在Redis的pod中
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: redis-data-pvc
  namespace: yyds-sys
  annotations:
    pv.kubernetes.io/bind-completed: 'yes'
    pv.kubernetes.io/bound-by-controller: 'yes'
    volume.beta.kubernetes.io/storage-provisioner: disk.csi.qingcloud.com
    volume.kubernetes.io/selected-node: node2
    volume.kubernetes.io/storage-provisioner: disk.csi.qingcloud.com
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  volumeName: redis-data-pv
  storageClassName: redis-data-pv
  volumeMode: Filesystem

k8s-pod

  • 修改Redis的pod,配置挂载持久化的数据
kind: Deployment
apiVersion: apps/v1
metadata:
  name: sys-redis
  namespace: yyds-sys
  labels:
    app: sys-redis
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sys-redis
      version: v1
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: sys-redis
        version: v1
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
        - name: volume-jvv272
          configMap:
            name: redis-conf
            defaultMode: 420
        - name: redis-data
          persistentVolumeClaim:
            claimName: redis-data-pvc
      containers:
        - name: sys-redis
          image: 'docker.1ms.run/redis:alpine'
          command:
            - redis-server
          args:
            - /etc/redis/redis.conf
          ports:
            - name: tcp-sys-redis
              containerPort: 6379
              protocol: TCP
          resources:
            limits:
              cpu: '2'
              memory: 4000Mi
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
            - name: volume-j2227q
              readOnly: true
              mountPath: /etc/redis
            - name: redis-data
              mountPath: /data
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

检验持久化

# 1)进入Redis容器中、连上Redis
redis-cli -a yourpassword -h 127.0.0.1 -p 6379
# 2) 查看数据大小
keys *
dbsize
# 3) 检查Redis的数据文件是否已经创建
# 4)删除k8s中的pod
# 5) 在k8s中重新创建Redis的pod,看是否会自动导入删除前的数据
posted @ 2025-10-10 13:41  Soul-Q  阅读(2)  评论(0)    收藏  举报