在 Kubernetes 集群中,自定义资源定义 (CRD) 是一种扩展 Kubernetes API 的机制。他们将我们的应用程序定义的自定义资源与 Kubernetes API 中提供的原生资源相集成,从而提供了更直接、更丰富的访问方式。本文将详细介绍在 Kubernetes 中使用 CRD 扩展 API 的方法和技巧,以及说明如何在进行此项工作时获得最佳效果。
1. 什么是自定义资源定义 (CRD)
自定义资源定义是 Kubernetes API 中的一个强大机制,它使得用户可以将他们的自定义资源与 Kubernetes API 直接集成。一个自定义资源 (CR) 代表了一个用户定义的对象,它与 Kubernetes API 中核心的 API 对象类似,比如 Pod、Service、ReplicaSet……自定义资源可以被 Kubernetes 的控制器管理和自动化,比如基于多个自定义资源间的条件或状态做自动扩缩容或升级等操作。在 Kubernetes 中使用自定义资源定义,我们可以更容易地创建访问用户自定义应用程序定义资源的代码库,同时又能自然地与 Kubernetes 内建 API 对象集成,使用 Kubernetes 中提供的众多构建工具、部署方式和监控手段等。
2. 自定义资源定义 (CRD) 的优势和价值
在 Kubernetes 集群中定义自定义资源,可以带来以下几个优势和价值:
2.1 增强 Kubernetes API 的能力
在 Kubernetes 中,CRD 可以让我们定义 Kubernetes API 中不存在的资源类型。例如,我们可以定义一个 MyApp
资源类型,用于描述一个自定义的应用程序对象,他有自己的属性、标签和元数据等。Kubernetes 的控制器可以尝试来理解、处理 MyApp
对象,从而带来更加高效的自动部署、扩缩容等能力。
2.2 提高可读性、清晰性和灵活性
使用自定义资源定义进行开发时,可以使代码结构更加清晰,并明确定义对象的类型和层级结构。此外,可以为自定义资源定义提供自定义的 Name/Value 属性,使其更加透明、易于使用,使其读取和理解更加普遍化和易用。
2.3 满足特定的应用程序场景和需求
自定义资源定义适用于那些需要表达嵌套结构、难以用标准 API 对象类型进行表示的应用程序场景和需求。作为一种能在 Kubernetes 环境中得到支持的自定义方案,CRD 能够为满足用户的特殊需求而开发特定的数据类型、对象结构和处理方式等。
3. 如何使用自定义资源定义 (CRD)
使用自定义资源定义通常包括以下几个步骤:
3.1 定义自定义资源的结构和元素
在 Kubernetes 中创建自定义资源首先需要确定自身的资源结构和元素,即定义以下元素:
- 资源名称:资源名称通常由两个或多个单词组成,名字空间 URL 的格式应该使用短划线 (-) 作为连接符,如:mycoolapp.com/v1alpha1。
- 规范元素:CRD 必须定义一个规范的元素。规范定义了自定义资源的实际内容,它由一个或多个类型字段组成,并允许使用
JSONSchema
语法定义数据类型和验证规则。 - 状态元素:状态是当前打开的自定义资源的实际状态。状态包含的元素可以使得内部处理程序能够明确监控和控制对象的状态。状态总是由 API 服务器管理,并且它只能被更新或修改。
定义自定义资源的元素示例:
kubectl edit crd mycoolapp.com/v1alpha1/mycoolapp.yaml
-- -------------------- ---- ------- ----------- --------------------------- ----- ------------------------ --------- ----- ------------- ----- ------ ------------- -------- -------- ------ ---------- ------ ------- --------- --------- --------- ----- --------- ----------- ---------------- ----- ------ ----------- ----------- ----- ------ ----- ----- ------ --------- ----- ------ ----------- ----- ----- ------ ---------- - ---------- -- ----- ----- ------ ----------- --------- ----- ------- -------- ----- ------ --------- ------------ ---------- ------- ----- ------ ----------- ---------- ----- ------- --------- -------------
3.2 创建自定义资源定义对象 (CRD)
创建自定义资源定义之前,需要将 CRD YAML 定义文件部署到 Kubernetes 集群中。一旦部署成功,就可以使用自定义资源对象了,而且他会自然地使用 Kubernetes API 对象中的访问方式控制。
创建自定义资源定义对象示例:
kubectl create -f mycoolapp.yaml
3.3 创建自定义资源对象
使用如下示例创建 MyCoolApp 对象:
apiVersion: mycoolapp.com/v1alpha1 kind: MyCoolApp metadata: name: mycoolapp-sample spec: replicas: 2 version: v0.1
这样就成功创建了一个 MyCoolApp
对象,它在定义时使用了规范元素,其中规定了 replicas
和 version
的值。状态元素的值是空的,Kubernetes 会在控制器中自动生成。
3.4 访问和修改自定义资源对象
访问和修改自定义资源对象的方式和普通的 Kubernetes API 对象类似,具体命令如下:
- 获取一个自定义资源对象
kubectl get mycoolapp mycoolapp-sample -n <namespace>
- 更新一个自定义资源对象
kubectl edit mycoolapp mycoolapp-sample -n <namespace>
- 删除一个自定义资源对象
kubectl delete mycoolapp mycoolapp-sample -n <namespace>
4. 总结
本文详细地介绍了在 Kubernetes 中使用自定义资源定义 (CRD) 扩展 API 的方法和技巧,并给出了相应的示例代码。使用 CRD,我们可以方便地定义属于自己特定的数据类型和对象结构,从而提高应用程序的可读性、清晰性、可扩展性和可维护性等,同时也可以使得更好地与 Kubernetes 原生 API 对象进行集成和交互,从而使得应用程序开发和调试工作更加高效、灵活和便捷。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b344e348841e9894f86883