CustomResourceDefinition(CRD)
在Kubernetes中,像Pod、Service和Deployment这样的资源是由内置的资源类型如Pod、Service和Deployment表示的。而CustomResourceDefinition(CRD)允许你定义和创建自己的资源类型,以满足您的应用程序或基础设施需求。
一旦定义了CRD,可以通过Kubernetes API服务器创建和管理自定义资源的实例,就像处理任何其他本机资源一样。这意味着您可以使用熟悉的Kubernetes工具如kubectl或Kubernetes控制器与管理您的自定义资源进行交互。
CRD提供了一种扩展Kubernetes平台以适应特定要求的方式,并能够构建自定义的运算符或控制器来自动化管理自定义资源。运算符可以监视自定义资源的更改并相应地采取操作,例如提供额外的资源、扩展或执行自定义操作。
示例:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
# 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
name: crontabs.stable.example.com
spec:
# 组名称,用于 REST API: /apis/<组>/<版本>
group: stable.example.com
# 列举此 CustomResourceDefinition 所支持的版本
versions:
- name: v1
# 每个版本都可以通过 served 标志来独立启用或禁止
served: true
# 其中一个且只有一个版本必需被标记为存储版本
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
replicas:
type: integer
# 可以是 Namespaced 或 Cluster
scope: Namespaced
names:
# 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
plural: crontabs
# 名称的单数形式,作为命令行使用时和显示时的别名
singular: crontab
# kind 通常是单数形式的驼峰命名(CamelCased)形式。你的资源清单会使用这一形式。
kind: CronTab
# shortNames 允许你在命令行使用较短的字符串来匹配资源
shortNames:
- ct
常见字段:
- apiVersion:指定所使用的 CRD API 的版本,此示例使用了 apiextensions.k8s.io/v1 版本。
- kind:定义资源类型为 CustomResourceDefinition。
- metadata:定义元数据,其中 name 字段指定了 CRD 的名称为 myresources.example.com。
- spec:定义了 CRD 的规范。
- spec.group:指定 CRD 所属的 API 组,此示例中为 example.com。
- spec.versions:定义 CRD 的版本列表。
- spec.versions.name:指定版本的名称,此示例中为 v1。
- spec.versions.served:指定此版本是否由 API 服务器提供服务,设为 true 表示提供服务。
- spec.versions.storage:指定此版本是否持久化存储数据,设为 true 表示持久化存储。
- spec.versions.schema.openAPIV3Schema: 指定自定义资源的 OpenAPI v3 架构定义
- spec.scope:指定资源的作用域,此示例中为 Namespaced,表示资源在命名空间级别进行管理。
- spec.names:定义了资源的名称相关信息。
- spec.names.plural:指定资源的复数形式名称,此示例中为 crontabs。
- spec.names.singular:指定资源的单数形式名称,此示例中为 crontab。
- spec.names.kind:指定资源的类型名称,此示例中为 CronTab。
- spec.names.shortNames:指定资源的缩略名称列表,此示例中只包含一个缩略名称 ct。
Operator
Operator 是 Kubernetes 的扩展软件, 它利用定制资源管理应用及其组件。 Operator 遵循 Kubernetes 的理念,特别是在控制器方面。
Operator 模式 旨在记述(正在管理一个或一组服务的)运维人员的关键目标。 这些运维人员负责一些特定的应用和 Service,他们需要清楚地知道系统应该如何运行、如何部署以及出现问题时如何处理。
Kubernetes 的 Operator 模式概念允许你在不修改 Kubernetes 自身代码的情况下, 通过为一个或多个自定义资源关联控制器来扩展集群的能力。 Operator 是 Kubernetes API 的客户端, 充当自定义资源的控制器。
使用 Operator 可以自动化的事情包括:
- 按需部署应用
- 获取/还原应用状态的备份
- 处理应用代码的升级以及相关改动。例如数据库 Schema 或额外的配置设置
- 发布一个 Service,要求不支持 Kubernetes API 的应用也能发现它
- 模拟整个或部分集群中的故障以测试其稳定性
- 在没有内部成员选举程序的情况下,为分布式应用选择首领角色
常见使用场景:
- 按需部署一个应用程序,并自动配置,比如Prometheus
- 需要备份和恢复应用程序的状态,如MySQL数据库
- 处理应用程序代码的升级以及相关更改,例如数据库架构或额外的配置设置
- 发布一个服务,要让不支持Kubernetes API的应用程序能够发现
- 模拟整个或部分集群中的故障以测试其弹性
- 在没有内部成员选举程序的情况下为分布式应用程序选择领导者