CRD 就像 Kubernetes 中的一张表!

作者: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 表。

CRD 就像 Kubernetes 中的一张表!

CR(Custom Resource,自定义资源)的每个记录(record)都类似于 apple。

CRD 就像 Kubernetes 中的一张表!

创建 CRD(表)之后,我们可以添加或删除 CR(记录)。

为什么需要 CRD?因为越来越多的用户熟悉了 Kubernetes 的用法后,希望更广泛地使用它。他们将更多数据输入 Kubernetes 来使用,这些数据格式互不相同,而且不是 Kubernetes 原本就有定义的,因此他们在 Kubernetes 中创建表的种类,并设置自定义的列名或类型,就像在数据库中那样定义表,这就是 CRD 的由来。

如何创建 CRD?

如上所述,CRD 是一个表,创建表时,我们需要定义表的格式,例如列名和类型,这些元素在 CRD 文件中以 YAML 或 JSON 格式描述。

CR 以 YAML 或 JSON 格式描述记录(record)的每个值。

CRD 就像 Kubernetes 中的一张表!

这是 CRD 内部详细信息。

CRD 就像 Kubernetes 中的一张表!

CRD 格式分为三个部分。

  • 常规部分(General part):与其他 Kubernetes 资源相同。元数据包括 CRD 的名称本身(name: "fruit-crd"等)。apiVersionkind 也是必需的。

  • 表级信息(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。

更多详细信息可以参阅官方文档:

https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#create-a-customresourcedefinition

检验 CRD 功能

CRD 真的是表吗?下面让我们来验证一下。

有人可能不记得 CRD 的格式,这里介绍一个创建 CRD 的更简单方法,即使没有编写 CRD,只有一个“表”的定义,我们仍然可以用 Operator(CRD 自动创建工具)生成 CRD。表并不复杂,其中 columns 包含了列名称和类型。
CRD 就像 Kubernetes 中的一张表!

简单定义一个“表”

在将此表安装到 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 就像 Kubernetes 中的一张表!

CRD(左:常规部分和表级信息,右:列级信息)

然后添加以下 CR:
CRD 就像 Kubernetes 中的一张表!

CR "Fruit"

下面检验表和记录操作的结果:

创建表

kubectl create -f fruit.yaml

CRD 就像 Kubernetes 中的一张表!

→ Success(已安装 CRD = 已创建表)

CRD 就像 Kubernetes 中的一张表!

这等于 SQL 的 CREATE TABLE fruits;

创建记录(record)

kubectl create -f apple.yaml

CRD 就像 Kubernetes 中的一张表!

→Success(已安装 CR = 已创建记录)

这等于 INSERT INTO fruits values('apple', ...);。

获取记录列表

kubectl get fruits

CRD 就像 Kubernetes 中的一张表!

→Success(列出 2 个 CR,并显示每列)

这就像 SQL 查询 SELECT * FROM fruits; 结果。

获取记录

kubectl get fruit apple

CRD 就像 Kubernetes 中的一张表!

→Success,这相当于 SELECT * FROM fruits WHERE name = 'apple';

删除记录

kubectl get fruit apple

CRD 就像 Kubernetes 中的一张表!

删除后,整个列表的检查命令没有显示“apple”。

CRD 就像 Kubernetes 中的一张表!

→Success。这就是 DELETE FROM fruits WHERE name = 'banana';

总结

  • CRD 只是 Kubernetes 中的一张表。

  • 可以使用 CRD 创建新表。

  • 可以添加带有 CR 的记录。

  • 可以在 CRD 中定义表的 schema(列名、类型等)。

  • 掌握 CRD、CR 和 kubectl 命令后,可以将各种数据输入 Kubernetes。

  • 即使不记得 CRD 格式,类似 Operator 的生成器也能帮助管理 CRD。

原文链接:https://mp.weixin.qq.com/s/YNELBbUZ1pUnCanVlVkxOg

猜你喜欢

转载自blog.51cto.com/14133165/2539664