自定义资源CRD使用介绍

 更新时间:2022年05月13日 17:17:44   作者:李大鹅  
这篇文章主要为大家介绍了自定义资源CRD的使用示例介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

介绍

Custom Resource Define简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式。

CRD 资源可以动态注册到集群中,注册完毕后,用户可以通过 kubectl 来创建访问这个自定义的资源对象,类似于操作 Pod 一样。

不过需要注意的是 CRD 仅仅是资源的定义而已,需要一个对应的控制器去监听 CRD 的各种事件来添加自定义的业务逻辑。

定义

如果说只是对 CRD 资源本身进行 CRUD 操作的话,不需要 Controller 也是可以实现的,相当于就是只有数据存入了 etcd 中,而没有对这个数据的相关操作而已。

比如我们可以定义一个如下所示的 CRD 资源清单文件:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # name 必须匹配下面的spec字段:<plural>.<group>  
  name: foos.crd.example.com
  # for more information on the below annotation, please see
  # https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/2337-k8s.io-group-protection/README.md
  annotations:
    "api-approved.kubernetes.io": "unapproved, experimental-only; please get an approval from Kubernetes API reviewers if you're trying to develop a CRD in the *.k8s.io or *.kubernetes.io groups"
spec:
  # group 名用于 REST API 中的定义: /apis/<group>/<version>
  group: crd.example.com
  # 列出自定义资源的所有 API 版本
  versions:
    - name: v1  # 版本名称,比如v1,v1beta1
      served: true  # 是否开启通过 REST APIs访问 `/apis/<group>/<version>/...`
      storage: true # 必须将一个且只有一个版本标记为存储版本
      schema: # 定义自定义对象的声明规范
        # schema used for validation
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                deploymentName:
                  type: string
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10
            status:
              type: object
              properties:
                availableReplicas:
                  type: integer
  names:
    # kind 是 sigular 的一个驼峰形式的定义,在资源清单中会使用
    kind: Foo
    # plural 名字用于 REST API 中的定义:/apis/<group>/<version>/<plural>    
    plural: foos
    # singular 名称用于 CLI 操作或显示的一个别名    
    singular: foo
    # shortNames 相当于缩写形式    
    shortNames:
    - fo
  scope: Namespaced

这个地方的定义和我们定义普通的资源对象比较类似,我们可以随意定义一个自定义的资源对象,但是在创建资源的时候,肯定不是任由我们随意去编写 YAML 文件的,当我们把上面的 CRD 文件提交给 Kubernetes 之后,Kubernetes 会对我们提交的声明文件进行校验,从定义可以看出 CRD 是基于OpenAPI v3 schem进行规范的。

当然这种校验只是对于字段的类型进行校验,比较初级,如果想要更加复杂的校验,这个时候就需要通过 Kubernetes 的 admission webhook 来实现了。关于校验的更多用法,可以前往官方文档查看。

现在我们可以直接使用kubectl来创建这个CRD资源清单:

$  kubectl apply -f crd.example.com_foos.yaml 
customresourcedefinition.apiextensions.k8s.io/foos.crd.example.com created

这个时候我们可以查看到集群中已经有我们定义的这个CRD资源对象了:

$ kubectl get crd | grep example
foos.crd.example.com                                  2022-05-11T05:28:51Z

这个时候一个新的 namespace 级别的 RESTful API 就会被创建:

/apis/crd/example.com/v1/namespaces/*/foos/...

接着我们就可以使用这个 API 端点来创建和管理自定义的对象,这些对象的类型就是上面创建的 CRD 对象规范中的foo

现在在 Kubernetes 集群中我们就多了一种新的资源叫做foos.crd.example.com,我们就可以使用它来定义一个Foo资源对象了,这个自定义资源对象里面可以包含的字段我们在定义的时候通过schema进行了规范,比如现在我们来创建一个如下所示的资源清单:

apiVersion: crd.example.com/v1
kind: Foo
metadata:
  name: example-foo
spec:
  deploymentName: example-foo
  replicas: 1

创建完成后我们就可以用kubectl来管理我们这里创建的Foo对象了,比如:

kubectl get foo
NAME          AGE
example-foo   20m

在使用 kubectl 的时候,资源名称是不区分大小写的,我们可以使用 CRD 中定义的单数或者复数形式以及任何简写。

kubectl get foo example-foo -o yaml
apiVersion: crd.example.com/v1
kind: Foo
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"crd.example.com/v1","kind":"Foo","metadata":{"annotations":{},"name":"example-foo","namespace":"default"},"spec":{"deploymentName":"example-foo","replicas":1}}
  creationTimestamp: "2022-05-11T05:40:38Z"
  generation: 1
  name: example-foo
  namespace: default
  resourceVersion: "37605212"
  uid: 56d5b1d3-f6f9-4106-90c4-a0e3c7d130c0
spec:
  deploymentName: example-foo
  replicas: 1

就如上面我们说的,现在我们自定义的资源创建完成了,但是也只是单纯的把资源清单数据存入到了 etcd 中而已,并没有什么其他用处,因为我们没有定义一个对应的控制器来处理相关的业务逻辑。

以上就是自定义资源CRD使用介绍的详细内容,更多关于自定义资源CRD的资料请关注脚本之家其它相关文章!

相关文章

  • k8s使用rbd作为存储的操作方法

    k8s使用rbd作为存储的操作方法

    这篇文章主要介绍了k8s使用rbd作为存储的操作方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • K8S中Pod重启策略及重启可能原因详细讲解

    K8S中Pod重启策略及重启可能原因详细讲解

    在k8s集群中当某个pod资源需要重启时,我们只会对其进行删除,由其pod控制器进行重新构建,下面这篇文章主要给大家介绍了关于K8S中Pod重启策略及重启可能原因的相关资料,需要的朋友可以参考下
    2023-05-05
  • 虚拟化和云计算的区别分析

    虚拟化和云计算的区别分析

    这篇文章主要介绍了虚拟化和云计算的区别,深入浅出的列举分析了虚拟化与云计算的几点常见区别,需要的朋友可以参考下
    2016-10-10
  • K8S-ConfigMap实现应用和配置分离详解

    K8S-ConfigMap实现应用和配置分离详解

    这篇文章主要为大家介绍了K8S-ConfigMap实现应用和配置分离详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • kubernetes k8s常用问题排查方法

    kubernetes k8s常用问题排查方法

    新手学习K8s最大的难度感觉是在起步动手实践的时候,Pod没有正常启动起来,或者运行了一段时间Pod自己崩溃了。是什么问题导致了它没运行起来,或是什么因素导致了它的崩溃,本文来学习总结几个使用 K8s时常见的错误现象以及排查这些现象背后问题的方法
    2022-06-06
  • k8s中如何实现pod自动扩缩容详解

    k8s中如何实现pod自动扩缩容详解

    在实际生产系统中,经常会遇到某个服务需要扩容的场景,可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景,下面这篇文章主要给大家介绍了关于k8s中如何实现pod自动扩缩容的相关资料,需要的朋友可以参考下
    2022-08-08
  • 一文详解如何高效查看k8s日志

    一文详解如何高效查看k8s日志

    K8S是kubernetes的缩写,是为解决容器服务编排而生的,在运维K8S服务的过程中,经常会遇到各种报错和诊断问题,那么我们一般怎么查看K8S组件的日志,这篇文章主要给大家介绍了关于如何高效查看k8s日志的相关资料,需要的朋友可以参考下
    2023-10-10
  • CentOS 7.9 升级内核 kernel-ml-5.6.14版本的方法

    CentOS 7.9 升级内核 kernel-ml-5.6.14版本的方法

    这篇文章主要介绍了CentOS 7.9 升级内核 kernel-ml-5.6.14版本,默认内核版本为3.10.0,现升级到 5.6.14 版本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • tkestack/gpu-manager在k8s1.23版本之后的使用方法

    tkestack/gpu-manager在k8s1.23版本之后的使用方法

    这篇文章主要介绍了tkestack/gpu-manager在k8s1.23版本之后的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • k8s目录和文件挂载到宿主机的方式

    k8s目录和文件挂载到宿主机的方式

    Docker是一种流行的容器化技术,它允许开发人员在不同的环境中构建、打包和运行应用程序,下面这篇文章主要给大家介绍了关于k8s目录和文件挂载到宿主机的相关资料,需要的朋友可以参考下
    2024-01-01

最新评论