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,看是否會自動導入刪除前的數據