Kubernetes自定义资源定义(CRD)
外观
Kubernetes自定义资源定义(CRD)[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
Kubernetes自定义资源定义(Custom Resource Definition, CRD)是Kubernetes的一种扩展机制,允许用户定义自己的资源类型,而无需修改Kubernetes核心代码。通过CRD,用户可以将自定义API对象集成到Kubernetes生态系统中,从而扩展集群的功能。CRD通常用于定义特定领域的资源(如数据库、监控配置或CI/CD流水线),并通过Kubernetes原生工具(如`kubectl`)管理这些资源。
核心概念[编辑 | 编辑源代码]
什么是自定义资源(CR)?[编辑 | 编辑源代码]
自定义资源是Kubernetes中的一种对象,其结构和行为由CRD定义。与内置资源(如Pod、Deployment)不同,CR是用户定义的,用于满足特定需求。
CRD的作用[编辑 | 编辑源代码]
CRD允许用户:
- 定义新的资源类型(如`MyDatabase`或`NetworkPolicyRule`)。
- 通过Kubernetes API服务器管理这些资源。
- 使用`kubectl`或其他Kubernetes工具与自定义资源交互。
定义CRD[编辑 | 编辑源代码]
以下是一个简单的CRD示例,定义一个名为`CronTab`的资源:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
replicas:
type: integer
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
字段说明[编辑 | 编辑源代码]
- group:自定义资源的API组(如`stable.example.com`)。
- versions:支持的API版本,包括是否启用(`served`)和存储(`storage`)。
- schema:定义资源的结构(使用OpenAPI v3规范)。
- scope:资源作用域(`Namespaced`或`Cluster`)。
- names:定义资源的复数、单数形式及缩写。
创建自定义资源[编辑 | 编辑源代码]
定义CRD后,可以创建对应的自定义资源实例:
apiVersion: stable.example.com/v1
kind: CronTab
metadata:
name: my-crontab
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 2
实际案例[编辑 | 编辑源代码]
场景:定义数据库资源[编辑 | 编辑源代码]
假设需要定义一个`Database`资源来管理数据库实例:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: databases.example.com
spec:
group: example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
engine:
type: string
version:
type: string
storageGB:
type: integer
scope: Namespaced
names:
plural: databases
singular: database
kind: Database
创建实例:
apiVersion: example.com/v1
kind: Database
metadata:
name: mysql-db
spec:
engine: mysql
version: "5.7"
storageGB: 100
输出验证[编辑 | 编辑源代码]
使用`kubectl get databases`查看资源:
$ kubectl get databases
NAME AGE
mysql-db 10s
高级特性[编辑 | 编辑源代码]
校验与默认值[编辑 | 编辑源代码]
通过CRD的`schema`字段可以定义校验规则和默认值:
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
required: ["engine"] # 必填字段
properties:
engine:
type: string
enum: ["mysql", "postgresql"] # 枚举值
storageGB:
type: integer
minimum: 10 # 最小值
default: 20 # 默认值
子资源[编辑 | 编辑源代码]
CRD支持`status`和`scale`子资源,例如启用`status`:
spec:
versions:
- name: v1
subresources:
status: {}
架构图[编辑 | 编辑源代码]
数学公式(可选)[编辑 | 编辑源代码]
如果需要定义资源配额的计算,可以使用公式:
总结[编辑 | 编辑源代码]
CRD是Kubernetes扩展的核心机制,允许用户灵活定义和管理自定义资源。通过结合校验、子资源等特性,可以实现复杂的业务逻辑集成到Kubernetes中。初学者应从简单的CRD定义开始,逐步探索高级功能。