k8s的CRD自定义资源类型示例
目录
- 引言
- 一、什么是CRD
- 1、定义与作用
- 2、核心特性
- 二、应用示例
- 1、创建CRD
- 2、创建CR实例
引言
前面我们说到《k8s Ingress、Service配置各样例大全》,今天整理这篇文章的背景是我们经常在k8s一站式平台中可以看到CRD的菜单,然后打开菜单可以看到一系列的CRD定义。这些其实就是自定的扩展API,用户定义和管理的一些自定义资源类型。
再者我们经常可以看到我们自主定义的apiVersion在ingress中的使用(但这应该是插件不是CRD同理,后续展开)。
一、什么是CRD
CRD(Custom Resource Definition)是Kubernetes中用于扩展API的核心机制,允许用户定义和管理自定义资源类型(如MyApp、Database等),使其能够像原生资源(如Pod、Service)一样被创建和管理。以下是其关键点及示例:
核心概念
1、定义与作用
CRD通过声明新的资源类型(如apiVersion: v1和kind: MyResource)扩展Kubernetes API,用户可通过kubectl直接操作这些资源。
CRD:定义资源的Schema(字段、验证规则等),相当于资源的“模板”。
CR(Custom Resource):CRD的实例,是实际创建的具体资源对象。
2、核心特性
扩展性:突破Kubernetes内建资源的限制,支持领域特定需求(如数据库、机器学习任务)。
声明式API:通过YAML文件定义资源状态,Kubernetes自动维护其生命周期。
控制器(Controller):需配合自定义控制器实现业务逻辑(如自动扩缩容),否则CRD仅存储数据而无实际功能。
二、应用示例
场景:定义并管理一个MySQL数据库集群。
1、创建CRD
以下是MySQLCluster CRD的完整YAML定义示例,其中通过spec.names.kind
字段显式声明了资源类型名称为 MySQLCluster
。
# mysql-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:name: mysqlclusters.mysql.presslabs.org
spec:group: mysql.presslabs.orgversions:- name: v1alpha1served: truestorage: trueschema:openAPIV3Schema:type: objectproperties:spec:type: objectproperties:replicas:type: integerminimum: 1secretName:type: stringstorage:type: objectproperties:size:type: stringpattern: '-9]\d*Gi$'scope: Namespacednames:kind: MySQLCluster # 核心声明点plural: mysqlclusters # 复数形式,用于API路径singular: mysqlclustershortNames: ["mysql"]
关键设计说明:
- API组与版本:通过
group
和versions
字段声明API路径为mysql.presslabs.org/v1alpha1; - Schema验证:openAPIV3Schema定义了字段校验规则(如storage.size必须符合10Gi格式);
- 命名约定:names块中的kind值需首字母大写且无特殊字符,plural用于生成API端点路径;
- 存储配置:通过storage: true标记该版本为持久化版本。
2、创建CR实例
以下是基于前述MySQLCluster CRD定义的CR实例YAML,该示例会创建一个3节点MySQL集群,配置10Gi存储空间:
# mysql-cluster-instance.yaml
apiVersion: mysql.presslabs.org/v1alpha1
kind: MySQLCluster
metadata:name: production-mysqlnamespace: database
spec:replicas: 3secretName: mysql-root-passwordstorage:size: 10GipodSpec:resources:requests:cpu: "1"memory: "2Gi"
关键配置说明:
- 严格匹配CRD定义的API组和版本(mysql.presslabs.org/v1alpha1);
- spec字段完全遵循CRD的openAPIV3Schema验证规则;
- 扩展了CRD未定义的podSpec字段(假设控制器支持该特性);
- 存储大小格式必须符合正则校验(如10Gi)。
- 注:实际使用时需确保已部署对应的MySQL Operator控制器来监听该资源类型。
MySQL Operator本质上是一个运行在Kubernetes中的控制器,它持续监控集群状态,确保实际状态与用户期望状态一致。