You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:10:13