自定义资源实例 Custom Resource
自定义资源定义(CustomResourceDefinition,CRD)声明了一种新的资源类型,而自定义资源(Custom Resource,CR)是这种类型在集群中的具体实例。例如 cert-manager 安装后会注册 certificates.cert-manager.io 这个 CRD,你在 Kuboard 中创建的每一个 Certificate 对象就是一个自定义资源实例。
Kuboard 在左侧导航的 定制资源 菜单下,按 CRD 的 API 分组 自动生成子菜单,不需要为每种 CR 类型单独开发页面;实例列表、创建、编辑、删除均复用 Kuboard 通用资源管理界面。
入口位置
左侧导航 定制资源(Custom Resource)下有两类菜单项:
- 定制资源定义:CRD 列表页(集群级),始终显示;
- 动态子菜单:按 CRD 的 API 分组(apiGroup)分组,每组下列出该组下的资源类型(复数名),例如:
定制资源
├── 定制资源定义 # CRD 列表
├── cert-manager.io
│ └── certificates # Certificate 实例列表
├── monitoring.coreos.com
│ └── prometheuses # Prometheus 实例列表
└── ...进入实例列表有两种方式:
- 展开 定制资源 菜单,点击某个分组下的资源类型(如
certificates); - 在 定制资源定义 列表页,点击某行 CRD 的 定制资源列表 按钮。
子菜单是动态生成的
实例子菜单由 Kuboard 后端从集群缓存中读取已同步的 CRD 生成:CRD 安装后,下一次缓存同步完成,菜单即出现;CRD 被卸载后菜单自动消失。集群缓存处于健康状态(ready)时才会生成菜单。
实例列表页
列表页复用 Kuboard 通用资源列表,主要列如下:
| 列 | 说明 |
|---|---|
| 选择框 | 勾选后可用于批量删除 |
| 集群 | 实例所在的集群 |
| 名称空间 | 仅当该 CRD 的 spec.scope 为 Namespaced 时显示 |
| 名称 | 实例名称;自定义资源没有专门的详情页,点击名称不跳转 |
| 创建时间 | 相对时间显示,可排序 |
| 操作 | 单行操作按钮 |
页面右上角提供三个通用控件:
| 控件 | 说明 |
|---|---|
| 缓存状态 | 该资源类型启用了 Kuboard 集群缓存时显示"缓存生效",否则显示"没有缓存"。启用缓存时列表来自缓存(支持翻页),未启用时查询请求直接转发到 Kubernetes API Server(不支持翻页) |
| 搜索 / 树形开关 | 树形模式在左侧按 集群 → 名称空间 过滤;搜索模式在顶部选择集群、名称空间后查询 |
| 刷新 | 手动刷新列表,也可开启自动刷新 |
名称空间列随 CRD 的 scope 变化
CRD 声明为集群级(spec.scope: Cluster)的资源(如 ClusterIssuer、StorageClass 类扩展)不显示名称空间列,创建时也不需要选择名称空间;声明为名称空间级(Namespaced)的资源则两者都需要。
创建实例(从 YAML)
自定义资源实例的创建方式只有 从 YAML 创建 一种,Kuboard 不提供按 CRD Schema 生成的表单。
- 点击列表页右上角 创建 按钮,弹出「创建 {资源类型} 对象」对话框;
- 集群:选择目标集群(仅列出状态就绪的集群);
- 若该资源是名称空间级的,选择 名称空间;
- 创建方式:仅提供「从 YAML 创建」;
- 点击 确定,Kuboard 会先检查该集群是否提供此资源,然后打开 YAML 编辑器,并预填一个模板(以 cert-manager 的 Certificate 为例):
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
namespace: default
name: ""- 在模板基础上补充
name与spec等字段,点击 保存 提交。
提交后弹出操作结果对话框,逐条显示每个请求的执行状态(执行中/成功/失败/已取消);失败时可点击错误详情查看原因。
字段合法性由 API Server 校验
Kuboard 只负责把 YAML 提交给 Kubernetes,不会根据 CRD 的 versions[].schema(OpenAPI v3)做表单化输入。YAML 中是否缺少 required 字段、字段 type 是否匹配、枚举值是否合法,都由 API Server 在写入时校验:
- 校验通过:对象创建成功,列表页出现新条目;
- 校验失败:操作结果对话框中该请求标记为失败,错误详情给出原因(例如
spec.dnsNames: Required value),按提示修正 YAML 后重新提交即可。
这也意味着:写 YAML 前应参照 CRD 文档或 kubectl explain <kind> 了解字段结构。
查看与编辑 YAML
自定义资源没有详情页,查看实例的完整内容(含 spec 与 status)以及修改字段,都通过 YAML 对话框完成。
- 在实例所在行的 操作 列点击 YAML,弹出「查看 YAML」对话框,内容为该对象完整序列化后的 YAML;
- 若当前账号对该资源拥有
update权限,编辑器可直接修改;否则为只读; - 修改完成后点击 保存,先弹出 对比 对话框,逐行展示修改前后 YAML 的差异,确认后提交(以
apply方式写入); - 提交后同样通过操作结果对话框反馈成功或失败。
系统字段自动保留
status、metadata.managedFields、metadata.resourceVersion、metadata.uid 等系统字段在保存时由 Kuboard 自动保留或剔除,不需要手工处理;普通编辑只需关注 spec 与自己的标签、注解。
删除实例
删除单个实例
- 在实例所在行的 操作 列点击 删除,弹出「删除 K8S 对象」对话框;
- 对话框顶部列出该对象的集群、名称空间、对象名等信息;
- 在 请输入对象名称 处完整输入实例名称(防止误删),可选设置:
- GracePeriod:宽限期秒数,0 表示不设置;
- 波及策略(Propagation Policy):
Background(默认,Kubernetes 先删对象再异步回收其依赖)、Foreground(先删除依赖再删对象)、Orphan(不级联删除依赖);不设置时由对象的metadata.finalizer决定;
- 点击 确定 执行删除,通过操作结果对话框反馈结果,成功提示"删除对象成功",列表随后自动刷新。
批量删除
- 勾选列表中的多行实例(第一列选择框);
- 点击表头的 批量删除 按钮;
- 若勾选条目中包含集群中仍存在的对象和缓存中已失效的条目,对话框会把两类分开列出、分别点击删除确认;确认后逐条执行并展示操作结果。
删除实例前先想清楚后果
- 若 CRD 的
spec中声明了finalizers,删除后对象会进入Terminating状态,直到负责它的控制器完成清理并移除 finalizer 后才真正消失——列表里"删不掉"通常是 finalizer 或控制器清理流程导致的; - 若实例存在
ownerReferences,删除所有者时会按所有者的删除策略级联删除; - 删除 CR 会触发对应的自定义控制器(Operator)的回收逻辑,例如吊销证书、删除下游 Secret、释放底层资源。请先确认该 CR 被谁使用、删除后会影响什么。
常见问题
| 现象 | 原因与处理 |
|---|---|
| 菜单里看不到某类自定义资源 | CRD 尚未同步到集群缓存,或集群缓存不健康。确认 CRD 已安装且集群处于就绪状态,等待下一次缓存同步 |
| 创建按钮不可用或点击后提示资源不可用 | 当前账号缺少该资源的 create/list 权限,或目标集群未提供该 API(CRD 未安装、版本不支持) |
| 创建/编辑时校验报错 | YAML 与 CRD 的 versions[].schema 不符,按操作结果对话框中的错误详情修正 |
| 删除后列表仍显示该实例 | 对象处于 Terminating(finalizer 未清理完成),或列表正处于缓存模式尚未刷新,可点击刷新按钮 |