☰
nuclio nuctl delete functions 命令详解:函数删除的完整指南
2026/10/12 2:02:13 网站建设 项目流程
  • 云原生
  • 后端
  • 微服务

【免费下载链接】nuclio

High-Performance Serverless event and data processing platform

项目地址:https://gitcode.com/gh_mirrors/nu/nuclio
点击查看免费下载

nuctl delete functions是 Nuclio 平台(pkg/nuctl/command/delete.go)中用于删除已部署函数的 CLI 命令,支持按名称或“名称:版本”定位函数,并提供了--with-api-gateways、--force等关键选项。读完本文你将掌握该命令的完整语法、全部参数语义、删除流程的底层实现(含幂等性、状态校验与 API Gateway 级联删除),以及如何在 Kube 与 Local 两种平台上正确、安全地删除函数。

命令概览:语法与别名

nuctl delete functions [name[:version]] [flags]
  • 位置参数name[:version]用于指定要删除的函数。version部分可选,格式为函数名:版本号或函数名:latest;不写版本时仅按函数名删除。
  • 命令同时注册了function、fu、fn三个别名(见 delete.go),因此以下写法完全等价:
nuctl delete functions my-func nuctl delete function my-func nuctl delete fu my-func nuctl delete fn my-func

从源码看,命令执行器要求必须且只能传入一个位置参数,否则会直接报错Function delete requires an identifier(delete.go)。参数会被写入functionconfig.Config.Meta.Name,并与当前命名空间一起构造成删除请求。

name[:version]的解析语义

参数中的版本号由 pkg/nuctl/resourceid.go 中的ParseResourceIdentifier解析:

  • 只传名称(如my-func):直接按名称删除;
  • 版本为latest(如my-func:latest):仍按原始名称删除;
  • 版本为数字(如my-func:3):实际删除名为my-func-3的资源,即按“名称-版本”拼接后的资源名查找并删除。

若版本号既非latest也非数字,validateVersion会拒绝该参数并返回错误,避免误删。

参数详解

本命令专属参数

参数类型默认值说明
-h, --help--显示functions子命令的帮助信息
--with-api-gatewaysboolfalse是否将函数连同其关联的 API Gateway 一并删除

--with-api-gateways的行为在 delete.go 中体现:当值为false时,若函数仍挂有 API Gateway,删除会被平台层拒绝(详见下文“API Gateway 关联校验”);为true时则会先级联删除全部关联 Gateway 再删除函数。

继承自父命令的全局参数

以下参数由根命令nuctl注册(定义见 pkg/nuctl/command/nuctl.go),对delete functions同样生效:

参数类型默认值说明
-f, --forceboolfalse强制删除资源,跳过函数状态校验(详见下文)
--concurrencyintCPU 核心数(文档默认示例为 4)并行处理的最大数量,主要作用于批量 patch 类操作
-k, --kubeconfigstring空Kubernetes 配置文件(admin.conf)路径,Kube 平台必用
-n, --namespacestring环境变量NUCTL_NAMESPACE函数所在命名空间,未设置环境变量时默认为空
--platformstringauto平台标识:kube、local或auto(自动探测)
--mask-sensitive-fieldsboolfalse开启敏感字段脱敏显示
-v, --verboseboolfalse输出详细日志

平台与命名空间还支持环境变量覆盖:--platform的默认值来自NUCTL_PLATFORM,--namespace的默认值来自NUCTL_NAMESPACE(nuctl.go)。

实战用法示例

# 1. 按名称删除函数(默认命名空间) nuctl delete functions my-func # 2. 指定命名空间删除 nuctl delete functions my-func -n my-namespace # 3. 删除指定版本的函数(等价于删除名为 my-func-3 的资源) nuctl delete functions my-func:3 # 4. 删除函数的同时级联删除其 API Gateway nuctl delete functions my-func --with-api-gateways # 5. 跳过状态校验强制删除(例如函数正在部署/初始化中) nuctl delete functions my-func --force # 6. 使用别名 + 指定 Kube 平台与配置文件 nuctl delete fu my-func --platform kube -k /path/to/admin.conf -v

删除流程底层实现:从 CLI 到平台层

执行delete functions时,CLI 层会构造platform.DeleteFunctionOptions(结构定义见 pkg/platform/types.go),包含函数配置、DeleteApiGateways、IgnoreFunctionStateValidation(由--force触发),然后调用平台接口DeleteFunction。Kube 与 Local 两种平台实现路径略有差异。

Kube 平台:三步删除

Kube 平台的完整实现位于 pkg/platform/kube/platform.go,核心流程如下:

  1. 删除前校验:调用ValidateDeleteFunctionOptions,校验失败即终止;
  2. API Gateway 处理:若未开启--with-api-gateways,先校验函数名下不存在 API Gateway;若已开启,则查询该函数关联的全部 Gateway 并逐个删除(见下文“canary 保护”);
  3. 删除函数 CR:由 pkg/platform/kube/clients/nuclio/deleter.go 通过 Kubernetes clientset 删除对应的NuclioFunction自定义资源。若函数携带ResourceVersion(如通过name:version指定),删除时会附加metav1.Preconditions做乐观锁校验;删除时遇到NotFound会被当作成功处理(幂等删除)。

删除前的校验逻辑(幂等性与状态约束)

校验逻辑集中在 pkg/platform/abstract/platform.go:

  • 幂等性:先按名称查询目标函数,若函数已不存在,直接返回“无需删除”(日志提示Function was not found (deleted already?)),因此重复执行删除命令不会报错;
  • 资源版本校验:若删除选项中携带了ResourceVersion,会与当前函数配置比对,版本不一致时返回冲突错误;
  • 状态校验:默认不允许删除正在部署/供给中(provisioning)的函数,会返回Function is being provisioned and cannot be deleted的 412 错误;而--force会设置IgnoreFunctionStateValidation = true(delete.go)跳过该校验;
  • OPA 权限校验:若平台启用了 OPA,删除动作需要具备delete权限,否则被拒绝。

API Gateway 关联校验与 canary 保护

  • 未带--with-api-gateways时,若函数仍关联着 API Gateway,删除会被拒绝——用户必须先清理 Gateway 再删函数;
  • 带--with-api-gateways时,删除前会逐一检查每个 Gateway 的Upstreams:如果某个 Gateway 存在两个上游(即该函数被用作 canary 灰度发布中的一份子),则禁止删除,并报错it is used in canary api gateway(platform.go)。

Local 平台与--force的适用边界

Local 平台的删除实现见 pkg/platform/local/platform.go:同样先执行ValidateDeleteFunctionOptions,再调用本地 store 删除函数。需要注意的是,--force强制删除目前仅支持 Kube 平台——测试 pkg/nuctl/test/function_test.go 中明确注释Force delete is currently not supported on local platform,并在运行于 Local 平台时跳过该测试用例。

测试验证:删除行为的可复现证据

仓库中的集成测试覆盖了删除命令的关键行为(pkg/nuctl/test/function_test.go):

  • 正常删除:nuctl delete fu <函数名> --force后执行nuctl get functions,输出中不再包含该函数名;
  • 强制删除正在部署中的函数:测试先异步发起deploy,等待 3 秒后立即用--force删除,随后验证:invoke失败(函数已不存在)、原deploy命令最终报错(部署被打断)。这从端到端证明了--force能够绕过“部署中不可删”的状态限制。

相关阅读

  • 删除命令的父命令与兄弟子命令:nuctl delete(projects / functionevents / apigateways)
  • 函数配置结构(Meta.Name、Meta.Namespace、Meta.ResourceVersion):pkg/functionconfig/types.go
  • 删除选项结构定义:pkg/platform/types.go
  • 函数部署与状态概念:部署函数
  • 云原生
  • 后端
  • 微服务

【免费下载链接】nuclio

High-Performance Serverless event and data processing platform

项目地址:https://gitcode.com/gh_mirrors/nu/nuclio
点击查看免费下载
上一篇:Apache Mesos 如何集成 moodycamel::ConcurrentQueue:版本钉扎策略、双构建系统接入与 libprocess 无锁运行队列实现
下一篇:WarcraftHelper:魔兽争霸3终极优化指南,三步解锁300帧率与完美宽屏体验

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询