- 云原生
- 后端
- 微服务
【免费下载链接】nuclio
High-Performance Serverless event and data processing platform
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-gateways | bool | false | 是否将函数连同其关联的 API Gateway 一并删除 |
--with-api-gateways的行为在 delete.go 中体现:当值为false时,若函数仍挂有 API Gateway,删除会被平台层拒绝(详见下文“API Gateway 关联校验”);为true时则会先级联删除全部关联 Gateway 再删除函数。
继承自父命令的全局参数
以下参数由根命令nuctl注册(定义见 pkg/nuctl/command/nuctl.go),对delete functions同样生效:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
-f, --force | bool | false | 强制删除资源,跳过函数状态校验(详见下文) |
--concurrency | int | CPU 核心数(文档默认示例为 4) | 并行处理的最大数量,主要作用于批量 patch 类操作 |
-k, --kubeconfig | string | 空 | Kubernetes 配置文件(admin.conf)路径,Kube 平台必用 |
-n, --namespace | string | 环境变量NUCTL_NAMESPACE | 函数所在命名空间,未设置环境变量时默认为空 |
--platform | string | auto | 平台标识:kube、local或auto(自动探测) |
--mask-sensitive-fields | bool | false | 开启敏感字段脱敏显示 |
-v, --verbose | bool | false | 输出详细日志 |
平台与命名空间还支持环境变量覆盖:--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,核心流程如下:
- 删除前校验:调用
ValidateDeleteFunctionOptions,校验失败即终止; - API Gateway 处理:若未开启
--with-api-gateways,先校验函数名下不存在 API Gateway;若已开启,则查询该函数关联的全部 Gateway 并逐个删除(见下文“canary 保护”); - 删除函数 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
相关推荐
nuclio nuctl delete functionevents 命令详解:删除函数事件(Function Event)
nuclio nuctl delete functionevents 命令详解:删除函数事件(Function Event) 导读 在 nuclio 高性能 S
云原生后端微服务nuctl delete 命令详解:Nuclio 资源删除的完整参数指南与源码级实现剖析
nuctl delete 命令详解:Nuclio 资源删除的完整参数指南与源码级实现剖析 nuctl delete 是 Nuclio 命令行工具(nuctl)中
云原生后端微服务Nuclio nuctl delete apigateways 命令全解:删除 API 网关的用法、参数与底层实现
Nuclio nuctl delete apigateways 命令全解:删除 API 网关的用法、参数与底层实现 导读 nuctl delete apigat
云原生后端微服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考