Skip to content

自定义资源实例 Custom Resource

自定义资源定义(CustomResourceDefinition,CRD)声明了一种新的资源类型,而自定义资源(Custom Resource,CR)是这种类型在集群中的具体实例。例如 cert-manager 安装后会注册 certificates.cert-manager.io 这个 CRD,你在 Kuboard 中创建的每一个 Certificate 对象就是一个自定义资源实例。

Kuboard 在左侧导航的 定制资源 菜单下,按 CRD 的 API 分组 自动生成子菜单,不需要为每种 CR 类型单独开发页面;实例列表、创建、编辑、删除均复用 Kuboard 通用资源管理界面。

相关资源

  • 管理 CRD 本身(查看版本与 Schema、安装、卸载)见 CRD
  • 在资源全景图中,自定义资源节点也会出现,点击可跳转到对应的实例列表,见 资源全景图

入口位置

左侧导航 定制资源(Custom Resource)下有两类菜单项:

  1. 定制资源定义:CRD 列表页(集群级),始终显示;
  2. 动态子菜单:按 CRD 的 API 分组(apiGroup)分组,每组下列出该组下的资源类型(复数名),例如:
定制资源
├── 定制资源定义                  # CRD 列表
├── cert-manager.io
│   └── certificates              # Certificate 实例列表
├── monitoring.coreos.com
│   └── prometheuses              # Prometheus 实例列表
└── ...

进入实例列表有两种方式:

  1. 展开 定制资源 菜单,点击某个分组下的资源类型(如 certificates);
  2. 定制资源定义 列表页,点击某行 CRD 的 定制资源列表 按钮。

子菜单是动态生成的

实例子菜单由 Kuboard 后端从集群缓存中读取已同步的 CRD 生成:CRD 安装后,下一次缓存同步完成,菜单即出现;CRD 被卸载后菜单自动消失。集群缓存处于健康状态(ready)时才会生成菜单。

实例列表页

列表页复用 Kuboard 通用资源列表,主要列如下:

说明
选择框勾选后可用于批量删除
集群实例所在的集群
名称空间仅当该 CRD 的 spec.scopeNamespaced 时显示
名称实例名称;自定义资源没有专门的详情页,点击名称不跳转
创建时间相对时间显示,可排序
操作单行操作按钮

页面右上角提供三个通用控件:

控件说明
缓存状态该资源类型启用了 Kuboard 集群缓存时显示"缓存生效",否则显示"没有缓存"。启用缓存时列表来自缓存(支持翻页),未启用时查询请求直接转发到 Kubernetes API Server(不支持翻页)
搜索 / 树形开关树形模式在左侧按 集群 → 名称空间 过滤;搜索模式在顶部选择集群、名称空间后查询
刷新手动刷新列表,也可开启自动刷新

名称空间列随 CRD 的 scope 变化

CRD 声明为集群级(spec.scope: Cluster)的资源(如 ClusterIssuer、StorageClass 类扩展)不显示名称空间列,创建时也不需要选择名称空间;声明为名称空间级(Namespaced)的资源则两者都需要。

创建实例(从 YAML)

自定义资源实例的创建方式只有 从 YAML 创建 一种,Kuboard 不提供按 CRD Schema 生成的表单。

  1. 点击列表页右上角 创建 按钮,弹出「创建 {资源类型} 对象」对话框;
  2. 集群:选择目标集群(仅列出状态就绪的集群);
  3. 若该资源是名称空间级的,选择 名称空间
  4. 创建方式:仅提供「从 YAML 创建」;
  5. 点击 确定,Kuboard 会先检查该集群是否提供此资源,然后打开 YAML 编辑器,并预填一个模板(以 cert-manager 的 Certificate 为例):
yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  namespace: default
  name: ""
  1. 在模板基础上补充 namespec 等字段,点击 保存 提交。

提交后弹出操作结果对话框,逐条显示每个请求的执行状态(执行中/成功/失败/已取消);失败时可点击错误详情查看原因。

字段合法性由 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

自定义资源没有详情页,查看实例的完整内容(含 specstatus)以及修改字段,都通过 YAML 对话框完成。

  1. 在实例所在行的 操作 列点击 YAML,弹出「查看 YAML」对话框,内容为该对象完整序列化后的 YAML;
  2. 若当前账号对该资源拥有 update 权限,编辑器可直接修改;否则为只读;
  3. 修改完成后点击 保存,先弹出 对比 对话框,逐行展示修改前后 YAML 的差异,确认后提交(以 apply 方式写入);
  4. 提交后同样通过操作结果对话框反馈成功或失败。
修改版本"逐行对比视图 -->

系统字段自动保留

statusmetadata.managedFieldsmetadata.resourceVersionmetadata.uid 等系统字段在保存时由 Kuboard 自动保留或剔除,不需要手工处理;普通编辑只需关注 spec 与自己的标签、注解。

删除实例

删除单个实例

  1. 在实例所在行的 操作 列点击 删除,弹出「删除 K8S 对象」对话框;
  2. 对话框顶部列出该对象的集群、名称空间、对象名等信息;
  3. 请输入对象名称完整输入实例名称(防止误删),可选设置:
    • GracePeriod:宽限期秒数,0 表示不设置;
    • 波及策略(Propagation Policy):Background(默认,Kubernetes 先删对象再异步回收其依赖)、Foreground(先删除依赖再删对象)、Orphan(不级联删除依赖);不设置时由对象的 metadata.finalizer 决定;
  4. 点击 确定 执行删除,通过操作结果对话框反馈结果,成功提示"删除对象成功",列表随后自动刷新。

批量删除

  1. 勾选列表中的多行实例(第一列选择框);
  2. 点击表头的 批量删除 按钮;
  3. 若勾选条目中包含集群中仍存在的对象和缓存中已失效的条目,对话框会把两类分开列出、分别点击删除确认;确认后逐条执行并展示操作结果。

删除实例前先想清楚后果

  • 若 CRD 的 spec 中声明了 finalizers,删除后对象会进入 Terminating 状态,直到负责它的控制器完成清理并移除 finalizer 后才真正消失——列表里"删不掉"通常是 finalizer 或控制器清理流程导致的;
  • 若实例存在 ownerReferences,删除所有者时会按所有者的删除策略级联删除;
  • 删除 CR 会触发对应的自定义控制器(Operator)的回收逻辑,例如吊销证书、删除下游 Secret、释放底层资源。请先确认该 CR 被谁使用、删除后会影响什么。

常见问题

现象原因与处理
菜单里看不到某类自定义资源CRD 尚未同步到集群缓存,或集群缓存不健康。确认 CRD 已安装且集群处于就绪状态,等待下一次缓存同步
创建按钮不可用或点击后提示资源不可用当前账号缺少该资源的 create/list 权限,或目标集群未提供该 API(CRD 未安装、版本不支持)
创建/编辑时校验报错YAML 与 CRD 的 versions[].schema 不符,按操作结果对话框中的错误详情修正
删除后列表仍显示该实例对象处于 Terminating(finalizer 未清理完成),或列表正处于缓存模式尚未刷新,可点击刷新按钮