ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Velero 插件移除指南:深入解析 `ark plugin remove` 命令的工作原理与实战用法

Velero 插件移除指南:深入解析 `ark plugin remove` 命令的工作原理与实战用法 Velero 插件移除指南深入解析ark plugin remove命令的工作原理与实战用法【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/veleroArk 是 Velero 项目的前身是一个面向 Kubernetes 集群资源的灾难恢复与备份迁移工具。本文以 Ark 早期版本v0.7.1官方 CLI 参考文档中的ark plugin remove命令为核心系统讲解如何通过命令行移除已注册的插件并结合当前 Velero 仓库中的源码实现pkg/cmd/cli/plugin/remove.go等剖析该命令的底层执行原理帮助读者掌握插件管理的完整思路与实战技巧。命令总览ark plugin remove是 Ark 插件管理子命令体系ark plugin中的核心命令之一用于移除一个已添加到 Ark 服务端部署中的插件。在 Ark v0.7.1 时代插件的添加与移除均围绕 Velero/Ark 服务端 Deployment 展开插件以 init container 的形式注入到 Ark server 的 Pod 中移除插件即从 Deployment 的 init containers 列表中删除对应的容器条目。命令的完整用法如下ark plugin remove [NAME | IMAGE] [flags]其中参数[NAME | IMAGE]表示可以按**容器名称NAME或镜像名IMAGE**两种方式定位待移除的插件二者选其一即可。命令选项该命令本身仅提供一个通用帮助选项-h, --help help for remove继承自父命令的选项由于ark plugin remove是ark命令树的子命令它会继承来自父命令的全部全局选项。这些选项在 Ark 的所有 CLI 命令中通用常用于控制集群访问与日志输出--alsologtostderr log to standard error as well as files --kubeconfig string Path to the kubeconfig file to use to talk to the Kubernetes apiserver. If unset, try the environment variable KUBECONFIG, as well as in-cluster configuration --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) --log_dir string If non-empty, write log files in this directory --logtostderr log to standard error instead of files -n, --namespace string The namespace in which Ark should operate (default heptio-ark) --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level log level for V logs --vmodule moduleSpec comma-separated list of patternN settings for file-filtered logging各选项的作用如下选项类型默认值说明--alsologtostderr布尔false同时将日志输出到标准错误stderr和日志文件--kubeconfig字符串无连接 Kubernetes apiserver 使用的 kubeconfig 文件路径未设置时依次尝试环境变量KUBECONFIG与集群内配置in-cluster configuration--log_backtrace_at字符串:0当日志命中file:N位置时输出堆栈跟踪--log_dir字符串空指定日志文件输出目录非空时写入该目录--logtostderr布尔false将日志输出到标准错误而非文件-n, --namespace字符串heptio-arkArk 操作的命名空间早期默认命名空间为heptio-ark后续版本已改为velero--stderrthreshold字符串2达到或超过该级别的日志输出到 stderr-v, --v整数0V 日志级别--vmodule字符串空按patternN的逗号分隔列表对指定文件进行日志级别过滤命令在命令树中的位置ark plugin remove属于ark plugin子命令组。在 Ark v0.7.1 的文档中ark plugin命令组还包含ark plugin add—— 添加插件ark plugin remove—— 移除插件本文主题ark get plugin—— 获取插件信息对应的命令树定义在仓库的 pkg/cmd/cli/plugin/plugin.go 中。NewCommand函数通过c.AddCommand将NewAddCommand、NewRemoveCommand与NewGetCommand注册到plugin子命令下func NewCommand(f client.Factory) *cobra.Command { c : cobra.Command{ Use: plugin, Short: Work with plugins, Long: Work with plugins, } c.AddCommand( NewAddCommand(f), NewRemoveCommand(f), NewGetCommand(f, get), ) return c }底层实现原理核心实现NewRemoveCommandark plugin remove的实际逻辑定义在 pkg/cmd/cli/plugin/remove.go 的NewRemoveCommand函数中。其核心执行流程如下创建 Kubernetes 客户端通过f.KubeClient()创建与 apiserver 交互的客户端。定位 Velero/Ark 服务端 Deployment调用veleroDeployment辅助函数在目标命名空间中按标签选择器与容器名定位 Ark server 的 Deployment 对象。序列化原始状态将 Deployment 对象json.Marshal序列化作为后续生成 merge patch 的原始基线。在 init containers 中查找目标插件遍历veleroDeploy.Spec.Template.Spec.InitContainers只要容器的Name或Image与命令行参数args[0]匹配就记录其索引位置for x, container : range initContainers { if container.Name args[0] || container.Image args[0] { index x break } }校验目标是否存在若未找到匹配项命令直接报错退出错误信息为init container %s not found in Velero server deployment提示用户该插件并未存在于服务端 Deployment 中。删除对应的 init container通过 Go 切片删除语法append(initContainers[0:index], initContainers[index1:]...)将目标容器从列表中剔除。生成并应用 merge patch将修改后的 Deployment 重新序列化使用jsonpatch.CreateMergePatch生成原始状态与更新状态之间的 merge patch随后通过kubeClient.AppsV1().Deployments(...).Patch以types.MergePatchType方式应用到集群触发 Ark server Pod 的滚动更新。patchBytes, err : jsonpatch.CreateMergePatch(original, updated) cmd.CheckError(err) _, err kubeClient.AppsV1().Deployments(veleroDeploy.Namespace).Patch( context.TODO(), veleroDeploy.Name, types.MergePatchType, patchBytes, metav1.PatchOptions{}) cmd.CheckError(err)从源码结构可以看出remove命令是一个就地修改 Deployment 而非重建对象的过程——它通过精确的 merge patch 只更新 init containers 列表最大限度减少对 Ark server Deployment 其他配置的影响。服务端 Deployment 定位逻辑remove与add命令共用veleroDeployment辅助函数实现在 pkg/cmd/cli/plugin/helpers.go 中。该函数通过以下策略定位 Ark server 的 Deployment使用install.Labels()生成的标签选择器列出命名空间下所有候选 Deployment遍历候选 Deployment 的容器列表找到名为velero的容器所属的 Deployment 并返回若未找到任何符合条件的 Deployment则返回错误Velero deployment not found。func veleroDeployment(ctx context.Context, kubeClient kubernetes.Interface, namespace string) (*appsv1api.Deployment, error) { veleroLabels : labels.FormatLabels(install.Labels()) deployList, err : kubeClient. AppsV1(). Deployments(namespace). List(ctx, metav1.ListOptions{ LabelSelector: veleroLabels, }) if err ! nil { return nil, err } for _, deploy : range deployList.Items { for _, container : range deploy.Spec.Template.Spec.Containers { if container.Name velero { return deploy, nil } } } return nil, errors.New(Velero deployment not found) }这种“标签选择器 容器名双重校验”的定位方式可以有效避免误操作其他同名或相似命名的 Deployment。与ark plugin add的对称关系要理解 remove 的语义不妨对照插件的添加过程。ark plugin add IMAGE的实现位于 pkg/cmd/cli/plugin/add.go添加插件前会要求用户确认并明确提示“可能导致 Velero server Pod 重启、使所有进行中的任务失败”这一风险若 Deployment 中不存在名为plugins的 volume则会自动创建 emptyDir 卷并挂载到velero容器插件通过builder.ForPluginContainer构造为 init container挂载/target目录追加到Spec.Template.Spec.InitContainers列表末尾同样通过 merge patch 方式应用到集群。由此可以清楚地看到 add 与 remove 是一对互逆操作add 向 init containers 列表末尾追加插件容器remove 则从列表中按名称或镜像删除对应容器。二者都以 patch 方式修改 Ark server Deployment。插件 init container 的构造逻辑在 pkg/builder/container_builder.go 的ForPluginContainer中它会为插件容器挂载名为plugins的卷到/target路径并根据镜像名自动生成符合 DNS-1123 规范的容器名称去掉 registry 前缀、将/、_、.替换为-并限制在 63 字符内发生冲突时追加 5 位随机字符串。这解释了为何ark plugin remove既支持按 NAME 也支持按 IMAGE 定位插件——容器名正是从镜像名自动推导而来。实战操作示例前置条件执行ark plugin remove前需要满足以下条件已安装并配置好 Ark CLIv0.7.1 或兼容版本拥有访问 Kubernetes 集群 apiserver 的 kubeconfig 配置可通过--kubeconfig指定或依赖KUBECONFIG环境变量Ark server 已部署在目标命名空间中早期默认命名空间为heptio-ark可通过-n覆盖待移除的插件已通过ark plugin add添加。按镜像名移除插件最常见的方式是按镜像名移除插件例如移除registry.example.com/velero/velero-plugin-for-aws:latestark plugin remove registry.example.com/velero/velero-plugin-for-aws:latest命令执行后Ark 会在服务端 Deployment 的 init containers 中找到镜像匹配的容器并移除随后 Ark server Pod 会进行滚动更新。按容器名称移除插件由于插件容器的名称由镜像名自动推导生成也可以直接使用容器名称定位ark plugin remove velero-plugin-for-aws指定命名空间若 Ark server 部署在非默认命名空间需显式指定ark plugin remove velero-plugin-for-aws --namespace my-namespace使用 kubeconfig 与日志选项在非默认集群或需要调试时可组合使用全局选项ark plugin remove velero-plugin-for-aws \ --kubeconfig /path/to/kubeconfig \ --namespace heptio-ark \ --logtostderr \ -v 4常见错误与处理init container name not found in Velero server deployment目标插件不在当前 Ark server Deployment 的 init containers 中。可能原因包括插件名/镜像名拼写错误、命名空间错误或插件从未被添加。可通过ark get plugin或ark plugin get查看当前服务端已加载的插件列表确认。Velero deployment not found在指定命名空间中未找到符合标签与容器名条件的 Ark server Deployment。请检查命名空间参数与 Ark server 的部署状态。Pod 重启导致的任务中断移除插件与添加插件一样都会通过 patch 触发 Ark server Deployment 的滚动更新进而重启 Ark server Pod。进行中的备份/恢复任务可能因此失败建议在维护窗口内操作。与当前 Velero 版本的演进关系需要特别说明的是本文介绍的ark plugin remove命令及其文档site/content/docs/v0.7.1/cli-reference/ark_plugin_remove.md对应的是 Velero 项目早期版本。在当前仓库中命令名已从ark演进为velero插件管理子命令组为velero plugin源码主体仍保留在pkg/cmd/cli/plugin/目录下remove.go的NewRemoveCommand核心逻辑与早期版本一脉相承默认命名空间已从heptio-ark变更为velero插件体系从简单的 init container 注入演进为更完善的插件框架见pkg/plugin/目录下的 clientmgmt、framework、generated、proto 等子包但在 v0.7.1 时代插件的装载与卸载正是围绕 Deployment 的 init containers 展开的。理解早期ark plugin remove的实现有助于把握 Velero 插件生命周期管理的演进脉络也能帮助维护历史版本集群的用户正确完成插件卸载操作。参考文档命令参考本文主体site/content/docs/v0.7.1/cli-reference/ark_plugin_remove.md命令组参考site/content/docs/v0.7.1/cli-reference/ark_plugin.md移除命令源码pkg/cmd/cli/plugin/remove.go命令组注册源码pkg/cmd/cli/plugin/plugin.go添加命令源码pkg/cmd/cli/plugin/add.go获取插件命令源码pkg/cmd/cli/plugin/get.goDeployment 定位辅助函数pkg/cmd/cli/plugin/helpers.go插件 init container 构造器pkg/builder/container_builder.go【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表