Kubernetes 中的自定义资源定义详解

阅读时长 6 分钟读完

随着 Kubernetes 越来越成为云计算和容器化部署的主流平台,扩展 Kubernetes 系统来满足各种需求也变得越来越重要。其中,自定义资源定义 (Custom Resource Definitions, CRDs) 是 Kubernetes 中非常重要的一个扩展机制。本文将详细介绍 Kubernetes 中的 CRDs,包括定义、使用和扩展方法。

概述

CRD 是 Kubernetes 中允许用户定义自己的 API 资源的一种机制。使用 CRD,用户可以定义一些新的 Kubernetes 资源类型,并使用 Kubernetes API 对其进行管理。这些自定义资源使得 Kubernetes 贴近用户的实际需求,将 Kubernetes 的功能扩展到各种新领域。

使用 CRD,可以非常方便地添加自定义资源类型,为 Kubernetes 中的应用提供了很大的灵活性和扩展性。例如,我们可以定义一种名为 MyCRD 的资源类型,其规则和行为类似于 Kubernetes 内置的 Deployment 资源类型。然后,我们就可以使用 kubectl 命令来管理这些 MyCRD 类型的资源了。

定义 CRD

定义 CRD 的方式是通过 API 扩展来对 Kubernetes API 进行扩展。API 扩展是指运用 Kubernetes API 向 Kubernetes 中添加新的 Kubernetes API 对象。一个常见的 API 扩展的例子是,将一个新状态项添加到 Pod 对象中。通过 API 扩展定义 CRD 与定义 Kubernetes 内置资源的方式类似,都是使用 YAML 或 JSON 格式的 Kubernetes API 对象来定义 CRD 对象。

定义 CRD 的 YAML 文件格式如下:

-- -------------------- ---- -------
----------- ----------------------------
----- ------------------------
---------
  ----- ------------------  - ---
-----
  ------ -----------       - ----
  -------- --
  ------ ----------        - ---------- ------- - ----------
  ------
    ------- ------         - ------------- ----------------------------------------------
    --------- -----
    ----- -----
    -----------
    - --                  - -----
  -----------
      ----------------
        -----------       - ----
          -----
            -----------
              ---------
                ----- -------
                -------- -
              ---------
                ----- ------
                -----------
                  ---------
                    ----- ------
                    -----------
                      -------
                        ----- ------

通过 API 扩展方式自定义资源,首先是通过 apiVersionkind 来指明当前扩展对象的 API 版本和类型,然后在 spec 子元素中指定需要自定义的资源类型,包括资源的元信息、其所属组、版本和作用域等。其中,metadata 用于指定资源的名称和标记等关键元素。

names 元素可以帮助我们更好地管理我们的资源类型,其中 singularplural 用于定义资源的名称,kind 是 Kubernetes API 对象的类型名称,shortNames 是一个可选的字符串数组,用于支持缩写的资源。

validation 是关于资源对象的 JSON schema,其中声明了对 CRD 有效的规则,防止意外破坏资源数据。在 CRD 中可以通过 OpenAPI v3 来描述验证模式 schema,如上述代码片段中的 openAPIV3Schema 就是定义 MyCRD 资源规则的部分。

此外,CRD 还支持定义 webhooks,以及重写 Kubernetes 内置 API 服务器的其他行为。

使用 CRD

当定义了新的 CRD 资源后,我们就可以使用 Kubernetes API 来管理这些资源。通过 kubectl 命令可以获得这些资源,例如:

另外,我们还可以在 namespace 中创建实例,如下:

-- -------------------- ---- -------
----------- --------------
----- -----
---------
  ----- -------------- - ---
  ---------- -------   - ---- ---------
-----
  --------- -          - ----
  ---------
    ---------
      -------
        ---- -----
    -----
      -----------
      - ----- -----
        ------ -----

扩展 CRD

Kubernetes 中的 CRD 是可扩展的,通过定义自己的 CRD 可以为 Kubernetes 带来很大的灵活性和扩展性。当然,为了更好地支持 CRD,Kubernetes 还提供了很多相关的 API 和工具,例如 Swagger 和 OpenAPI Specification (OAS)。

此外,我们可以使用 Go 语言来开发我们自己的 CRD,使用 Kubernetes 提供的 API 和 SDK 类库来访问和控制这些资源。举个例子,假设我们希望创建一个新的类型的 CRD,用于表示运行在 Kubernetes 中的 CronJob,我们可以定义一个名为 CronTab 的 CRD:

-- -------------------- ---- -------
---- ------- ------ -
  --------------- ----------------
  ----------------- ---------------------------
  ---- ----------- -----------------------
-

---- ----------- ------ -
  -------- ------ ----------------
  ----- ------ --------------
-

---- ----------- ------ -
  --------------- ----------------
  --------------- ---------------------------
  ----- --------- --------------
-

此外,我们还需实现 Kubernetes 中 ResourceCollection, CreaterWatcher 接口来实现 CRD 的 CRUD 操作及监听功能。

总结

通过本文,我们详细介绍了 Kubernetes 中的自定义资源定义 (CRDs),包括定义 CRD、使用 CRD 和扩展 CRD 等内容。CRD 使得 Kubernetes 更加灵活和可扩展,可以为 Kubernetes 提供更多更广泛的应用场景和解决方案。我们相信,随着 Kubernetes 的不断发展壮大,越来越多的用户会使用自定义资源定义来扩展 Kubernetes。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cf6a86b5eee0b5256ba0eb

纠错
反馈