- 后端
- 企业应用
- 运维
【免费下载链接】bk-cmdb
蓝鲸智云配置平台(BlueKing CMDB)
本文基于 bk-cmdb 的 API 文档 batch_create_kube_workload.md 编写,完整讲解"批量创建 workload"接口(v3.12.1+)的请求参数结构、各字段语义、JSON 请求/响应示例与返回约定,并结合 topo_server 路由注册、coreservice 落库实现 与 类型定义 等源码给出底层原理佐证。读者阅读后能够掌握该接口的参数规范、权限要求、批量上限、错误处理方式,并可直接复制请求示例进行调用与二次开发。
接口概览
该接口用于在蓝鲸智云配置平台(BlueKing CMDB,以下简称 bk-cmdb)中批量创建 Kubernetes workload 资源,作为容器资源管理能力(集群 / 节点 / 命名空间 / workload / Pod / 容器)的一部分。
| 项目 | 说明 |
|---|---|
| 功能 | 批量创建 workload |
| 最低版本 | v3.12.1+ |
| 权限 | 容器工作负载新建 |
| HTTP 方法 | POST |
| 内部路由 | /createmany/kube/workload/{kind} |
| 单次批量上限 | 200 条(data数组长度限制) |
从源码看,该接口实际挂载在 topo_server 的 kube 服务下,路由定义为
POST /createmany/kube/workload/{kind},其中kind是路径参数(见 service.go),随后通过 apimachinery 客户端转发给 coreservice 完成真正的写入(见 coreservice kube 客户端)。API 网关(APIGW)会在此基础上封装鉴权与bk_app_code等公共参数。
请求参数
接口整体采用"公共参数 + 接口参数"的结构:bk_app_code、bk_app_secret、bk_username、bk_token等为调用方身份凭证(common args),接口自身的业务参数如下。
接口参数(顶层)
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| bk_biz_id | int | 是 | 业务 id |
| kind | string | 是 | workload 类型,目前支持deployment、daemonSet、statefulSet、gameStatefulSet、gameDeployment、cronJob、job、pods(pods 表示不通过 workload 而直接创建 Pod) |
| data | array | 是 | 数组,一次限制创建 200 条 |
kind字段在源码中被定义为WorkloadType枚举,除文档列出的 8 种外,代码中还支持customResource(自定义资源),共 9 种类型,每种类型对应一张独立的存储表(见 types.go):
| kind 取值 | 常量定义 | 对应存储表 |
|---|---|---|
| deployment | KubeDeployment | cc_DeploymentBase |
| statefulSet | KubeStatefulSet | cc_StatefulSetBase |
| daemonSet | KubeDaemonSet | cc_DaemonSetBase |
| gameStatefulSet | KubeGameStatefulSet | cc_GameStatefulSet |
| gameDeployment | KubeGameDeployment | cc_GameDeployment |
| cronJob | KubeCronJob | cc_CronJobBase |
| job | KubeJob | cc_JobBase |
| pods | KubePodWorkload | cc_PodWorkloadBase |
| customResource | KubeCustomResource | cc_CustomBase |
data数组的长度上限 200 在源码中由常量WlCreateLimit = 200控制,WlCreateOption.Validate()会校验len(data) > WlCreateLimit并返回"超出限制"错误(见 workload.go)。
data[x](单个 workload 主体)
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| bk_namespace_id | int | 是 | namespace 在 bk-cmdb 中的唯一标识 |
| name | string | 是 | workload 名称 |
| labels | map | 否 | 标签 |
| selector | object | 否 | 工作负载选择器 |
| replicas | int | 否 | 工作负载实例个数 |
| strategy_type | string | 否 | 工作负载更新机制 |
| min_ready_seconds | int | 否 | 指定新创建的 Pod 在没有任意容器崩溃情况下的最小就绪时间,只有超出这个时间 Pod 才被视为可用 |
| rolling_update_strategy | object | 否 | 滚动更新策略 |
从源码看,data数组会依据kind反序列化为对应的 workload 结构体(如Deployment),每个结构体在WorkloadBase基础上扩展Labels、Selector、Replicas、MinReadySeconds、StrategyType、RollingUpdateStrategy等字段(见 deployment.go)。其中:
replicas在类型定义中是*int64,创建时必填(WorkLoadSpecFieldsDescriptor中标记为 required)。bk_namespace_id必须指向当前业务(bk_biz_id)下已存在的命名空间,否则创建会在 namespace 校验环节失败。
selector(工作负载选择器)
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| match_labels | map | 否 | 根据 label 匹配 |
| match_expressions | array | 否 | 匹配表达式 |
源码中LabelSelector结构包含MatchLabels map[string]string与MatchExpressions []LabelSelectorRequirement,语义与 Kubernetes 一致:matchLabels与matchExpressions的结果取AND(见 workload.go)。
match_expressions[x](匹配表达式)
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| key | string | 是 | 标签的 key |
| operator | string | 是 | 操作符,可选值:In、NotIn、Exists、DoesNotExist |
| values | array | 否 | 字符串数组;如果操作符为In或NotIn,不能为空;如果为Exists或DoesNotExist,必须为空 |
四种操作符在源码中分别对应常量LabelSelectorOpIn / LabelSelectorOpNotIn / LabelSelectorOpExists / LabelSelectorOpDoesNotExist(见 workload.go),values与操作符的搭配规则与 Kubernetes 官方LabelSelectorRequirement完全一致。
rolling_update_strategy(滚动更新策略)
当strategy_type为RollingUpdate时该字段不为空,其他情况为空。
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| max_unavailable | object | 否 | 最大不可用 |
| max_surge | object | 否 | 最大溢出 |
max_unavailable / max_surge
两个字段结构相同,均采用 Kubernetes 的IntOrString语义——既可以传整数,也可以传百分比字符串:
| 字段 | 类型 | 必选 | 描述 |
|---|---|---|---|
| type | int | 是 | 可选值:0(int 类型)或1(string 类型) |
| int_val | int | 否 | 当 type 为0时不能为空,对应的 int 值 |
| str_val | string | 否 | 当 type 为1时不能为空,对应的 string 值 |
对应源码IntOrString结构:Type取值IntType = 0/StringType = 1,IntVal int32与StrVal string二选一(见 workload.go)。文档示例中两者均使用整数(max_unavailable=1、max_surge=1),也可将max_surge写成"type": 1, "str_val": "10%"形式的百分比。
请求参数示例
以下 JSON 完整示例创建 1 个 deployment 类型的 workload(位于bk_biz_id=3业务下、bk_namespace_id=1的命名空间中):
{ "bk_app_code": "esb_test", "bk_app_secret": "xxx", "bk_username": "xxx", "bk_token": "xxx", "bk_biz_id": 3, "kind": "deployment", "data": [ { "bk_namespace_id": 1, "name": "test", "labels": { "test": "test", "test2": "test2" }, "selector": { "match_labels": { "test": "test", "test2": "test2" }, "match_expressions": [ { "key": "tier", "operator": "In", "values": [ "cache" ] } ] }, "replicas": 1, "strategy_type": "RollingUpdate", "min_ready_seconds": 1, "rolling_update_strategy": { "max_unavailable": { "type": 0, "int_val": 1 }, "max_surge": { "type": 0, "int_val": 1 } } } ] }该示例与仓库中的集成测试 workload_test.go 高度一致——测试同样构造了test/test2标签、tier In [cache]的匹配表达式、RollingUpdate策略与IntOrString形式的滚动更新参数,可作为验证接口行为的对照样本。
多类型创建说明
- 一次请求中
data数组可包含多条记录,上限 200 条; kind是整个请求的公共属性,data中所有记录必须属于同一种 workload 类型;- 若需要直接创建 Pod(不经过 workload),可将
kind设为pods,此时 data 项按 Pod 结构传递。
返回结果示例
{ "result": true, "code": 0, "data": { "ids": [ 1 ] }, "message": "success", "permission": null, "request_id": "87de106ab55549bfbcc46e47ecf5bcc7" }注意:
- 返回的
data中的 workloadID 数组顺序与参数中的数组数据顺序保持一致。
也就是说,ids[i]与请求data[i]一一对应,便于调用方将新创建的 workload ID 回写到自己的业务数据中。这一约定在源码中有明确保证:coreservice 按data索引顺序批量申请自增 ID,并逐个写入respData.IDs[idx](见 workload.go)。
返回结果参数说明
response(公共返回体)
| 字段 | 类型 | 描述 |
|---|---|---|
| result | bool | 请求成功与否。true:请求成功;false:请求失败 |
| code | int | 错误编码。0 表示 success,>0 表示失败错误 |
| message | string | 请求失败返回的错误信息 |
| permission | object | 权限信息 |
| request_id | string | 请求链 id |
| data | object | 请求返回的数据 |
data
| 字段 | 类型 | 描述 |
|---|---|---|
| ids | array | 新建 workload 在 bk-cmdb 中的唯一标识数组 |
服务端处理流程与源码级原理
一次成功的批量创建在服务端大致经历以下环节:
- 路由与鉴权:topo_server 的 CreateWorkload 先从路径参数解析
kind并校验其合法性,然后解码请求体、执行参数校验,最后进行权限校验——资源类型为KubeWorkload、动作为Create,权限点对应"容器工作负载新建"。 - 事务封装:整个创建过程包裹在
AutoRunTxn事务中,创建失败时会整体回滚,避免出现部分 workload 写入成功的情况。 - 类型分派与校验:coreservice 的 CreateWorkload 根据
kind将原始 JSON 反序列化为对应 workload 结构体(WlArrayUnmarshalJSON),并逐条调用ValidateCreate()校验必填字段与取值合法性。 - ID 分配与 namespace 校验:批量调用 MongoDB 的
NextSequences按data顺序预取等量 ID;随后按bk_namespace_id批量查询 namespace,校验其归属业务是否与bk_biz_id一致(含共享 namespace 的CheckPlatBizSharedNs检查)。 - 写入与审计:数据携带创建人、创建时间等 Revision 信息批量
Insert到对应类型表(如cc_DeploymentBase),并生成审计日志(见 topo_server 审计逻辑)。 - 返回:将按序生成的 ID 数组封装为
metadata.RspIDs返回。
常见错误与排查建议
- 权限不足(permission 非空):调用账号缺少"容器工作负载新建"权限,需在 bk-cmdb 权限中心为对应业务授权。
- kind 非法:
kind不在上述枚举范围内时,WorkloadType.Validate()会返回can not support this type of workload(见 types.go),需检查路径/请求中的类型拼写。 - data 超过 200 条:触发
WlCreateLimit校验失败,需拆分多次请求。 - namespace 不存在或不属于该业务:
GetNamespaceSpec在查询不到全部 namespace 时会返回"未找到"错误(见 workload.go),请先用命名空间查询接口确认bk_namespace_id有效。 - IntOrString 传参不一致:
type=0时int_val不能为空、type=1时str_val不能为空,二者不可混填。
相关资源
- 接口文档:batch_create_kube_workload.md
- 路由注册与处理器:topo_server kube service.go、workload.go
- 数据写入实现:coreservice workload.go
- 请求/响应类型与校验规则:src/kube/types/workload.go、src/kube/types/types.go、src/kube/types/deployment.go
- 客户端封装:src/apimachinery/toposerver/kube/kube.go
- 集成测试样例:src/test/topo_server/workload_test.go
- 后端
- 企业应用
- 运维
【免费下载链接】bk-cmdb
蓝鲸智云配置平台(BlueKing CMDB)
相关推荐
蓝鲸配置平台(bk-cmdb)批量更新 Kubernetes Workload 接口实战指南
蓝鲸配置平台(bk cmdb)批量更新 Kubernetes Workload 接口实战指南 导读 本文围绕 bk cmdb(蓝鲸智云配置平台)API 网关提供
后端企业应用运维蓝鲸配置平台 bk-cmdb 批量删除 Kubernetes Workload 接口(batch_delete_kube_workload)实战指南
蓝鲸配置平台 bk cmdb 批量删除 Kubernetes Workload 接口(batch_delete_kube_workload)实战指南 本篇技术指
后端企业应用运维蓝鲸智云配置平台(BlueKing CMDB)Kubernetes workload 批量更新接口实战指南
蓝鲸智云配置平台(BlueKing CMDB)Kubernetes workload 批量更新接口实战指南 本文面向需要基于蓝鲸智云配置平台(BlueKing
后端企业应用运维
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考