自定义资源定义(CRD)完全指南
1. 核心概念:什么是CRD?
自定义资源定义(tion,简称CRD)是官方提供的原生扩展机制,允许用户在集群中定义自己的资源类型,使其像内置的Pod、等资源一样,通过和 API进行管理。
简单来说,CRD让您能够:
创建符合业务需求的定制化资源
使用 /get//等标准命令操作自定义资源
通过 API进行统一的资源管理
核心价值: CRD将从单一的容器编排平台,升级为可编程的应用平台底座。
2. CRD的核心组成结构
一个标准的CRD定义(YAML格式)包含以下关键字段:
| 字段路径 | 必填 | 说明 | 示例值 |
|---|---|---|---|
|
是 | CRD API版本,固定为 .k8s.io/v1 |
.k8s.io/v1 |
kind |
是 | 固定为 tion |
tion |
.name |
是 | CRD名称,格式为 <>.<group> |
|
spec.group |
是 | API组名,通常使用域名格式 | |
spec.names |
是 | 资源名称配置 | 见下方详细说明 |
spec.scope |
是 | 资源作用域:(命名空间级)或 (集群级) |
|
spec. |
是 | 版本列表,支持多版本共存 | 见下方详细说明 |
spec. |
否 | v3 结构定义(强烈推荐) | 见下方详细说明 |
2.1 spec.names 字段详解
names:
: # 复数名称,用于命令
: # 单数名称
kind: # 资源类型名称,驼峰式
: # 短名称,可选
ct
2.2 spec. 字段详解
:
name: v1 # 版本名称
: true # 是否启用此版本API
: true # 是否作为存储版本(每个CRD有且仅有一个)
: # 定义
:
type:
:
spec:
type:
:
:
type:
image:
type:
:
type:
3. 快速创建CRD:从0到1操作指南
3.1 前置条件
集群版本 v1.16+(推荐v1.22+以获得最佳稳定性)
具有集群管理员权限(能够创建CRD)
已配置并可连接集群
3.2 创建CRD示例:定义一个资源
步骤1:编写CRD定义文件 -crd.yaml
: .k8s.io/v1
kind: tion
:
name:
spec:
group:
names:
:
:
kind:
:
ct
scope:
:
name: v1
: true
: true
:
:
type:
:
spec:
type:
:
:
type:
image:
type:
:
type:
:
image
步骤2:应用CRD定义
apply -f -crd.yaml
# 输出: tion..k8s.io/
步骤3:验证CRD创建成功
# 查看所有CRD
get crd
# 查看CRD详细信息
crd
# 查看自定义资源是否可用
get # 或 get ct
# 输出: No found in .
步骤4:创建自定义资源实例
编写 my-.yaml:
: /v1
kind:
:
name: my-new-cron-
spec:
: "/5 "
image: "my-cron-image:"
: 3
应用并验证:
apply -f my-.yaml
# 输出: /my-new-cron-
get
# 输出:
# NAME AGE
# my-new-cron- 10s
my-new-cron-
# 输出包含spec等详细信息
3.3 删除CRD(注意:会级联删除所有自定义资源)
crd
4. CRD设计最佳实践
4.1 API组与版本命名规范
| 规范项 | 要求 | 正确示例 | 错误示例 |
|---|---|---|---|
| API组名 | 必须使用域名格式 | |
|
| 版本名 | v1, , 等 | v1, |
|
| 资源Kind | 驼峰式,首字母大写 | , |
|
4.2 结构定义()强制要求
必须提供 ,原因:
提供API请求的自动验证
生成准确的文档
命令能够显示字段说明
可以通过进行代码生成
编写规范:
:
:
type:
:
spec:
type:
:
# 所有字段必须明确类型
:
type: # 或 , , array,
: "字段说明" # 强烈推荐添加描述
: "^[a-z]+$" # 正则验证(可选)
: 1 # 数值范围(可选)
: 100
: # 必填字段列表
: # 字段通常由管理
type:
:
:
type:
:
type: array
4.3 作用域选择决策
| 场景 | 推荐作用域 | 原因 |
|---|---|---|
| 应用配置类资源 | |
多租户隔离,避免资源冲突 |
| 集群级别基础设施 | |
如Node、等全局资源 |
| 跨命名空间共享资源 | |
需要被多个命名空间引用 |
4.4 多版本管理策略
版本共存规则:
每个CRD可以有多个 : true 的版本
有且仅有一个 : true 版本
版本转换通过或自动转换实现
版本演进建议:
1. 新增版本时:新版本 : true,保持旧版本 : true
2. 稳定后切换存储版本:将新版本设为 : true,旧版本 : false
3. 移除版本前:确保没有资源使用该版本,观察期至少3个月
5. 常见问题与解决方案
Q1: 更新CRD定义时失败,提示 “the spec is “
原因: 对CRD spec的变更有限制,某些字段不可变。
解决方案:
# 方法1:删除后重建(会删除所有自定义资源实例)
crd <crd-name>
apply -f new-crd.yaml
# 方法2:使用 --force
--force -f new-crd.yaml
# 方法3:保留现有CRD,通过新版本添加字段(推荐)
# 在spec.中添加新版本,将新字段放在新版本中
不可变字段清单:
spec.group
spec.names.kind
spec.scope
spec.[</>]. 中的现有字段类型(不能修改已有字段类型)
Q2: 如何调试CRD创建的资源无法写入etcd?
排查步骤:
# 1. 查看CRD状态
get crd <crd-name> -o yaml | grep -A5
# 2. 检查API服务是否可用
get | grep <group>
# 3. 查看API服务器日志(需要访问节点)
# 常见错误:验证失败,字段类型不匹配
# 4. 使用 验证
<kind> --
Q3: 如何让支持自定义资源的自动补全?
在CRD的 spec.names 中正确配置 :
names:
:
ct # 之后可以使用 get ct
Q4: CRD支持哪些字段类型?
| 类型 | 类型 | 示例 |
|---|---|---|
"hello" |
||
| int64 | 10 |
|
| bool | true |
|
| array | []{} | ["a","b"] |
| map[]{} | {"key":"value"} |
|
| null | nil | null |
6. 实战:完整的企业级CRD示例
场景:定义一个MySQL数据库集群资源
文件:-crd.yaml
: .k8s.io/v1
kind: tion
:
name:
spec:
group:
names:
:
:
kind:
:
mc
scope:
:
name: v1
: true
: true
:
:
type:
:
spec:
type:
:
:
type:
: "MySQL "
: "^[0-9]+\.[0-9]+\.[0-9]+$"
: "8.0.33"
:
type:
: " of MySQL "
: 1
: 10
: 1
:
type:
:
size:
type:
: "^[0-9]+(Gi|Mi)$"
:
type:
:
size
:
type:
:
:
type:
:
type:
:
:
:
type:
:
phase:
type:
enum:
:
type:
:
type: array
items:
type:
:
type:
type:
:
type:
:
type:
: date-time
创建并使用:
# 1. 创建CRD
apply -f -crd.yaml
# 2. 创建MySQL集群实例
cat <<EOF | apply -f -
: /v1
kind:
:
name: -mysql
spec:
: "8.0.33"
: 3
:
size: "100Gi"
: "fast-ssd"
:
: true
: "0 2 *"
EOF
# 3. 查看集群状态
get -mysql -o yaml
7. 高级主题:CRD与的协作
CRD本身只是数据定义,要实现自动化管理,必须配合 (控制器)工作。
典型的模式架构:
1. CRD定义资源期望状态(spec)
2. 监听CRD资源的变更
3. 创建/管理Pod、等基础资源
4. 将实际状态写回字段
开发的常用框架:
| 框架 | 语言 | 适用场景 |
|---|---|---|
| Go | 官方推荐,生产级 | |
| SDK | Go//Helm | Red Hat支持,功能丰富 |
| kopf | 快速原型开发 | |
| 任意语言 | 轻量级框架 |
8. 权威参考资源
| 资源类型 | 来源 | 地址 |
|---|---|---|
| 官方文档 | .io | .io/docs//-/api-/-/ |
| API参考 | .io | .io/docs//-api/-/—v1/ |
| 规范 | /oas/v3.1.0 | |
| 文档 | book..io/ |
9. 总结:CRD核心要点
1. 本质定位:CRD是的原生扩展机制,将集群变为可编程平台
2. 强制规范:必须使用域名格式的group、必须提供
3. 版本管理:支持多版本共存,仅一个版本,字段类型不可变
4. 作用域选择:根据资源性质选择或
5. 完整方案:CRD通常需要配合才能实现自动化管理
6. 最佳实践:使用或 SDK构建生产级扩展
按照本文档操作,您可以在30分钟内完成第一个CRD的创建和使用,并在理解核心原理后,设计出符合生态规范的企业级自定义资源。

