关注微信公众号《云原生CTO》更多云原生干货等你来探索
专注于 云原生技术
分享
提供优质 云原生开发
视频技术培训
面试技巧
,及技术疑难问题 解答

云原生技术分享不仅仅局限于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 它们是如何工作的 你怎么能创造一个! 如何删除 CRD Litmus中使用的真实 CRD 示例
在本文结束时,您将彻底了解什么是 CR、CRD
的工作原理以及Litmus
如何在日常用例中实现它们。
另外对于kubernetes
二次开发技术栈相当之广泛,为了更多云原生爱好者更能深入的理解kubernetes
二次开发能力,我们开展了kubernetes operator
二次开发训练营进阶三的体系课,感兴趣的可以直接点击这里
资源和自定义资源
通过利用所谓的资源, 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/v1
kind: CustomResourceDefinition
metadata:
name: crdname.demo.example.com
spec:
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-app
spec:
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/v1beta1
kind: CustomResourceDefinition
metadata:
name: chaosengines.litmuschaos.io
spec:
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: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
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: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
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/v1beta1
kind: CustomResourceDefinition
metadata:
name: chaosresults.litmuschaos.io
spec:
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: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
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: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
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
。您还可以使用动态注册让自定义资源在集群运行时出现和消失。
5.3 文档
github [1]
参考资料
github: https://github.com/litmuschaos/litmus




