Velero(v0.8.0 时代 Ark)插件管理命令 `ark plugin` 完全指南:add / remove / get 与插件体系原理
Velerov0.8.0 时代 Ark插件管理命令ark plugin完全指南add / remove / get 与插件体系原理【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero本文以仓库内 site/content/docs/v0.8.0/cli-reference/ark_plugin.md 为骨架结合 plugins.md 与pkg/cmd/cli/plugin源码讲解ark plugin命令族的全部用法、参数含义与底层实现原理。读者将掌握如何用ark plugin add为 Ark/Velero 服务端动态装载自定义插件、用ark plugin remove卸载插件、理解插件种类与命名规范以及了解现代 Velero 中对应的velero plugin命令形态。注意v0.8.0 时代项目名称为Heptio ArkCLI 为ark该项目在 v1.0 后更名为 Velero命令相应演变为velero。一、命令概览ark plugin是什么ark plugin是 Ark 客户端中用于管理插件plugin的命令组。在 ark_plugin.md 中其定义极为精炼——Synopsis 只有一句话Work with plugins处理插件作为父命令ark plugin本身不执行具体操作而是聚合了若干子命令。该文档的 SEE ALSO 部分明确列出ark plugin add —— Add a plugin添加插件ark plugin remove —— Remove a plugin移除插件从当前仓库源码可以印证这一点。pkg/cmd/cli/plugin/plugin.go 中NewCommand函数把plugin定义为 cobra 命令并挂载了三个子命令c : cobra.Command{ Use: plugin, Short: Work with plugins, Long: Work with plugins, } c.AddCommand( NewAddCommand(f), NewRemoveCommand(f), NewGetCommand(f, get), )也就是说现代仓库中的plugin命令族实际包含add、remove、get三个子命令。v0.8.0 的 CLI 参考文档只记载了 add 与 removeget 为后续版本演进加入用于从服务端查询已加载插件信息读者在旧版本文档中看不到 get但在当前源码中它是完整存在的。二、ark plugin的选项与全局继承参数根据 ark_plugin.mdark plugin自身只接受一个选项选项说明-h, --help显示plugin命令的帮助信息此外ark plugin及其所有子命令都会继承 Ark 根命令的全局参数这些参数在文档中被列为 Options inherited from parent commands完整清单如下--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 --kubecontext string The context to use to talk to the Kubernetes apiserver. If unset defaults to whatever your current-context is (kubectl config current-context) --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实际使用中最关键的是两个参数--kubeconfig指定连接 Kubernetes apiserver 的 kubeconfig 路径。若未指定则回退到环境变量KUBECONFIG再回退到集群内配置in-cluster configuration。-n, --namespaceArk 操作的命名空间v0.8.0 默认值为heptio-ark现代 Velero 默认值已变为velero。ark plugin相关命令本身不直接调用这些日志参数但它们对所有子命令生效排查问题时如开启--logtostderr观察客户端行为会用到。三、ark plugin add为 Ark 服务端添加插件3.1 命令语法与参数ark_plugin_add.md 给出如下语法ark plugin add IMAGE [flags]它接受一个位置参数 IMAGE——即插件容器镜像例如gcr.io/heptio-images/velero-plugin-for-aws:v0.8.0。选项只有两个选项说明-h, --help帮助信息--image-pull-policy插件容器的 imagePullPolicy合法值为Always、IfNotPresent、Never默认IfNotPresent3.2 典型用法示例# 添加 AWS 对象存储/卷快照插件 ark plugin add gcr.io/heptio-images/velero-plugin-for-aws:v0.8.0 # 指定镜像拉取策略 ark plugin add myregistry.example.com/velero-plugin-custom:v1.0 --image-pull-policy Always # 指定 kubeconfig 与命名空间 ark plugin add gcr.io/heptio-images/velero-plugin-for-gcp:v0.8.0 \ --kubeconfig ~/.kube/config -n heptio-ark3.3 底层实现init container merge patch从 pkg/cmd/cli/plugin/add.go 源码可以看到ark plugin add的真实执行链路确认环节危险操作保护命令默认会提示用户确认。源码中通过confirm.NewConfirmOptionsWithDescription注册了--confirm布尔标志并在未传--confirm时调用GetConfirmation交互式询问 Are you sure you want to continue (Y/N)?见 pkg/cmd/util/confirm/confirm.go。其提示文案明确说明风险may cause the Velero server pod restart which will fail all ongoing jobs可能导致 Velero 服务端 Pod 重启从而中断所有进行中的任务。定位 Velero DeploymentveleroDeployment()见 pkg/cmd/cli/plugin/helpers.go通过安装标签install.Labels()筛选命名空间内的 Deployment并进一步检查其中包含名为velero的容器后才返回该 Deployment 对象。确保 plugins 卷与挂载存在源码中定义了常量pluginsVolumeName plugins、veleroContainer velero。如果 Deployment 的 Pod 模板中还没有名为plugins的卷则会补上一个emptyDir卷并在velero容器中挂载到/plugins路径。将插件追加为 init container通过builder.ForPluginContainer(args[0], imagePullPolicy, existingInitContainers)构造插件 init 容器见 pkg/builder/container_builder.go该容器会挂载同一个 plugins 卷到/target。Merge Patch 应用命令先把修改前后的 Deployment 分别 JSON 序列化用jsonpatch.CreateMergePatch生成合并补丁再通过kubeClient.AppsV1().Deployments(...).Patch(...)以MergePatchType提交到集群add.go。3.4 init 容器命名规则ForPluginContainer会为插件 init 容器自动推导名字container_builder.go 的getName函数去掉镜像的 registry 前缀仅当镜像包含 registry 且带多个/时去掉 tag 与 digestsha256:...将/、_、.统一替换为-使容器名符合 DNS-1123 规范截断到 Kubernetes 容器名 63 字符上限若与现有容器名冲突则截断到 57 字符并追加 5 位随机后缀。这解释了为什么插件镜像registry/repo/plugin:tag会在 Deployment 中显示为一个规范化后的 init 容器名。四、ark plugin remove移除插件ark_plugin_remove.md 给出的语法为ark plugin remove [NAME | IMAGE] [flags]它接受一个位置参数既可以是插件 init 容器的 NAME也可以是 IMAGE。例如# 按镜像移除 ark plugin remove gcr.io/heptio-images/velero-plugin-for-aws:v0.8.0 # 按 init 容器名移除 ark plugin remove velero-plugin-for-aws从源码 pkg/cmd/cli/plugin/remove.go 看其流程是定位 Velero Deployment → 遍历其Spec.Template.Spec.InitContainers逐一比对container.Name args[0] || container.Image args[0]→ 若未找到则报错init container arg not found in Velero server deployment→ 从 initContainers 切片中剔除该元素 → 同样以 merge patch 方式提交更新。需要注意的是remove 命令同样通过 Deployment 滚动更新生效即移除插件也会触发 Velero 服务端 Pod 重建。与 add 不同remove 在 v0.8.0 的实现中没有强制确认交互现代源码同样未为 remove 注册 confirm 标志因此执行前需自行确认目标正确。五、插件体系add/remove 操作的对象是什么ark plugin命令管理的是 Ark 的插件体系。根据 v0.8.0 文档 plugins.mdArk 通过插件架构允许用户在不修改/重新编译 Ark 核心二进制的前提下扩展备份与恢复能力。核心要点5.1 插件的四种类型Plugin Kinds插件类型职责Object Store对象存储持久化与检索备份、备份日志和恢复日志Block Store块存储备份时创建卷快照、恢复时从快照还原卷Backup Item Action备份项动作在单个资源项被写入备份文件之前执行自定义逻辑Restore Item Action恢复项动作在单个资源项被恢复到集群之前执行自定义逻辑5.2 插件命名规范Ark 依赖命名约定来识别插件每个插件二进制必须命名为ark-plugin-kind-name其中plugin-kind为objectstore、blockstore、backupitemaction或restoreitemaction之一name在同一插件类型内唯一。5.3 插件如何被加载v0.8.0 文档描述插件作者将实现了某个插件类型的二进制放进一个容器镜像该镜像作为Ark 服务端 Pod 的 init container运行把二进制拷贝到共享的emptyDir卷中供 Ark 服务端访问。这与 ark_server.md 中服务端命令的--plugin-dir选项默认/plugins以及 pkg/install/deployment.go 生成的 Deployment 完全一致velero容器将pluginsemptyDir 卷挂载到/plugins并设置环境变量LD_LIBRARY_PATH/plugins插件二进制即存放于此目录。在 pkg/plugin/clientmgmt/process/registry_test.go 的测试用例中也可以看到/plugins目录被扫描以发现可执行插件文件的逻辑。5.4 安装时指定插件与运行时动态管理除了ark plugin add的运行时管理方式安装阶段也可直接指定插件镜像。当前仓库中velero install --plugins参数对应的实现位于 pkg/install/deployment.go当c.plugins非空时逐个通过builder.ForPluginContainer把镜像追加为 Deployment 的 init container——这与ark plugin add走的是同一套容器构造逻辑只是入口不同。六、ark plugin get查询服务端插件信息虽然 v0.8.0 的 CLI 参考文档未收录但当前源码中plugin命令族还包含get子命令pkg/cmd/cli/plugin/get.go它用于获取 Velero 服务端所有插件的信息ark plugin get其实现要点默认 5 秒超时可通过--timeout调整通过ServerStatusRequest机制向服务端请求插件信息若获取失败输出error getting plugin information: ...而不中断支持output包提供的格式化标志结果可按需输出。这弥补了 add/remove 只能改不能看的短板便于确认插件是否已被服务端识别。七、现代 Velero 中的对应命令项目在 v1.0 后从 Heptio Ark 更名为 VeleroCLI 命令也由ark变为velero。在当前文档 site/content/docs/main/overview-plugins.md 中对应操作被描述为Any plugin can be added after Velero has been installed by using the commandvelero plugin add registry/image:version. In the same way, any plugin can be removed by using the commandvelero plugin remove registry/image:version.即# 安装后添加插件示例为 Docker Hub 镜像 velero plugin add velero/velero-plugin-for-aws:v1.0.0 # 移除插件 velero plugin remove velero/velero-plugin-for-aws:v1.0.0命令形态、位置参数镜像与--image-pull-policy等行为与 v0.8.0 的ark plugin add/remove保持一致可以视为同一能力在不同版本下的命名演变。若你在历史集群上维护 v0.8.x 的 Ark请使用ark plugin在 v1.x 的 Velero 上则使用velero plugin。八、相关文档导航以下为本文引用的仓库内文档与源码便于深入阅读命令参考ark_plugin.md、ark_plugin_add.md、ark_plugin_remove.md、ark.md、ark_server.md插件体系文档plugins.md、overview-plugins.md命令实现源码pkg/cmd/cli/plugin/plugin.go、pkg/cmd/cli/plugin/add.go、pkg/cmd/cli/plugin/remove.go、pkg/cmd/cli/plugin/get.go、pkg/cmd/cli/plugin/helpers.go容器构造与安装实现pkg/builder/container_builder.go、pkg/install/deployment.go、pkg/cmd/util/confirm/confirm.go九、常见问题与注意事项add 会触发服务端 Pod 重启吗会。插件以 init container 方式注入 DeploymentDeployment 变更必然触发滚动更新进行中的备份/恢复作业可能失败。命令本身也会交互式确认或使用--confirm跳过切勿在业务高峰期随意操作。remove 找不到目标怎么办ark plugin remove按 init 容器名或镜像精确匹配若拼写不一致例如镜像 tag 不同会直接报错init container not found可先用kubectl -n heptio-ark get deploy velero -o yaml查看实际的 init 容器名与镜像再执行。v0.8.0 的默认命名空间是heptio-ark执行任何ark plugin子命令时若不在该命名空间请显式指定-n。插件二进制命名约定必须遵守服务端依赖ark-plugin-kind-name的命名来识别插件类型与名称不符合规范将无法被加载。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考