作为一款容器编排平台,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 curl -L -O https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.1.0/kubebuilder_3.1.0_linux_amd64.tar.gz # 解压 kubebuilder tar -zxvf kubebuilder_3.1.0_linux_amd64.tar.gz sudo mv kubebuilder_3.1.0_linux_amd64 /usr/local/kubebuilder
安装完成后,将 Kubebuilder 工具包的 bin/
目录加入到系统的 PATH
变量中,这样可以在终端通过 kubebuilder
命令来使用工具包的命令。
2. 创建项目
使用 Kubebuilder 的命令行工具来创建自定义 API 项目:
# 创建 API 项目 kubebuilder init --domain example.com # 创建自定义API资源定义 kubebuilder create api --group yourgroup --version v1alpha1 --kind MyResource
这个命令会生成一个带有 API 的项目基本结构:
-- -------------------- ---- ------- - --- --- --- ---------- --- ------ --- ------ --- ------- --- -------- --- -------------------- --- ------- --- ---- --- --- --- -------- --- -------------------- --- ------------------- --- ------------------------ --- ----------- --- ------------------------
其中,api/v1alpha1
目录下的代码用于定义在 Kubebuilder 中创建的自定义资源对象的 API 扩展模型。可以通过更改 myresource_types.go
文件来定义自己的资源对象。
3. 定义自定义资源对象
我们将定义一个名为 MyResource
的自定义资源对象。我们将在 Kubernetes 中创建自定义 API 的扩展,通过这个 API 接口来创建 MyResource
类型的资源。
打开 api/v1alpha1/myresource_types.go
文件并添加以下内容:
-- -------------------- ---- ------- -- -------------- ------------ -- --------------------- ---- -------------- ------ - -- ----------- -- --- ------ ------------ - -- ---------------- ------------ -- --------------------- ---- ---------------- ------ - -- ----------- -- --- ------ ------------ - -- ----------------------------- -- -------------------------------------- -- ------------------------------- -- ------------------------------------------------------------ --- ----- -- --- ----- -- -------------------------------------------------------------- --- ----- -- --- ------- -- ---------- --------- --- ---- ---- ---------- ------ - --------------- ---------------- ----------------- --------------------------- ---- -------------- ----------------------- ------ ---------------- ------------------------- - -- ----------------------------- -- -------------- ------------- ---- -------------- ------ - --------------- ---------------- --------------- --------------------------- ----- ------------ -------------- - ---- ------ - ------------------------------------- ------------------ -
这里我们添加了 MyResourceSpec
和 MyResourceStatus
结构体以及 MyResource
和 MyResourceList
两个自定义资源类型。MyResource
结构体包含一个 Spec
字段和一个 Status
字段,分别是 MyResourceSpec
和 MyResourceStatus
类型,这两个类型可以定义自己需要的字段。此外,我们在 MyResource
结构体中添加 metav1.TypeMeta
和 metav1.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 文件。
# 运行 make 安装k8s相关依赖包 make # 打包镜像 make docker-build docker-push IMG=myimage:v1.0.0 # 生成 kubernetes 部署 yaml make deploy IMG=myimage:v1.0.0
完成之后,我们可以在 Kubernetes 集群中使用 kubectl 来操作自定义资源了:
kubectl apply -f config/samples/yourgroup_v1alpha1_myresource.yaml kubectl get myresource
总结
在本文中,我们学习了如何在 Kubernetes 中开发自定义资源 API 和控制器,以及如何使用 Kubebuilder 工具包。希望这篇文章能为正在使用 Kubernetes 平台的工程师们提供指导和帮助,让大家可以开发出更方便易用的自定义 API。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae66e748841e9894a71230