作者: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 的由来。

K8sMeetup

如何创立 CRD?

如上所述,CRD 是一个表,创立表时,咱们须要定义表的格局,例如列名和类型,这些元素在 CRD 文件中以 YAML 或 JSON 格局形容。

CR 以 YAML 或 JSON 格局形容记录(record)的每个值。

这是 CRD 外部详细信息。

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/ta...

K8sMeetup

测验 CRD 性能

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

有人可能不记得 CRD 的格局,这里介绍一个创立 CRD 的更简略办法,即便没有编写 CRD,只有一个“表”的定义,咱们依然能够用 Operator(CRD 主动创立工具)生成 CRD。表并不简单,其中 columns 蕴含了列名称和类型。

简略定义一个“表”

在将此表装置到 Kubernetes 中之后,Operator 会主动生成以下 CRD。如果不想用 Operator,咱们也能够本人生成它。如果要装置 Operator,运行以下命令:

kubectl apply -f 
https://raw.githubusercontent...

胜利装置 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';

K8sMeetup

总结

  • CRD 只是 Kubernetes 中的一张表。
  • 能够应用 CRD 创立新表。
  • 能够增加带有 CR 的记录。
  • 能够在 CRD 中定义表的 schema(列名、类型等)。
  • 把握 CRD、CR 和 kubectl 命令后,能够将各种数据输出 Kubernetes。
  • 即便不记得 CRD 格局,相似 Operator 的生成器也能帮忙治理 CRD。

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