暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 CRD 扩展您的 Kubernetes API

云原生CTO 2021-10-24
553

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:
                  typeinteger

我们可以简单地使用创建上面的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]

参考资料

[1]

github: https://github.com/litmuschaos/litmus


文章转载自云原生CTO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论