跳转到内容

Kubernetes自定义资源

来自代码酷

模板:Note

概述[编辑 | 编辑源代码]

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

工作原理[编辑 | 编辑源代码]

graph LR CRD[CustomResourceDefinition] -->|定义| API[Kubernetes API] User -->|创建| CR[Custom Resource] Controller -->|监听| CR Controller -->|执行逻辑| Cluster

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

数学表达[编辑 | 编辑源代码]

在控制器中,副本数计算可能涉及公式: 实际副本数=max(spec.replicas,minReplicas)

总结[编辑 | 编辑源代码]

  • 自定义资源扩展了Kubernetes API,支持领域特定模型。
  • 结合控制器实现自动化运维(Operator模式)。
  • 通过CRD定义资源结构和验证规则。

模板:Tip