CRD 就像 Kubernetes 中的一张表!

Stella981
• 阅读 609

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这