跳转到内容

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: {}

架构图[编辑 | 编辑源代码]

graph LR User[用户] -->|创建/更新| CRD[CRD定义] CRD -->|注册到| APIServer[Kubernetes API Server] APIServer -->|存储| etcd[(etcd)] User -->|操作| CR[自定义资源] CR -->|遵循| CRD

数学公式(可选)[编辑 | 编辑源代码]

如果需要定义资源配额的计算,可以使用公式: TotalQuota=i=1n(Resourcei×Weighti)

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

CRD是Kubernetes扩展的核心机制,允许用户灵活定义和管理自定义资源。通过结合校验、子资源等特性,可以实现复杂的业务逻辑集成到Kubernetes中。初学者应从简单的CRD定义开始,逐步探索高级功能。