尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Velero Schedule 跳过立即触发备份:skipImmediately 配置设计与源码解析
Velero Schedule 跳过立即触发备份skipImmediately 配置设计与源码解析【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero在 Velero 的定时备份Schedule场景中存在一个长期困扰用户的默认行为新创建的 Schedule 会立即触发一次备份暂停paused的 Schedule 在恢复unpause后若从status.lastBackup判断已到期也会立即补一次备份。对于按小时级 cron 运行的场景一次意外的立即备份可能造成不必要的存储开销和备份窗口冲突。本文基于 Velero 的设计文档 schedule-skip-immediately-config_design.md结合当前仓库的实际实现完整讲解skipImmediately这一一次性消费型配置的设计动机、API 变更、CLI 用法以及控制器内部的实现机制。读完后你可以掌握如何通过velero schedule unpause、velero schedule create、velero server和velero install四层配置控制立即到期备份的触发行为并理解status.lastSkipped与status.lastBackup在下次运行时间计算中的协作关系。设计动机默认行为为何需要可跳过问题背景Velero 的 Schedule 控制器在以下两类情况下会创建一个备份原文档引用了社区 issue vmware-tanzu/velero#6517 作为背景schedule.status.lastBackup为 nilSchedule 刚创建、从未运行过Schedule 刚刚被 unpause且从status.lastBackup时间戳判断备份已到期due immediately。设计文档中给出了一个典型场景你创建了一个 cron 为45 * * * *的 Schedule在第 43 分钟时把它暂停然后在第 50 分钟时恢复它——由于lastBackup为 nil 或距今已超过 60 分钟恢复动作会立刻触发一次备份。对于希望恢复后等下一个 cron 点再跑的用户来说这个默认行为并不总是期望的。设计目标与非目标目标增加一个选项让用户在 unpause当备份立即到期时或创建新 Schedule 时可以选择不立即创建备份非目标不改变默认行为。所有新增字段和 flag 的默认值均为false不跳过以保证升级兼容性。API 变更SkipImmediately 与 LastSkipped 两个新字段ScheduleSpec 新增 SkipImmediately设计文档提议在ScheduleSpec中新增SkipImmediately字段。当前仓库的实际实现位于 schedule_types.go与设计稿基本一致且有一处值得注意的落地差异——实际类型是*bool指针而非bool// ScheduleSpec defines the specification for a Velero schedule type ScheduleSpec struct { // ... // Paused specifies whether the schedule is paused or not // optional Paused bool json:paused,omitempty // SkipImmediately specifies whether to skip backup if schedule is due immediately // from schedule.status.lastBackup timestamp when schedule is unpaused or if // schedule is new. If true, backup will be skipped immediately when schedule // is unpaused if it is due based on .Status.LastBackupTimestamp or schedule is // new, and will run at next schedule time. If false, backup will not be skipped // immediately when schedule is unpaused, but will run at next schedule time. // If empty, will follow server configuration (default: false). // optional SkipImmediately *bool json:skipImmediately,omitempty }采用*bool实现了设计稿中If empty, will follow server configuration的语义null未设置跟随 velero 服务端--schedule-skip-immediately的默认值true跳过立即到期的备份false保留旧行为立即到期就备份。ScheduleStatus 新增 LastSkipped设计文档同时要求为ScheduleStatus增加LastSkipped时间戳用于记录最近一次执行跳过的时刻。实际实现见 schedule_types.gotype ScheduleStatus struct { // ... // LastBackup is the last time a Backup was run for this Schedule schedule // optional // nullable LastBackup *metav1.Time json:lastBackup,omitempty // LastSkipped is the last time a Schedule was skipped // optional // nullable LastSkipped *metav1.Time json:lastSkipped,omitempty // ValidationErrors ... }LastSkipped是计算下次运行时间的关键跳过备份后控制器用它而不是LastBackup来推算下一次 cron 触发点从而保证跳过之后 Schedule 仍维持既定的运行节律cadence不会把一次跳过误解为备份刚跑完而多等一个周期也不会重复触发。消费并重置consume and reset模式设计文档特别强调skipImmediately被设计为一次性操作而非持久状态。服务端在消费掉该标记后会自动将其重置将spec.skipImmediately重置为false或置为 nil使其可被再次使用将当前时间记录到schedule.status.lastSkipped。这一模式确保跳过一次立即备份后Schedule 恢复常规行为后续运行不再受该字段影响。控制器实现一次 Reconcile 中的跳过逻辑所有核心逻辑集中在 schedule_controller.go。Reconcile 入口处约 L113-L123完成了补默认值 消费标记两步if schedule.Spec.SkipImmediately nil { // 复制值而非直接引用 c.skipImmediatelyc 是长生命周期的单例 // reconciler若直接引用会在下方写穿共享字段 skipImmediately : c.skipImmediately schedule.Spec.SkipImmediately skipImmediately } if schedule.Spec.SkipImmediately ! nil *schedule.Spec.SkipImmediately { *schedule.Spec.SkipImmediately false schedule.Status.LastSkipped metav1.Time{Time: c.clock.Now()} }这段代码与设计方案中的伪代码完全对应。源码注释还揭示了一个实现细节这里刻意复制值而不是直接引用 reconciler 上的c.skipImmediately指针因为 reconciler 是长生命周期单例如果写入时穿过该指针就会污染后续所有 Schedule 的共享默认值——这是一个容易踩坑的并发正确性考量。随后控制器比较original与当前对象L151-L165若spec.skipImmediately或status.lastSkipped发生变化则用client.MergeFrom(original)打补丁持久化。到期判断ifDue 与 getNextRunTime备份创建的入口判断在 L176-L180仅当ifDue为真、且不存在处于 New/InProgress 状态的在途备份checkIfBackupInNewOrProgress避免重叠备份时才调用submitBackup创建 Backup。ifDue内部调用的getNextRunTimeL286-L300正是设计文档中要求更新的核心函数func getNextRunTime(schedule *velerov1.Schedule, cronSchedule cron.Schedule, asOf time.Time) (bool, time.Time) { var lastBackupTime time.Time if schedule.Status.LastBackup ! nil { lastBackupTime schedule.Status.LastBackup.Time } else { lastBackupTime schedule.CreationTimestamp.Time } if schedule.Status.LastSkipped ! nil schedule.Status.LastSkipped.After(lastBackupTime) { lastBackupTime schedule.Status.LastSkipped.Time } nextRunTime : cronSchedule.Next(lastBackupTime) return asOf.After(nextRunTime), nextRunTime }逐行拆解其语义基准时间取status.lastBackup若为 nil新 Schedule退化为metadata.creationTimestamp若status.lastSkipped存在且比基准时间更新则用它作为基准——这就是跳过能保持 cron 节律的原理下次运行点从跳过时刻往后算而不是从上一次真实备份算最终比较asOf当前时钟测试中可注入 fake clock是否已越过下一个 cron 点得出是否到期。对应设计文档中的三种行为分支场景lastBackuplastSkipped结果Schedule 刚创建且开启跳过nil刚被写入不创建备份等待下一个 cron 点unpause 时立即到期且开启跳过有较早较新不创建备份等待下一个 cron 点常规到期无跳过有无或较早到期即创建备份并更新lastBackup创建备份成功后submitBackupL264-L284会把status.lastBackup更新为当前时间并打补丁。另外从源码结构看控制器通过kube.NewPeriodicalEnqueueSource周期性地把未暂停的 Schedule 重新入队L82-L89这保证了到期检查不依赖事件触发的时机——这也是lastSkipped记录后能在后续周期中被持续参考的原因。控制器的相关行为在 schedule_controller_test.go 中有对应测试覆盖可结合阅读验证skipImmediately各分支true/false/nil与lastSkipped更新的预期断言。CLI 变更四层配置入口velero schedule unpause --skip-immediatelyvelero schedule unpause新增可选布尔 flag--skip-immediately用于覆盖 velero 服务端配置的行为设计文档原文。实现位于 unpause.goflag 绑定逻辑在 skip_options.gofunc (o *SkipOptions) BindFlags(flags *pflag.FlagSet) { f : flags.VarPF(o.SkipImmediately, skip-immediately, , Skip the next scheduled backup immediately) f.NoOptDefVal // default to nil so server options can take precedence }NoOptDefVal被设为空字符串意味着该 flag 是OptionalBool三态类型显式传--skip-immediatelytrue/false时覆盖 spec完全省略时保持 nil把决定权交给服务端配置。三种用法及语义与设计文档一致# 恢复调度但不跳过若按 lastBackup 判断立即到期则马上运行备份 velero schedule unpause schedule-1 --skip-immediatelyfalse # 恢复调度并跳过立即到期的备份等待下一个 cron 点 velero schedule unpause schedule-1 --skip-immediatelytrue # 不指定 flag检查 Schedule 上的 .spec.skipImmediately 决定行为 # 该字段默认 false维持旧行为 velero schedule unpause schedule-1velero schedule create创建 Schedule 时同样接受该 flag。从 create.go 可见命令行值会直接写入新对象的Spec.SkipImmediately实现创建即跳过首个立即备份的能力。velero server --schedule-skip-immediately服务端新增全局默认值 flag用于为所有未显式设置该字段的新 Schedule 打补丁。定义见 config.go 与 L259flags.BoolVar(c.ScheduleSkipImmediately, schedule-skip-immediately, c.ScheduleSkipImmediately, Skip the first scheduled backup immediately after creating a schedule. Default is false (dont skip).)该值在 server.go 中注入NewScheduleReconciler成为 reconciler 的c.skipImmediately字段——即上文 Reconcile 入口中nil分支回填的默认值来源。默认false未设置时维持旧行为。velero install --schedule-skip-immediatelyvelero install也新增同名 flaginstall.go在生成部署清单时把该默认值透传到 velero server 容器使安装时就地固化服务端的skipImmediately默认策略。deployment.go 中可见 server 部署清单对该配置的引用。兼容性说明设计文档的 Compatibility 一节给出的结论也与当前代码一致升级无感新字段加入 Schedule CRD 后skipImmediately缺省即维持unpause 时若到期立即备份的既有行为升级无需迁移动作旧版本兼容由于是新增的可选字段旧版本 velero 会忽略它Kubernetes 对未知可选字段的默认容忍语义不会造成解析失败一次性语义的持久化spec.skipImmediately被消费后会被控制器改回false并持久化可观察到 Schedule 对象上该字段的自动回写同时status.lastSkipped出现新时间戳——排查为什么这次备份没立刻跑时这两个字段就是直接证据。小结skipImmediately是 Velero Schedule 上典型的一次性指令 状态留痕设计spec.skipImmediately表达用户意图控制器消费后立即复位status.lastSkipped留下不可变的时间痕迹再经由getNextRunTime参与后续每次到期计算。三层配置面CLI 单条命令覆盖、Schedule 对象字段、服务端/安装期全局默认叠加三态布尔nil/true/false的优先级模型使该特性既能覆盖存量 Schedule 的 unpause 场景也能约束新建 Schedule 的默认行为同时把兼容性影响面压缩到零。若你要在自己的集群中落地这一能力最小路径是升级后对目标 Schedule 执行velero schedule unpause name --skip-immediatelytrue随后通过kubectl get schedule name -o yaml观察status.lastSkipped与下次lastBackup的间隔来验证节律是否符合预期。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

西电光电院复试备考全攻略:精准对标考纲与综合能力展示

西电光电院复试备考全攻略:精准对标考纲与综合能力展示

1. 复试准备的核心思路作为西电光电院的过来人,我深知复试准备的关键在于"精准对标考纲综合能力展示"。9051和9052两个方向的复试虽然侧重点不同,但准备逻辑是相通的。首先要明确的是,复试绝非初试的简单延续,而是对专业…

📅 2026/9/16 17:03:58
Java Web投票系统实战:Servlet+JSP+JDBC完整部署与代码级调试

Java Web投票系统实战:Servlet+JSP+JDBC完整部署与代码级调试

简介:本资源是一套面向高校Web开发课程设计的Java Web投票系统完整实现,适用于Java Web初学者巩固JSP、Servlet及数据库交互技能,解决课程实践中的典型MVC架构落地问题。压缩包共14个文件,含9个JSP页面(如index.jsp用户…

📅 2026/9/16 17:03:58
Java Swing课设实战:JTable数据绑定与CRUD实现

Java Swing课设实战:JTable数据绑定与CRUD实现

简介:这是一套面向高校Java课程设计的花店管理系统纯GUI实现,专为Java初学者及课设学生打造,聚焦基础Swing组件开发与数据库交互能力训练,完全满足课程验收与答辩需求。资源包共54个文件,含10个核心Java源码&#xff0…

📅 2026/9/16 17:03:58
MORE NEWS

更多资讯

📰

虚拟储能与光伏配比优化:MATLAB仿真与智能楼宇能量管理

简介:针对智能楼宇微电网优化场景,这份MATLAB源码包实现了虚拟储能系统与光伏配比联合调度,适合电力系统、建筑节能方向的学生、研究人员及工程师。包内共4个文件,包含2个m函数文件(主程序与适应度计算)、1…

📰

微信小程序驾校预约管理系统源码:并发控制与部署解析

简介:这是一套面向毕业设计场景的微信小程序驾校预约管理系统源码,后端以Java实现业务逻辑,前端采用微信小程序原生框架,覆盖用户注册登录、驾校课程预约、时段选择与后台信息管理等核心流程,项目获评98分高分毕设&…

📰

Spring Boot与微服务架构:Java开发者必备技能解析

1. 项目概述作为一名Java开发者,从Spring Boot入门到掌握微服务架构是职业发展的必经之路。对于准备求职面试的Java小白来说,理解这两者之间的关系和区别尤为重要。Spring Boot作为快速开发框架,简化了传统Spring应用的配置和部署&#xff1b…

📰

MONAI 1.4 版本新特性深度解读:MAISI 生成模型、VISTA 基础模型、TensorRT 惰性导出与几何数据支持

MONAI 1.4 版本新特性深度解读:MAISI 生成模型、VISTA 基础模型、TensorRT 惰性导出与几何数据支持 【免费下载链接】MONAI AI Toolkit for Healthcare Imaging 项目地址: https://gitcode.com/GitHub_Trending/mo/MONAI MONAI 1.4 是医疗影像 AI 工具链的一…

📰

WebView文字选择改造:ActionMode拦截与JSBridge交互实践

简介:面向Android开发者的一套开源源码包,针对WebView组件在网页浏览场景中文字选取范围受限、操作菜单单一的问题,给出了较为完整的增强方案。通过自定义选择器与JavaScript接口,开发者可实现连续或非连续文本的多选,…

📰

一张显卡跑遍DLSS、FSR3.1和XeSS:OptiScaler游戏上采样实战指南

一张显卡跑遍DLSS、FSR3.1和XeSS:OptiScaler游戏上采样实战指南 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR-FG/XeFG on non-FG titles. Supports…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬