.jpg)
Kubernetes CRD
Kubernetes CRD(Custom Resource Definition)
Custom Resource Definition(CRD) 是 Kubernetes 中用于扩展 API 的核心机制,允许用户定义自己的资源类型(类似 Pod、Deployment 等内置资源),从而满足特定业务需求。以下是 CRD 的核心概念、使用场景及实践步骤。
一、CRD 核心概念
什么是 CRD?
CRD 是一种 Kubernetes API 扩展方式,用户可通过 YAML 或代码定义新的资源类型(如
MyApp
、Database
)。自定义资源(Custom Resource, CR)是 CRD 的实例,通过
kubectl
管理,与内置资源(如 Pod)操作方式一致。
CRD 与 Operator 的关系
Operator = CRD + Controller:CRD 定义资源结构,Controller 监听资源变化并执行业务逻辑(如创建 Pod、配置服务)。
示例:
etcd-operator
通过 CRD 定义EtcdCluster
资源,Controller 根据声明自动部署和管理 etcd 集群。
CRD 的组成
Group:逻辑分组(如
mycompany.com
)。Version:API 版本(如
v1alpha1
、v1
)。Scope:资源作用域(
Namespaced
或Cluster
)。Schema:字段验证规则(基于 OpenAPI v3)。
二、使用场景
声明式管理复杂应用
定义如
CronJob
、SparkCluster
等资源,描述应用期望状态。
集成外部系统
通过 CRD 管理云服务(如 AWS S3 Bucket、数据库实例)。
平台即服务(PaaS)
提供自定义抽象(如
Application
、Function
),简化用户操作。
三、创建 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
四、高级特性
版本控制与升级
支持多版本共存,通过
storage: true
指定存储版本。版本转换:使用 Webhook 或保留默认的
None
策略。
字段验证(Schema)
强制校验必填字段、类型、范围等,避免配置错误。
示例:
replicas
必须为大于 0 的整数。
Finalizers 与 Owner References
Finalizers:清理资源前执行预定义操作(如删除关联的云资源)。
Owner References:定义资源所属关系(如 CR 实例删除时触发 Controller 清理)。
子资源(Scale/Status)
支持自定义资源的
scale
和status
子资源,实现 HPA 自动扩缩容。示例:
kubectl scale myapp myapp-demo --replicas=5
。
五、最佳实践
设计原则
保持 CRD 简洁,避免过度复杂化。
使用域名反转命名(如
example.com
)避免冲突。通过 Schema 严格校验字段,提升可靠性。
调试工具
查看 CRD 状态:
kubectl get crd myapps.example.com -o yaml
事件排查:
kubectl describe crd myapps.example.com
与 Controller 集成
使用 Kubebuilder 或 Operator SDK 快速生成 CRD 和 Controller 框架。
监听事件:通过 Informer 监听资源的增删改操作。
六、CRD 与 Aggregation API 对比
七、总结
CRD 是 Kubernetes 扩展的基石,通过自定义资源声明应用需求,结合 Controller 实现自动化运维。掌握 CRD 的设计与使用,能够显著提升复杂应用的管理效率。下一步可深入学习 Operator 模式及工具链(如 Kubebuilder),构建完整的 Kubernetes 原生应用。