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
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,看是否会自动导入删除前的数据