K8s CRD是啥?怎么用?一文讲透自定义资源定义

2026-03-25 0 639

自定义资源定义(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 的版本

Kubernetes自定义资源定义(CRD)

有且仅有一个 : 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的创建和使用,并在理解核心原理后,设计出符合生态规范的企业级自定义资源。

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

七爪网 行业资讯 K8s CRD是啥?怎么用?一文讲透自定义资源定义 https://www.7claw.com/2827027.html

七爪网源码交易平台

相关文章