资讯动态

Velero 卸载详解:velero uninstall 命令背后的命名空间、CRD 与 Finalizer 清理机制

发布时间:2026/9/17 22:38:03 来源:尧图企业网站定制
Velero 卸载详解velero uninstall 命令背后的命名空间、CRD 与 Finalizer 清理机制【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero本文以 Velero 官方文档 Uninstalling Velerosite/content/docs/v1.10/uninstalling.md为主线讲清楚如何彻底卸载 Velerovelero uninstall一条命令会删除哪些资源、--namespace与--force两个参数如何工作并结合仓库中 uninstall.go 的源码实现深入剖析卸载顺序为何是先删命名空间、再删 CRD以及 Restore/DataUpload/DataDownload 上的 Finalizer 是如何被优雅处理乃至强制移除的。读完后你不仅能正确执行卸载操作还能理解卸载卡住时的底层原因与排查思路。一条命令完成卸载Velero 官方给出的卸载方式非常简单。如果希望把 Velero 从集群中完全移除执行velero uninstall这条命令会移除velero install所创建的全部资源。从命令定义NewCommand可以看到uninstall是veleroCLI 的顶层子命令之一注册于 velero.go其完整帮助信息为Uninstall Velero along with the CRDs and clusterrolebinding. The --namespace flag can be used to specify the namespace where velero is installed (default: velero). Use --force to skip the prompt confirming if you want to uninstall Velero.示例# velero uninstall --namespace staging命令参数参数类型默认值说明--namespacestringvelero指定 Velero 所在的命名空间。这是全局 flag由命令工厂注入源码中通过f.Namespace()获取如果你安装 Velero 时使用了非默认命名空间如staging卸载时必须带上相同参数--forceboolfalse跳过交互式确认直接执行卸载适合 CI/脚本场景。绑定逻辑见 uninstallOptions.BindFlags交互式确认如果不加--force命令会先打印提示并等待人工确认uninstall.go#L81-L89You are about to uninstall Velero. Are you sure you want to continue (Y/N)?确认逻辑由通用组件 confirm.GetConfirmation 实现它从标准输入读取只接受单个字符y/n不区分大小写输入非法字符会重新提示读取得到非y结果时直接返回、不做任何删除动作。这一点值得注意——未确认时命令不会触碰集群中的任何资源。卸载到底删了哪些资源从 Run 函数 的实现看velero uninstall清理的对象恰好覆盖velero install创建的全部组件共三类Velero 命名空间及其全部内容默认命名空间为velero常量DefaultVeleroNamespace定义于 resources.go。删除命名空间会级联移除其中的 Deploymentvelero 控制器、ServiceAccount、Role/RoleBinding、各类 Secret、BackupStorageLocation、VolumeSnapshotLocation 等所有命名空间级资源。ClusterRoleBinding即安装时创建的集群级绑定。从 ClusterRoleBinding 构造函数 可见其命名规则——默认命名空间下名为velero非默认命名空间下为velero-namespace如velero-staging它把cluster-admin这一 ClusterRole 授予 Velero 命名空间下的veleroServiceAccount。卸载时若发现该对象不存在会打印 does not exist, skipping 并继续属于幂等设计。Velero CRDs自定义资源定义包括 v1 版本 CRDbackups.velero.io、restores.velero.io、schedules.velero.io、backupstoragelocations.velero.io、volumesnapshotlocations.velero.io、datauploads.velero.io、datadownloads.velero.io 等见 config/crd/v1/ 与 config/crd/v2alpha1/同时兼容清理早期版本遗留的 v1beta1 CRD。删除 CRD 时并不是无差别全删而是带上标签选择器componentvelero即 install.Labels() 返回的标签也是所有安装资源统一携带的标签做DeleteAllOf只删除属于 Velero 的 CRD。v1 与 v1beta1 两套 CRD 分别尝试删除若某套在集群中不存在API 无匹配则打印跳过提示两种都不存在时才输出 V1Beta1 Velero CRDs not found, skipping...。需要明确的是从源码看卸载流程只操作上述集群侧资源不会触碰云对象存储桶中的备份数据。因此卸载前请自行确认桶内备份数据是否还需要保留这是文档没有明说、但由实现边界可推断的重要注意点。源码级卸载流程为什么必须先删命名空间Run 的执行顺序值得特别关注其首行注释直接点明了设计动机// The CRDs cannot be removed until the namespace is deleted to avoid the problem in issue #3974 so if the namespace deletion fails we error out here即在命名空间删除完成之前不能删除 CRD否则会触发历史上的 issue #3974CRD 删除与集群状态异常。因此整个流程被组织为严格的三段式velero uninstall │ ├─ 1. deleteNamespace # 删命名空间含 finalizer 预处理 等待彻底删除 ├─ 2. 删除 ClusterRoleBinding # 集群级 RBAC 绑定 └─ 3. 删除 v1 / v1beta1 CRDs # 集群级 CRD任何一段失败都会打印Errors while attempting to uninstall Velero: ...并返回错误全部成功后输出Velero uninstalled ⛵。命名空间删除deleteNamespace 的完整逻辑deleteNamespace 分为四步存在性检查先 Get 命名空间若已不存在则打印 Velero namespace %q does not exist, skipping. 直接返回——重复执行velero uninstall不会报错。Finalizer 预处理调用deleteResourcesWithFinalizer详见下节确保带 finalizer 的 Velero 自定义资源不会阻塞命名空间关闭。发起删除调用 API Server 删除命名空间NotFound 同样视为已完成。轮询等待以 5 毫秒为间隔持续探测命名空间是否消失探测期间在终端打印.作为进度反馈直到 Get 返回 NotFound 才结束等待。源码注释再次强调必须等到命名空间真正删除完毕以规避 issue #3974。Finalizer 处理优雅删除与强制删除两级策略这是卸载流程中最复杂、也最容易被忽略的部分。Velero 的三类自定义资源带有 finalizerRestore对象携带ExternalResourcesFinalizer由 restore 相关控制器 在删除流程中管理DataUpload与DataDownload对象携带DataUploadDownloadFinalizer见 data_download_controller.go 中的添加/移除逻辑。Finalizer 意味着删除这些资源时对应的控制器必须先完成清理动作如释放快照等外部资源才会移除 finalizer资源才能真正消失。若控制器处理出错它会持续重试删除过程可能无限挂起——而命名空间的关闭又依赖其中全部资源删除完毕。为此deleteResources 实现了两级策略第一步优雅删除gracefulgracefullyDeleteResources 会对三种资源列表RestoreList、DataUploadList、DataDownloadList其 CRD 存在性由 checkResources 预先探测CRD 不存在则直接跳过并发发起普通 Delete然后以 1 秒为间隔、最长1 分钟gracefulDeletionMaximumDuration见 uninstall.go#L54轮询等待三类资源清空。源码注释对此解释了三点关键考量带 finalizer 的资源必须在其控制器 Pod 被删除之前先发起删除让控制器正常走完 finalizer 逻辑控制器处理 finalizer 可能出错并无限重试因此必须设置超时超时后强制移除 finalizer否则删除流程会卡死截至 v1.12 版本只存在资源级 finalizer未来若新增 finalizer 类型需要在此函数中补充对应逻辑。第二步强制删除forced若 1 分钟内资源仍未删净wait.Interrupted判定超时则转入 forcedlyDeleteResources先删除 velero Deployment 并等待其消失。注释解释了原因如果先摘除 finalizer仍在运行的控制器可能给资源重新加回 finalizer或者新创建出带 finalizer 的资源导致清理不彻底再遍历三类资源对仍携带 finalizer 的对象逐个调用 removeFinalizerForObject——用controllerutil.RemoveFinalizer构造新对象后通过 JSON Patchkubeutil.PatchResource将 finalizer 从元数据中摘除资源随即被 API Server 真正删除。从源码结构看这套先优雅、超时后强制的双阶段设计正是velero uninstall能够处理异常状态例如控制器故障导致 restore 卡在 finalizer 阶段的关键也解释了卸载过程可能出现的两行提示Waiting for resource with attached finalizer to be deleted与持续输出的进度点。卸载操作建议与适用边界结合源码行为给出几条实操建议确认命名空间一致velero uninstall默认只清理velero命名空间。若安装时用了velero install --namespace staging卸载必须对应执行velero uninstall --namespace staging否则只会删除不存在的默认命名空间相关内容CRB 名称velero-staging也依赖该参数推导见 ClusterRoleBinding。脚本化场景加--force无人值守环境下交互确认会读取不到y而静默退出confirm.GetConfirmation 读取出错即返回 false加上--force才能保证卸载真正执行。卸载是幂等的命名空间、CRB、CRD 三个环节对对象不存在的情况均做了跳过处理重复执行安全。备份数据需另行处置卸载只移除集群侧的 Velero 组件云存储桶中的备份对象不在命令的操作范围内请按需手动清理。版本适用性说明本文档路径位于site/content/docs/v1.10/而当前仓库中的卸载实现已显著增强——finalizer 预处理逻辑优雅删除 强制删除双阶段是后续版本引入的源码注释标明截至 v1.12 的行为。较老版本如 1.10的velero uninstall在交互与基本删除流程上是一致的但在命名空间内存在带 finalizer 的异常资源时新版本能自动兜底旧版本可能需要手工介入。验证卸载完成命令结束后可用kubectl get ns velero、kubectl get clusterrolebinding | grep velero、kubectl get crd | grep velero.io复核三类资源是否均已清除。小结velero uninstall表面上只是一行命令实际执行的是一个有严格顺序约束的清理流程先处理 finalizer 并删除整个 Velero 命名空间等待其彻底消失再删除 ClusterRoleBinding最后按componentvelero标签选择器清理 v1 与 v1beta1 两代 CRD对卡在 finalizer 上的 Restore/DataUpload/DataDownload 资源采用1 分钟优雅删除超时后先停控制器、再摘除 finalizer的强制兜底策略。理解 pkg/cmd/cli/uninstall/uninstall.go 中Run、deleteNamespace、deleteResources这条调用链是正确执行与排查 Velero 卸载问题的核心依据。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价