Kubernetes 中如何进行自定义 API 的开发和扩展

阅读时长 10 分钟读完

作为一款容器编排平台,Kubernetes(以下简称 K8s)可以方便地扩展自定义 API 并通过这些 API 操作 Kubernetes 资源。 本文将介绍如何以 Kubernetes API 为基础,开发自定义 API 并且在 K8s 上进行部署。

Kubernetes API 概述

K8s 的 API 主要分为两类:固定资源对象和自定义资源对象。固定资源对象已经由 Kubernetes 定义好了,如 Pod、 Service、 ConfigMap 等等。而自定义资源对象则是用户在 K8s 中定义的新的资源类型,可以通过 API server 进行操作。 Kubernetes API 采用 RESTful 设计原则和 JSON 格式表示资源对象。

CRD(Custom Resource Definition)

CRD 是 Kubernetes 中的一种自定义资源类型。通过 CRD,我们可以在 K8s 中定义新的 API 路径,通过这些 API 路径与自定义资源进行交互。CRD 定义了一组资源 API 和对应的对象格式,可以通过 K8s API Server 进行访问。

如何进行自定义 API 的开发

开发自定义 API 通常需要了解以下内容:

  • Kubernetes API 的基础知识
  • CRD 的基础知识
  • Kubebuilder 工具包的使用

Kubebuilder 是一个由 Kubernetes SIG API-Machinery 维护的工具包,可以提供用于开发自定义 Kubernetes API 的框架和工具。我们使用 Kubebuilder 来完成自定义 API 的开发和部署。

1. 安装 Kubebuilder 工具包

安装完成后,将 Kubebuilder 工具包的 bin/ 目录加入到系统的 PATH 变量中,这样可以在终端通过 kubebuilder 命令来使用工具包的命令。

2. 创建项目

使用 Kubebuilder 的命令行工具来创建自定义 API 项目:

这个命令会生成一个带有 API 的项目基本结构:

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

其中,api/v1alpha1 目录下的代码用于定义在 Kubebuilder 中创建的自定义资源对象的 API 扩展模型。可以通过更改 myresource_types.go 文件来定义自己的资源对象。

3. 定义自定义资源对象

我们将定义一个名为 MyResource 的自定义资源对象。我们将在 Kubernetes 中创建自定义 API 的扩展,通过这个 API 接口来创建 MyResource 类型的资源。

打开 api/v1alpha1/myresource_types.go 文件并添加以下内容:

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

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

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

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

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

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

这里我们添加了 MyResourceSpecMyResourceStatus 结构体以及 MyResourceMyResourceList 两个自定义资源类型。MyResource 结构体包含一个 Spec 字段和一个 Status 字段,分别是 MyResourceSpecMyResourceStatus 类型,这两个类型可以定义自己需要的字段。此外,我们在 MyResource 结构体中添加 metav1.TypeMetametav1.ObjectMeta 字段,用于定义与 Kubernetes API 相关的元数据。

最后,init() 函数用于在内部定义的资源类型中注册自定义资源 API。

4. 实现自定义控制器

我们需要为自定义资源申明如何响应 Kubernetes 的事件,这可以通过编写控制器的代码来实现。打开 controllers/myresource_controller.go 文件并添加以下内容:

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

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

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

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

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

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

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

这里定义了一个名为 MyResourceReconciler 的控制器,MyResourceReconciler 中下一步将会在相应的 Reconcile() 函数中完成对自定义资源事件的处理。

此外,在 MyResourceReconciler 中添加 client.Client 字段,用于获取和操作 Kubernetes 资源,包括 K8s 中的存储对象。其中,myv1alpha1.MyResource 是在 api/v1alpha1/myresource_types.go 中定义的自定义资源类型。

最后,通过 SetupWithManager() 方法将控制器与管理器关联起来,这个管理器将会管理自定义资源对象类型,且当有相应的事件发生时,会通知相关的控制器。

5. 安装和部署自定义资源 API

使用 Kubebuilder 的命令行工具来为我们的自定义 API 生成 kubernetes 部署 yaml 文件。

完成之后,我们可以在 Kubernetes 集群中使用 kubectl 来操作自定义资源了:

总结

在本文中,我们学习了如何在 Kubernetes 中开发自定义资源 API 和控制器,以及如何使用 Kubebuilder 工具包。希望这篇文章能为正在使用 Kubernetes 平台的工程师们提供指导和帮助,让大家可以开发出更方便易用的自定义 API。

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

纠错
反馈