Kubernetes CRD(Custom Resource Definition)

Custom Resource Definition(CRD)​​ 是 Kubernetes 中用于扩展 API 的核心机制,允许用户定义自己的资源类型(类似 Pod、Deployment 等内置资源),从而满足特定业务需求。以下是 CRD 的核心概念、使用场景及实践步骤。


一、CRD 核心概念

  1. 什么是 CRD?​

    • CRD 是一种 Kubernetes API 扩展方式,用户可通过 YAML 或代码定义新的资源类型(如 MyAppDatabase)。

    • 自定义资源(Custom Resource, CR)是 CRD 的实例,通过 kubectl 管理,与内置资源(如 Pod)操作方式一致。

  2. CRD 与 Operator 的关系

    • Operator​ = CRD + Controller:CRD 定义资源结构,Controller 监听资源变化并执行业务逻辑(如创建 Pod、配置服务)。

    • 示例:etcd-operator 通过 CRD 定义 EtcdCluster 资源,Controller 根据声明自动部署和管理 etcd 集群。

  3. CRD 的组成

    • Group​:逻辑分组(如 mycompany.com)。

    • Version​:API 版本(如 v1alpha1v1)。

    • Scope​:资源作用域(NamespacedCluster)。

    • Schema​:字段验证规则(基于 OpenAPI v3)。


二、使用场景

  1. 声明式管理复杂应用

    • 定义如 CronJobSparkCluster 等资源,描述应用期望状态。

  2. 集成外部系统

    • 通过 CRD 管理云服务(如 AWS S3 Bucket、数据库实例)。

  3. 平台即服务(PaaS)​

    • 提供自定义抽象(如 ApplicationFunction),简化用户操作。


三、创建 CRD 的步骤

1. 定义 CRD YAML
# myapp-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myapps.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                replicas:
                  type: integer
                  minimum: 1
                image:
                  type: string
  scope: Namespaced
  names:
    plural: myapps
    singular: myapp
    kind: MyApp
    shortNames: ["ma"]
2. 应用 CRD
kubectl apply -f myapp-crd.yaml
3. 创建自定义资源实例
# myapp-instance.yaml
apiVersion: example.com/v1
kind: MyApp
metadata:
  name: myapp-demo
spec:
  replicas: 3
  image: nginx:latest
kubectl apply -f myapp-instance.yaml
4. 验证资源
kubectl get myapp  # 或使用短名称 kubectl get ma
kubectl describe myapp myapp-demo

四、高级特性

  1. 版本控制与升级

    • 支持多版本共存,通过 storage: true 指定存储版本。

    • 版本转换:使用 Webhook 或保留默认的 None 策略。

  2. 字段验证(Schema)​

    • 强制校验必填字段、类型、范围等,避免配置错误。

    • 示例:replicas 必须为大于 0 的整数。

  3. Finalizers 与 Owner References

    • Finalizers​:清理资源前执行预定义操作(如删除关联的云资源)。

    • Owner References​:定义资源所属关系(如 CR 实例删除时触发 Controller 清理)。

  4. 子资源(Scale/Status)​

    • 支持自定义资源的 scalestatus 子资源,实现 HPA 自动扩缩容。

    • 示例:kubectl scale myapp myapp-demo --replicas=5


五、最佳实践

  1. 设计原则

    • 保持 CRD 简洁,避免过度复杂化。

    • 使用域名反转命名(如 example.com)避免冲突。

    • 通过 Schema 严格校验字段,提升可靠性。

  2. 调试工具

    • 查看 CRD 状态:kubectl get crd myapps.example.com -o yaml

    • 事件排查:kubectl describe crd myapps.example.com

  3. 与 Controller 集成

    • 使用 ​Kubebuilder​ 或 ​Operator SDK​ 快速生成 CRD 和 Controller 框架。

    • 监听事件:通过 Informer 监听资源的增删改操作。


六、CRD 与 Aggregation API 对比

特性

CRD

Aggregation API

扩展方式

内置 API 服务器扩展

独立 API 服务器聚合

适用场景

简单资源定义

复杂逻辑、独立 API 服务器

开发复杂度

低(YAML + Controller)

高(需实现完整 API 服务器逻辑)

性能

高(与 Kubernetes API 同进程)

依赖独立服务性能


七、总结

CRD 是 Kubernetes 扩展的基石,通过自定义资源声明应用需求,结合 Controller 实现自动化运维。掌握 CRD 的设计与使用,能够显著提升复杂应用的管理效率。下一步可深入学习 Operator 模式及工具链(如 Kubebuilder),构建完整的 Kubernetes 原生应用。