Kubernetes中定期创建PVC快照并保留最新2份的实现方法
解决CronJob定期创建VolumeSnapshot并保留最新2份的问题
问题描述
我编写了一个CronJob来定期为我的PVC创建VolumeSnapshot,相关配置文件如下:
CronJob配置文件
kind: CronJob metadata: name: mycronjob spec: schedule: "*/2 * * * *" # 每2分钟执行一次任务 jobTemplate: spec: template: spec: containers: - name: webserver-container image: kubectl:latest command: - /bin/sh - -c - /app/script.sh volumeMounts: - name: script-volume mountPath: /app restartPolicy: OnFailure volumes: - name: script-volume configMap: name: script-configmap
VolumeSnapshot模板文件
kind: VolumeSnapshot metadata: name: snap-shot-test spec: volumeSnapshotClassName: csi-snapclass source: persistentVolumeClaimName: my-test-apps
执行脚本
#!/bin/bash kubectl apply -f volumesnapshot.yml
首次执行CronJob成功,但后续执行时提示volumesnapshot.snapshot.storage.k8s.io/snap-shot-test unchanged,需要实现定期创建PVC的VolumeSnapshot并保留最新2份快照。
解决方案
1. 核心问题分析
重复使用同一个快照名称时,Kubernetes会判定资源已存在,不会创建新快照。必须给每个快照生成唯一名称(比如添加时间戳),同时自动清理超出保留数量的旧快照。
2. 修改执行脚本
更新脚本,动态生成带时间戳的快照配置,创建新快照后自动清理旧快照,只保留最新2份:
#!/bin/bash # 配置参数 SNAPSHOT_PREFIX="snap-shot-test" PVC_NAME="my-test-apps" SNAPCLASS_NAME="csi-snapclass" RETAIN_COUNT=2 # 保留最新快照数量 # 生成带时间戳的唯一快照名称 SNAPSHOT_NAME="${SNAPSHOT_PREFIX}-$(date +%Y%m%d%H%M%S)" # 动态创建VolumeSnapshot cat <<EOF | kubectl apply -f - kind: VolumeSnapshot metadata: name: ${SNAPSHOT_NAME} spec: volumeSnapshotClassName: ${SNAPCLASS_NAME} source: persistentVolumeClaimName: ${PVC_NAME} EOF # 清理旧快照:按创建时间倒序排序,删除超出保留数量的快照 kubectl get volumesnapshot -o name | grep ${SNAPSHOT_PREFIX} | sort -r | tail -n +$((RETAIN_COUNT + 1)) | xargs -r kubectl delete
3. 更新ConfigMap
将修改后的脚本同步到script-configmap中:
# 假设脚本文件名为script.sh kubectl create configmap script-configmap --from-file=script.sh --dry-run=client -o yaml | kubectl apply -f -
4. 验证效果
等待CronJob执行新任务后,可通过以下命令检查快照状态:
# 查看所有快照,确认是否生成带时间戳的新快照 kubectl get volumesnapshot
内容的提问来源于stack exchange,提问作者Varshney P.
相关产品推荐
相关产品推荐

