返回

开源工具守护 Kubernetes CRD

见解分享

前言

Kubernetes 自定义资源定义 (CRD) 为您提供了强大的工具,可以根据您的特定需求扩展 Kubernetes 集群。通过创建自定义资源,您可以创建自己的 API 对象,这些对象可以由 Kubernetes 管理和编排。本文将指导您完成使用 CRD 扩展 Kubernetes 集群的整个过程,从编写 YAML 定义到管理和验证自定义资源。

编写 CRD

编写 CRD 时,您需要创建一个 YAML 文件来定义自定义资源的模式和行为。该文件应包括以下部分:

  • apiVersion: 指定 CRD 的 API 版本。
  • kind: 指定自定义资源的类型。
  • metadata: 包含关于自定义资源元数据的信息。
  • spec: 定义自定义资源的实际规范。

以下是编写简单 CRD 的示例 YAML 文件:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: mycustomresource.example.com
spec:
  group: example.com
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              replicas:
                type: integer
                minimum: 1
                maximum: 10

部署 CRD

要部署 CRD,请使用 kubectl 命令:

kubectl apply -f mycustomresource.yaml

创建自定义资源

部署 CRD 后,您就可以创建自定义资源。为此,请使用 kubectl create 命令,如下所示:

kubectl create -f mycustomresource-instance.yaml

管理自定义资源

一旦创建了自定义资源,就可以使用 kubectl 命令来管理它们。以下是一些常见操作:

  • 获取自定义资源:
kubectl get mycustomresource my-instance
  • 更新自定义资源:
kubectl apply -f mycustomresource-updated.yaml
  • 删除自定义资源:
kubectl delete mycustomresource my-instance

自定义操作

CRD 还允许您定义自定义操作。这些操作可以用来执行对自定义资源的特定操作。例如,您可以定义一个操作来启动或停止自定义资源。要定义自定义操作,请在 CRD 的 YAML 文件中添加 action 部分,如下所示:

...
actions:
- name: start
  verbs:
  - create
  - update
- name: stop
  verbs:
  - update
...

OpenAPI 模式

OpenAPI 模式为 CRD 提供了标准化的方式来定义其模式。这使得在不同的工具和语言之间共享和理解 CRD 变得更容易。在 CRD 的 YAML 文件中,您可以使用 openAPIV3Schema 字段来指定 OpenAPI 模式。

控制器

控制器负责管理和验证自定义资源。它们确保自定义资源符合其 CRD 中定义的模式,并执行自定义操作。您可以通过编写自己的控制器或使用现有控制器(例如 Kubernetes 的内置控制器)来管理自定义资源。

实践示例

为了演示如何使用 CRD 扩展 Kubernetes 集群,让我们创建一个示例应用程序。该应用程序将使用自定义资源来管理具有可扩展副本数的部署。

  1. 编写 CRD

首先,让我们编写一个 CRD,如下所示:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: scalabledeployments.example.com
spec:
  group: example.com
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              replicas:
                type: integer
                minimum: 1
                maximum: 10
  1. 部署 CRD

使用以下命令部署 CRD:

kubectl apply -f scalabledeployment.yaml
  1. 创建自定义资源

现在,我们可以创建一个自定义资源来管理我们的部署:

apiVersion: example.com/v1
kind: ScalableDeployment
metadata:
  name: my-scalable-deployment
spec:
  replicas: 3
  1. 创建部署

自定义资源创建后,Kubernetes 将创建一个部署,具有指定的副本数:

kubectl get deployments
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
my-scalable-deployment   3/3     3            3           14m
  1. 更新自定义资源

我们可以通过更新自定义资源来调整部署的副本数:

apiVersion: example.com/v1
kind: ScalableDeployment
metadata:
  name: my-scalable-deployment
spec:
  replicas: 5
  1. 验证自定义资源

Kubernetes 将验证自定义资源是否符合其 CRD 中定义的模式。如果自定义资源不符合模式,则 Kubernetes 将返回错误消息。

结论

通过使用 CRD,您可以扩展 Kubernetes 集群,使其适应您的特定需求。本文提供了有关如何编写、部署和管理 CRD 的全面指南。通过遵循提供的步骤和示例,您可以掌握 CRD 的各个方面,并增强您的 Kubernetes 技能。