作者:Hiro OSAKI
翻译:Bach(才云)
校对:星空下的文仔(才云)、bot(才云)
CRD(Custom Resource Definition)是 Kubernetes 中的特殊资源。如果我们只是以常规方式使用 Kubernetes,那就不必创建该资源,因此,CRD 对于许多用户而言并不那么重要。但它会经常出现在前沿的博客文章、kubernetes.io 的文档和社区讨论中。本文就简单介绍一下 CRD 是什么?我们什么时候使用?一旦需要,要如何创建?
K8sMeetup
CRD 是什么?
CRD 就是一个数据库表。举个例子,我们在数据库中创建一个名为 Fruit 的表,该表包含了许多记录(record),例如 apple 、banana 和 orange。这些记录有很多列(column),如“甜度”、“味道”和“重量”,来显示水果的特性。CRD 就像一个 Fruit 表。
CR(Custom Resource,自定义资源)的每个记录(record)都类似于 apple。
创建 CRD(表)之后,我们可以添加或删除 CR(记录)。
为什么需要 CRD?因为越来越多的用户熟悉了 Kubernetes 的用法后,希望更广泛地使用它。他们将更多数据输入 Kubernetes 来使用,这些数据格式互不相同,而且不是 Kubernetes 原本就有定义的,因此他们在 Kubernetes 中创建表的种类,并设置自定义的列名或类型,就像在数据库中那样定义表,这就是 CRD 的由来。
如何创建 CRD?
如上所述,CRD 是一个表,创建表时,我们需要定义表的格式,例如列名和类型,这些元素在 CRD 文件中以 YAML 或 JSON 格式描述。
CR 以 YAML 或 JSON 格式描述记录(record)的每个值。
这是 CRD 内部详细信息。
CRD 格式分为三个部分。
常规部分(General part):与其他 Kubernetes 资源相同。元数据包括 CRD 的名称本身(
name: "fruit-crd"
等)。apiVersion
和kind
也是必需的。表级信息(Table level info):表名(
kind: "Fruit"
)、命令行的小写名称(simpler: "fruit"
)、复数形式(plural: "fruits"
)列级信息(Column level info):列名(
"sweetness"
)、列类型("boolean"、"string"、"integer"、"object")、Nested Object(props: <child object name and columns>
)。这些格式遵循 OpenAPISpecification v3。
更多详细信息可以参阅官方文档:
检验 CRD 功能
CRD 真的是表吗?下面让我们来验证一下。
有人可能不记得 CRD 的格式,这里介绍一个创建 CRD 的更简单方法,即使没有编写 CRD,只有一个“表”的定义,我们仍然可以用 Operator(CRD 自动创建工具)生成 CRD。表并不复杂,其中 columns
包含了列名称和类型。
简单定义一个“表”
在将此表安装到 Kubernetes 中之后,Operator 会自动生成以下 CRD。如果不想用 Operator,我们也可以自己生成它。如果要安装 Operator,运行以下命令:
kubectl apply -f
https://raw.githubusercontent.com/onelittlenightmusic/k8sasdb/master/install.yaml
成功安装 Operator 之后,用以下命令检查容器是否在运行:
kubectl get pod -n k8sasdb-system
NAME READY STATUS RESTARTS AGE
k8sasdb-controller-manager-9dbf54b4f-hzrt9 2/2 Running 0 8s
生成 CRD:
CRD(左:常规部分和表级信息,右:列级信息)
然后添加以下 CR:
CR "Fruit"
下面检验表和记录操作的结果:
创建表
kubectl create -f fruit.yaml
→ Success(已安装 CRD = 已创建表)
这等于 SQL 的 CREATE TABLE fruits;
。
创建记录(record)
kubectl create -f apple.yaml
→Success(已安装 CR = 已创建记录)
这等于 INSERT INTO fruits values('apple', ...);。
获取记录列表
kubectl get fruits
→Success(列出 2 个 CR,并显示每列)
这就像 SQL 查询 SELECT * FROM fruits;
结果。
获取记录
kubectl get fruit apple
→Success,这相当于 SELECT * FROM fruits WHERE name = 'apple';
。
删除记录
kubectl get fruit apple
删除后,整个列表的检查命令没有显示“apple”。
→Success。这就是 DELETE FROM fruits WHERE name = 'banana';
。
总结
CRD 只是 Kubernetes 中的一张表。
可以使用 CRD 创建新表。
可以添加带有 CR 的记录。
可以在 CRD 中定义表的 schema(列名、类型等)。
掌握 CRD、CR 和 kubectl 命令后,可以将各种数据输入 Kubernetes。
即使不记得 CRD 格式,类似 Operator 的生成器也能帮助管理 CRD。