使用 CRD 扩展您的 Kubernetes API

网友投稿 244 2022-10-23

使用 CRD 扩展您的 Kubernetes API

云原生CTO

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

专注于 ​​云原生技术​​ 分享

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

​​面试技巧​​,及技术疑难问题 ​​解答​​

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

使用 CRD 扩展您的 Kubernetes API

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

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

什么是 CRD它们是如何工作的你怎么能创造一个!如何删除 CRDLitmus中使用的真实 CRD 示例​

资源和自定义资源

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

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

自定义资源如何工作?

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

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

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

创建 CRD

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

metadata.name:您正在创建的 CRD 的名称spec.group:CRD 对象所属的组的名称。spec.versions:它保存将创建的自定义资源的不同版本。spec.names:用于定义如何描述您的自定义资源。您可以在此处添加您的 CR 的复数、单数和短名称,稍后在通过 kubectl 管理它时会很方便。spec.names.kind:定义可以使用 CRD 创建的 CR 类型。像部署,CronJob,CronTab。spec.scope:定义 CR 的范围。它可以设置为“集群”或“命名空间”。默认情况下,它设置为“命名空间”。​

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

apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: crdname.demo.example.comspec: scope: Namespaced group: demos.example.com names: kind: Foo singular: crdname plural: crdnames shortNames: - cn versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object description: "A foo object" properties: spec: type: object properties: value1: type: string default: "Default value" value2: type: integer

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

kubectl create -f ourcrd.yaml

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

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

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

apiVersion: "demo.example.com/v1"kind: Foo [The same kind we declared in the CRD]metadata: name: demo-appspec: value1: "Hello Developers" value2: 92

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

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

​​cn​​ 是我们上面给 ​​CRD​​ 的简称

删除 CRD

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

CRD 的现实生活示例

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

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

​​Litmus​​ 中几个重要的 ​​CRD​​ 如下:

混沌引擎(ChaosEngine)混沌实验(ChaosExperiment)混沌结果(ChaosResult)​

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

apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata: name: chaosengines.litmuschaos.iospec: group: litmuschaos.io names: kind: ChaosEngine listKind: ChaosEngineList plural: chaosengines singular: chaosengine scope: Namespaced validation: openAPIV3Schema: properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: type: string kind: description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: type: string metadata: type: object spec: type: object properties: monitoring: type: boolean jobCleanUpPolicy: type: string pattern: ^(delete|retain)$ # alternate ways to do this in case of complex pattern matches #oneOf: # - pattern: '^delete$' # - pattern: '^retain$' annotationCheck: type: string pattern: ^(true|false)$ appinfo: type: object properties: appkind: type: string pattern: ^(^$|deployment|statefulset|daemonset|deploymentconfig|rollout)$ applabel: type: string appns: type: string auxiliaryAppInfo: type: string engineState: type: string pattern: ^(active|stop)$ chaosServiceAccount: type: string components: ... experiments: type: array items: ... status: type: object version: v1alpha1 versions: - name: v1alpha1 served: true

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

apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata: name: chaosresults.litmuschaos.iospec: group: litmuschaos.io names: kind: ChaosResult listKind: ChaosResultList plural: chaosresults singular: chaosresult scope: Namespaced validation: openAPIV3Schema: properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: type: string kind: description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: type: string metadata: type: object spec: type: object status: type: object version: v1alpha1 versions: - name: v1alpha1 served: true storage: true

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

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

结论

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:电脑的外部接口有哪些
下一篇:浅谈SPI驱动API的使用方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~