[Workload]: disk-snapshot
还没有人认领这个 Issue。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 35/100
- Issue 类型
- 功能
- 描述清晰度
- 基本清楚
- 活跃度
- 冷清
- 技术栈
- bash, go, kubernetes
调研方向
首先定位现有的 disk 工作负载及其生成入口,然后跟踪其 DataVolume、Secret 和 systemd 服务是如何定义的。在确定 RBAC 和验证设计时,使用 virtwork-snapshot-sidecar.sh、virtwork-disk-snapshot.service 以及快照模板作为行为参考。完成的标志是:可选择的 disk-snapshot 工作负载能够在 fio I/O 期间创建快照、应用保留策略,并记录或验证已配置的快照行为。
由索引模型根据 Issue 内容生成。
描述
Workload Name
disk-snapshot
Workload Description
A variant of the existing disk workload that runs fio against a data disk while a sidecar script periodically triggers CSI VolumeSnapshots, validating I/O consistency and data integrity during snapshot operations. Produces the same sustained mixed I/O signals as the disk workload (IOPS, throughput, latency) plus snapshot-specific signals: snapshot creation latency, snapshot size, and — critically — whether the snapshot captures a crash-consistent or application-consistent state while I/O is actively in flight.
This is the scenario every storage partner dreads and every storage partner must prove works: "What happens when you snapshot a disk that is actively being written to?" The existing disk workload generates fio I/O, and a partner can manually trigger snapshots during a run, but there's no automated, reproducible way to validate snapshot-under-load behavior. This workload makes that test continuous and auditable.
The sidecar script runs inside the VM (not as a Kubernetes controller) and uses kubectl or virtctl to create VolumeSnapshot CRs against the VM's data disk PVC at configurable intervals. After each snapshot, it optionally verifies the snapshot by restoring it to a temporary PVC and running a filesystem check.
Tooling and Packages
I/O workload (identical to existing disk workload):
- Tool:
fiowith mixed random/sequential profiles - RPM packages:
fio - systemd service:
virtwork-disk.service(reused from existingdiskworkload)
Snapshot trigger sidecar:
- Tool:
kubectl(oroc) CLI inside the VM, authenticated via a projected ServiceAccount token - RPM packages:
kubernetes-clientor direct binary download ofkubectl - systemd service:
virtwork-disk-snapshot.service - Command loop:
while true; do kubectl create -f /etc/virtwork/snapshot-template.yaml sleep $SNAPSHOT_INTERVAL done - Configurable parameters:
snapshot-interval: seconds between snapshot triggers (default: 300 — every 5 minutes)snapshot-class: VolumeSnapshotClass name (required — depends on storage backend)snapshot-retain: number of snapshots to retain before deleting oldest (default: 5)snapshot-verify: whether to restore and fsck each snapshot (default: false — expensive)
VM Count Model
Single VM (like cpu, memory, disk)
Required Resources
- Persistent storage (DataVolume)
- Kubernetes Service (for inter-VM communication)
- Kubernetes Secret (for credentials or config)
- Additional CPU/memory beyond defaults
- GPU or special device passthrough
The DataVolume is the same as the existing disk workload — a CDI-provisioned persistent disk for fio. The Secret holds a ServiceAccount token (or kubeconfig) that grants the VM's snapshot sidecar permission to create VolumeSnapshot CRs. Additional RBAC is needed: a ServiceAccount with create/delete/list on volumesnapshots.snapshot.storage.k8s.io in the workload namespace.
Cloud-Init Details
packages:
- fio
write_files:
- path: /etc/virtwork/snapshot-template.yaml
content: |
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
generateName: virtwork-disk-snap-
namespace: <namespace>
labels:
app.kubernetes.io/managed-by: virtwork
virtwork/component: disk-snapshot
spec:
volumeSnapshotClassName: <snapshot-class>
source:
persistentVolumeClaimName: <pvc-name>
- path: /usr/local/bin/virtwork-snapshot-sidecar.sh
permissions: '0755'
content: |
#!/bin/bash
set -euo pipefail
INTERVAL="${SNAPSHOT_INTERVAL:-300}"
RETAIN="${SNAPSHOT_RETAIN:-5}"
NAMESPACE="${SNAPSHOT_NAMESPACE:-<namespace>}"
KUBECONFIG="${KUBECONFIG:-/etc/virtwork/kubeconfig}"
export KUBECONFIG
while true; do
TIMESTAMP=$(date +%s)
echo "=== Creating snapshot at $(date -Iseconds) ==="
# Create snapshot
kubectl apply -f /etc/virtwork/snapshot-template.yaml
# Wait for snapshot to be ready
SNAP_NAME=$(kubectl get volumesnapshot -n "$NAMESPACE" \
-l virtwork/component=disk-snapshot \
--sort-by=.metadata.creationTimestamp \
-o jsonpath='{.items[-1].metadata.name}')
kubectl wait volumesnapshot/"$SNAP_NAME" -n "$NAMESPACE" \
--for=jsonpath='{.status.readyToUse}'=true \
--timeout=120s 2>/dev/null && \
echo "Snapshot $SNAP_NAME ready" || \
echo "WARNING: Snapshot $SNAP_NAME not ready within timeout"
# Prune old snapshots beyond retention limit
SNAP_COUNT=$(kubectl get volumesnapshot -n "$NAMESPACE" \
-l virtwork/component=disk-snapshot \
--no-headers 2>/dev/null | wc -l)
if [ "$SNAP_COUNT" -gt "$RETAIN" ]; then
DELETE_COUNT=$((SNAP_COUNT - RETAIN))
kubectl get volumesnapshot -n "$NAMESPACE" \
-l virtwork/component=disk-snapshot \
--sort-by=.metadata.creationTimestamp \
-o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' | \
head -n "$DELETE_COUNT" | \
xargs -I{} kubectl delete volumesnapshot/{} -n "$NAMESPACE"
echo "Pruned $DELETE_COUNT old snapshots"
fi
sleep "$INTERVAL"
done
- path: /etc/systemd/system/virtwork-disk-snapshot.service
content: |
[Unit]
Description=Virtwork disk snapshot trigger sidecar
After=network-online.target virtwork-disk.service
Wants=virtwork-disk.service
[Service]
Type=simple
Environment=SNAPSHOT_INTERVAL=300
Environment=SNAPSHOT_RETAIN=5
Environment=SNAPSHOT_NAMESPACE=<namespace>
ExecStart=/usr/local/bin/virtwork-snapshot-sidecar.sh
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
runcmd:
- curl -Lo /usr/local/bin/kubectl "https://dl.k8s.io/release/$(curl -sL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
- chmod +x /usr/local/bin/kubectl
- systemctl enable --now virtwork-disk.service
- systemctl enable --now virtwork-disk-snapshot.service
Use Case
- Storage partners (CSI driver vendors — NetApp, Pure Storage, Dell, HPE, Red Hat ODF): The primary audience. Every CSI driver must handle VolumeSnapshot correctly while I/O is in flight. The critical questions: Does the snapshot complete without errors? Does it capture a consistent state? Does fio I/O latency spike during the snapshot? Does the snapshot size grow linearly with data written? This workload answers all four continuously and automatically.
- Backup/DR partners (Velero, Trilio, Kasten): These products use CSI VolumeSnapshots as the backup primitive. They need to validate that snapshot-based backups taken during active I/O are restorable and consistent. The
--snapshot-verifyoption (restore + fsck) provides the restore validation that backup products depend on. - Data protection / CDP partners (Zerto, Portworx): Continuous data protection products need to understand snapshot overhead and I/O impact at various snapshot frequencies. Tuning
snapshot-intervalfrom 300s down to 30s stresses the CDP pipeline and reveals performance cliffs. - OpenShift platform validation: Validates that the CSI snapshot controller, external-snapshotter, and the storage backend work correctly together under sustained I/O from a KubeVirt VM — a less commonly tested path than pod-based snapshots.
Additional Context
- Relationship to existing
diskworkload: This workload is a superset ofdisk. The fio configuration is identical — the same systemd service, same I/O profiles, same data disk setup. The snapshot sidecar is an additional systemd service that runs alongside fio. Implementation options:- New workload type (
disk-snapshot): cleaner separation, explicit opt-in. - Flag on existing
diskworkload (--enable-snapshots): less code duplication, but muddies the single-responsibility of thediskworkload.
Option 1 is recommended — it follows the existing pattern where each workload type is a distinct, self-contained unit.
- New workload type (
- RBAC requirements: The snapshot sidecar needs a ServiceAccount with permissions to manage VolumeSnapshot CRs. This is additional RBAC beyond what virtwork currently creates. The implementation should:
- Create a ServiceAccount in the workload namespace
- Create a Role with
create/delete/get/listonvolumesnapshotsandvolumesnapshotcontents - Create a RoleBinding
- Project the ServiceAccount token into the VM (or generate a kubeconfig Secret)
- VolumeSnapshotClass is required: Unlike other workloads that work with any storage class, this workload requires a VolumeSnapshotClass to be configured on the cluster. The implementation should fail fast with a clear error if
snapshot-classis not specified or doesn't exist. - Snapshot verification (optional): The
--snapshot-verifymode restores each snapshot to a temporary PVC, mounts it (or attaches to a temporary pod), runsfsck, and deletes the temporary PVC. This is expensive (creates an extra PVC per snapshot cycle) but provides the strongest consistency guarantee. Default to off; document as available for thorough validation. - I/O impact measurement: The most valuable metric is fio's latency during the snapshot window vs outside it. fio's
--output-format=jsoncaptures per-second latency data. Partners can correlate latency spikes with snapshot creation timestamps to quantify snapshot overhead. - Composability: This workload pairs with
chaos-disk(snapshot during disk-full conditions) andchaos-network(snapshot when storage network is degraded) for comprehensive storage resilience testing.
- 主要语言
- Go
- 星标
- 0
- 派生
- 0
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
- 提供 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 没有贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
opdev/virtwork 的其他 Issue
-
good first issue needs-triage size/L workload-request workload/variant
难度 5/5 一周以上 新手友好度 45/100
-
needs-triage priority/awaiting-more-evidence size/XL workload-request workload/tier-2
难度 5/5 一周以上 新手友好度 48/100
-
needs-triage size/L workload-request workload/tier-3
难度 4/5 3-5 天 新手友好度 48/100
-
needs-triage size/XXL workload-request workload/tier-3
难度 5/5 一周以上 新手友好度 35/100
-
needs-triage size/XL workload-request workload/tier-3
难度 5/5 一周以上 新手友好度 38/100
相似的 Issue
-
agent-butler-finding chore
难度 1/5 1 小时以内 新手友好度 90/100
jordansmall/spindrift#5575 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 88/100
open-telemetry/opentelemetry-go-compile-instrumentation#1512 ·
维护者通常 3 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
JakeChampion/lang#12684 ·
维护者通常 1 天内回复
-
goose sub-agent runs are never indexed: blame finds no session for any file a `delegate` child wrote未关闭bug
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
C-bug O-community X-blathers-triaged
难度 2/5 1-3 小时 新手友好度 78/100
cockroachdb/cockroach#176150 · 1 条评论 ·
维护者通常 12 天内回复