天天看点

使用 CRD 扩展您的 Kubernetes API

关注微信公众号《云原生CTO》更多云原生干货等你来探索
使用 CRD 扩展您的 Kubernetes API

云原生CTO

专注于云原生领域kubernetes、istio、serverless、prometheus、golang、rust核心技术二次开发课程打造及技术经验分享,为你云原生之旅保驾护航!

专注于 ​<code>​云原生技术​</code>​ 分享

提供优质 ​<code>​云原生开发​</code>​ 视频技术培训

​<code>​面试技巧​</code>​,及技术疑难问题 ​<code>​解答​</code>​

使用 CRD 扩展您的 Kubernetes API

云原生技术分享不仅仅局限于​<code>​Go​</code>​、​<code>​Rust​</code>​、​<code>​Python​</code>​、​<code>​Istio​</code>​、​<code>​containerd​</code>​、​<code>​CoreDNS​</code>​、​<code>​Envoy​</code>​、​<code>​etcd​</code>​、​<code>​Fluentd​</code>​、​<code>​Harbor​</code>​、​<code>​Helm​</code>​、​<code>​Jaeger​</code>​、​<code>​Kubernetes​</code>​、​<code>​Open Policy Agent​</code>​、​<code>​Prometheus​</code>​、​<code>​Rook​</code>​、​<code>​TiKV​</code>​、​<code>​TUF​</code>​、​<code>​Vitess​</code>​、​<code>​Argo​</code>​、​<code>​Buildpacks​</code>​、​<code>​CloudEvents​</code>​、​<code>​CNI​</code>​、​<code>​Contour​</code>​、​<code>​Cortex​</code>​、​<code>​CRI-O​</code>​、​<code>​Falco​</code>​、​<code>​Flux​</code>​、​<code>​gRPC​</code>​、​<code>​KubeEdge​</code>​、​<code>​Linkerd​</code>​、​<code>​NATS​</code>​、​<code>​Notary​</code>​、​<code>​OpenTracing​</code>​、​<code>​Operator Framework​</code>​、​<code>​SPIFFE​</code>​、​<code>​SPIRE​</code>​ 和 ​<code>​Thanos​</code>​等

为开发者提供一个平台,自动部署,缩放和整个主机群集应用程序容器的操作后,​<code>​Kubernetes​</code>​确实巩固了它的方式成为一个事实上的标准

使用 ​<code>​Kubernetes​</code>​,您可以灵活地在任何时间更有效地推出更新,并在需要时将流量转移到新版本。它为您提供了根据您的要求扩展和缩小应用程序的选项,您可以选择应用程序与其他应用程序或现实世界的交互方式。 在这篇文章中,我们将看看:

什么是 CRD

它们是如何工作的

你怎么能创造一个!

如何删除 CRD

Litmus中使用的真实 CRD 示例

在本文结束时,您将彻底了解什么是 ​<code>​CR、CRD​</code>​ 的工作原理以及​<code>​Litmus​</code>​如何在日常用例中实现它们。 另外对于​<code>​kubernetes​</code>​二次开发技术栈相当之广泛,为了更多云原生爱好者更能深入的理解​<code>​kubernetes​</code>​二次开发能力,我们开展了​<code>​kubernetes operator​</code>​二次开发训练营进阶三的体系课,感兴趣的可以直接​​点击这里​​

通过利用所谓的资源, ​<code>​Kubernetes​</code>​ 可以提供大量这样的功能。一个资源是​<code>​K8S API​</code>​端点,使您可以存储任何类型的​<code>​API​</code>​对象。但是,如果开发人员需要根据他们的特定需求定制对象或资源怎么办?这是自定义资源出现的地方。

作为 ​<code>​Kubernetes 1.7​</code>​ 版本的一部分,他们引入了自定义资源的概念,通过添加对您的应用程序有用的任何类型的​<code>​API​</code>​对象来扩展功能。自定义资源定义 (​<code>​CRD​</code>​)用于定义自定义资源。这是将 ​<code>​Kubernetes​</code>​ 功能扩展到默认安装之外的强大方法。

如上所述,我们在 ​<code>​Kubernetes​</code>​ 中创建的几乎所有东西都是一种资源。一个 ​<code>​Pod​</code>​、一个​<code>​service​</code>​、一个​<code>​deploy​</code>​或一个​<code>​secret​</code>​,它们都是一种资源。这些资源通常由负责获取资源中的信息并将其转化为有用信息的控制器进行监控。

我们以创建 ​<code>​Pod​</code>​ 资源时发生的情况为例。每当您修改 ​<code>​Pod​</code>​ 资源时,即添加、更改或更新资源时,都会有一个控制器收到有关更改的通知。每当控制器看到 ​<code>​Pod​</code>​ 资源被添加或更新时,它就会查找资源中的信息,然后决定下一步做什么。对于新​<code>​Pod​</code>​,它会找出负责运行工作负载的节点并将其分配给该节点。然后该节点上的另一个控制器接收此分配,从而确保启动所需的容器。

自定义资源是使用自定义资源定义定义的,这就是缩写 ​<code>​CRD​</code>​而不是 ​<code>​CR​</code>​ 的原因。创建 ​<code>​CRD​</code>​ 后,​<code>​Kubernetes API​</code>​ 服务器会为 ​<code>​CRD​</code>​中指定的每个版本创建一个 ​<code>​RESTful​</code>​ 路径。根据​<code>​CRD​</code>​文件中定义的范围,该路径可以被整个集群全局访问,也可以仅被特定项目访问。​<code>​CR​</code>​ 一旦由 ​<code>​CRD​</code>​ 定义,就会存储在​<code>​etcd​</code>​集群中。​<code>​Kubernetes API​</code>​ 服务器负责资源生命周期和复制。它的作用类似于原生资源,当一个项目被删除时,所有的自定义资源和原生资源也会被删除。

作为先决条件,您需要 ​<code>​Kubernetes 1.7​</code>​ 或更高版本并安装 ​<code>​kubectl​</code>​ 工具才能创建​<code>​CRD​</code>​。就像 ​<code>​Kubernetes​</code>​ 世界中的许多其他文件一样,​<code>​CRD​</code>​ 也可以在 ​<code>​YAML​</code>​文件的帮助下创建。​<code>​CRD YAML​</code>​ 文件由几个字段组成,其中列出了一些重要的字段:

metadata.name:您正在创建的 CRD 的名称

spec.group:CRD 对象所属的组的名称。

spec.versions:它保存将创建的自定义资源的不同版本。

spec.names:用于定义如何描述您的自定义资源。您可以在此处添加您的 CR 的复数、单数和短名称,稍后在通过 kubectl 管理它时会很方便。

spec.names.kind:定义可以使用 CRD 创建的 CR 类型。像部署,CronJob,CronTab。

spec.scope:定义 CR 的范围。它可以设置为“集群”或“命名空间”。默认情况下,它设置为“命名空间”。

下面的清单显示了一个示例 ​<code>​CRD ourcrd.yaml​</code>​:

我们可以简单地使用创建上面的​<code>​CRD​</code>​

通过 ​<code>​kubectl​</code>​创建 ​<code>​CRD​</code>​后,会生成端点 ​<code>​URL​</code>​,可用于创建和管理自定义对象。创建此端点可能需要几秒钟。

你可能会有这样的疑问:“好吧!太酷了,但是我可能会如何/在哪里使用它?”,好吧,这是一个如何使用它的示例。

让我们使用我们用​<code>​CRD​</code>​创建的种类来创建一个清单。例如,我们有​<code>​my-kind.yaml​</code>​

这里我们使用我们在 ​<code>​CRD​</code>​中定义的相同种类,然后我们定义我们希望我们的种类对象具有的字段。就像在这个例子中一样,我们为我们的应用程序提供了 ​<code>​value1​</code>​ 和 ​<code>​value2​</code>​(如 ​<code>​CRD​</code>​ 中提供的)字段。在实际示例中,这些字段将类似于​<code>​image、URI​</code>​等。

现在,如果我们运行​<code>​kubectl create -f my-kind.yaml​</code>​我们的应用程序可以使用我们使用上面的清单创建的数据。要查看发生了什么,我们可以运行​<code>​kubectl get cn -o yaml​</code>,我们可以查看有关我们刚刚创建的内容的详细信息。

​<code>​cn​</code>​ 是我们上面给 ​<code>​CRD​</code>​ 的简称

要删除我们创建的 ​<code>​CRD​</code>​和资源,只需像处理任何其他资源一样运行 ​<code>​kubectl delete​</code>​。当您删除 ​<code>​CRD​</code>​ 时,服务器会卸载使用 ​<code>​CRD​</code>​ 创建的 ​<code>​RESTful​</code>​端点。随着 ​<code>​CRD​</code>​ 的删除,使用它创建的所有自定义资源也将被删除且无法检索。

在我们旅程的最后一部分中,让我们实际看看实际项目如何利用这些概念来扩展其需求并实际实施它们。 我将以 ​<code>​Litmus​</code>​ 为例作为我们将研究其 ​<code>​CRD​</code>​ 的项目。

​<code>​Litmus​</code>​ 是一个在云原生环境中实践混沌工程的框架。​<code>​litmus​</code>​提供了一个混沌​<code>​operator​</code>​,它有一大套的混乱实验中心,详细的文档,和友好的社区。​<code>​Litmus​</code>​ 非常易于使用;您还可以设置一个非常快速的演示环境来安装和运行 ​<code>​Litmus​</code>​ 实验。

​<code>​Litmus​</code>​ 中几个重要的 ​<code>​CRD​</code>​ 如下:

混沌引擎(ChaosEngine)

混沌实验(ChaosExperiment)

混沌结果(ChaosResult)

​<code>​ChaosEngine​</code>​:​<code>​ChaosEngine CR​</code>​ 是为给定的应用程序创建的,并用 ​<code>​appLabel​</code>​ 标记。此 ​<code>​CR​</code>​将一个或多个 ​<code>​ChaosExperiments​</code>​ 与应用程序联系起来。

​<code>​ChaosResult​</code>​:​<code>​ChaosResult CR​</code>​ 由​<code>​operator​</code>​在实验运行后创建。每个 ​<code>​ChaosEngine​</code>​ 维护一个 ​<code>​ChaosResult CR​</code>​。​<code>​ChaosResult CR​</code>​ 有助于理解给定的 ​<code>​ChaosExperiment​</code>​。此 ​<code>​CR​</code>​ 用于生成非常有用的混沌分析——例如,当某些组件在混沌实验之间升级时,需要轻松比较结果

要更广泛地了解 ​<code>​CR​</code>​,请访问此处。您会找到集群工作流、​<code>​Cron​</code>​ 工作流等的 ​<code>​CRD​</code>​

https://github.com/litmuschaos/litmus/blob/master/litmus-portal/litmus-portal-crds.yml

瞧,您已经成功地了解了 ​<code>​CRD​</code>​ 的概念以及如何创建它们。您当然可以扩展这些并玩转以创建自己的东西。

自定义资源定义增加了 ​<code>​Kubernetes​</code>​ 已经为其用户提供的令人难以置信的功能。​<code>​CRD​</code>​ 有助于扩展 ​<code>​Kubernetes​</code>​ 的功能,使其成为更通用的容器编排工具。您可以使用自定义资源添加自己的资源,以帮助满足您的特定要求。而且,您可以像使用任何原生 ​<code>​Kubernetes​</code>​服务一样使用这些资源,并利用 ​<code>​Kubernetes​</code>​ 必须提供的所有功能,例如安全性、​<code>​RBAC​</code>​、​<code>​API​</code>​ 服务和 ​<code>​CLI​</code>​。您还可以使用动态注册让自定义资源在集群运行时出现和消失。