Kubernetes自定义资源
外观
概述[编辑 | 编辑源代码]
Kubernetes自定义资源(Custom Resource, CR)是Kubernetes API的扩展机制,允许用户定义自己的资源类型,而无需修改Kubernetes核心代码。通过自定义资源,用户可以将特定领域的对象(如数据库配置、CI/CD流水线等)作为Kubernetes原生资源管理,实现与Pod、Deployment等内置资源一致的声明式操作。
自定义资源通常与自定义控制器(Custom Controller)结合使用,形成完整的Operator模式,实现自动化运维逻辑。
核心概念[编辑 | 编辑源代码]
自定义资源定义(CRD)[编辑 | 编辑源代码]
自定义资源通过CustomResourceDefinition(CRD)声明其结构。CRD定义了资源的API组、版本、名称及其字段规范(通过OpenAPI v3 Schema)。
以下是一个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
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
- group/version:定义API的组和版本(如`stable.example.com/v1`)。
- schema:指定资源的字段约束(如`cronSpec`必须为字符串)。
- names:定义资源在CLI和API中的名称(如`kubectl get crontab`)。
自定义资源实例[编辑 | 编辑源代码]
创建上述CRD后,用户可实例化`CronTab`资源:
apiVersion: stable.example.com/v1
kind: CronTab
metadata:
name: my-crontab
spec:
cronSpec: "* * * * */5"
image: my-cron-image
工作原理[编辑 | 编辑源代码]
1. **CRD注册**:将自定义资源的Schema注册到Kubernetes API。 2. **资源操作**:用户通过`kubectl`或API创建/更新/删除自定义资源。 3. **控制器监听**:自定义控制器监听资源变化并触发业务逻辑(如创建Pod)。
实际案例:数据库自动化[编辑 | 编辑源代码]
假设需要自动化管理PostgreSQL实例,可定义以下资源:
apiVersion: db.example.com/v1
kind: PostgreSQL
metadata:
name: prod-db
spec:
replicas: 3
storage: 100Gi
version: "14"
自定义控制器会: 1. 创建StatefulSet和Service。 2. 根据`replicas`值扩展副本。 3. 在版本变更时执行滚动升级。
高级主题[编辑 | 编辑源代码]
验证与默认值[编辑 | 编辑源代码]
通过CRD的`schema`字段可实现字段验证和默认值:
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
required: [cronSpec]
properties:
cronSpec:
type: string
pattern: '^(\*|[\d,/-]+)\s+(\*|[\d,/-]+)\s+(\*|[\d,/-]+)\s+(\*|[\d,/-]+)\s+(\*|[\d,/-]+)$'
image:
type: string
default: "alpine:latest"
子资源[编辑 | 编辑源代码]
支持`status`和`scale`子资源以实现状态报告和扩缩容:
subresources:
status: {}
scale:
specReplicasPath: .spec.replicas
statusReplicasPath: .status.replicas
数学表达[编辑 | 编辑源代码]
在控制器中,副本数计算可能涉及公式:
总结[编辑 | 编辑源代码]
- 自定义资源扩展了Kubernetes API,支持领域特定模型。
- 结合控制器实现自动化运维(Operator模式)。
- 通过CRD定义资源结构和验证规则。