如何使用Kubernetes自定义资源(CRD)详解

 更新时间:2022年09月06日 15:34:14   作者:staight  
自定义资源定义(CRD)是Kubernetes API扩展,可以定义新的对象类型,下面这篇文章主要给大家介绍了关于如何使用Kubernetes自定义资源(CRD)的相关资料,需要的朋友可以参考下

什么是CRD

CRD的全称为 CustomResourceDefinitions,即自定义资源。k8s拥有一些内置的资源,比如说Pod,Deployment,ReplicaSet等等,而CRD则提供了一种方式,使用户可以自定义新的资源,以扩展k8s的功能。

使用CRD可以在不修改k8s源代码的基础上方便的扩展k8s的功能,比如腾讯云TKE使用CRD:logcollectors.ccs.cloud.tencent.com以添加日志收集服务,而Istio也大量使用到了CRD。

值得一提的是,另一种扩展k8s的方式是apiservice,通过API:metrics.k8s.io自定义HPA是其最典型的应用。

可以使用kubectl api-resources命令查看集群中已定义的资源:

[root@node k8s]# kubectl api-resources 
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
configmaps                        cm                                          true         ConfigMap
endpoints                         ep                                          true         Endpoints
events                            ev                                          true         Event
namespaces                        ns                                          false        Namespace
persistentvolumes                 pv                                          false        PersistentVolume
pods                              po                                          true         Pod
podtemplates                                                                  true         PodTemplate
storageclasses                    sc           storage.k8s.io                 false        StorageClass
...

从如上输出中可以略窥一二,CRD至少包括如下属性:

  • NAME:CRD的复数名称
  • SHORTNAMES:cli中使用的资源简称
  • APIGROUP:API所使用的组名称
  • NAMESPACED:是否具有namespace属性
  • KIND:资源文件需要,用以识别资源

另外,CRD提供了定义资源的方式,不过想要让其具有实际意义还需控制器的配合。k8s的kube-controller-manager组件提供了多种内置控制器,比如说:cronjobdaemonsetdeploymentnamespace等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于CRD来说,也可以编写相应的控制器来完成对应的功能。

CRD使用

在k8s中CRD本身也是资源,大于1.7.0版本的集群可以使用apiextensions.k8s.io/v1beta1API访问CRD,大于1.16.0版本则可以使用apiextensions.k8s.io/v1API

创建CRD

CRD资源文件示例:

 
# crd-test.yml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  # 名称必须符合如下格式:<plural>.<group>
  name: crontabs.staight.k8s.io
spec:
  # 组名,表示使用该API: /apis/<group>/<version>
  group: staight.k8s.io
  # version列表,表示该CRD支持的版本
  versions:
    - name: v1
      # 开启/关闭该API
      served: true
      # 有且只能有一个版本要将storage设置为true
      storage: true
  # Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性
  scope: Namespaced
  names:
    # API中使用的名称:/apis/<group>/<version>/<plural>
    plural: crontabs
    # 单数名称,cli中使用
    singular: crontab
    # 往往是首字母大写的单数名称,资源文件中需要用到
    kind: CronTab
    # cli中的简称
    shortNames:
    - ct
  # 阻止无法识别的字段,集群版本1.15以上才可使用
  preserveUnknownFields: false
  # 创建资源文件时需验证的字段
  validation:
    openAPIV3Schema:
      type: object
      properties:
        spec:
          type: object
          properties:
            cronSpec:
              type: string
            image:
              type: string
            replicas:
              type: integer

然后创建该CRD:

[root@node k8s]# kubectl create -f crd-test.yml 
customresourcedefinition.apiextensions.k8s.io/crontabs.staight.k8s.io created

接着就能查到该CRD:

[root@node k8s]# kubectl get crd crontabs.staight.k8s.io
NAME                      CREATED AT
crontabs.staight.k8s.io   2019-10-08T10:21:09Z

CRD创建完成。可以通过URL:https://169.254.128.15:60002/apis/staight.k8s.io/v1/namespaces/default/crontabs访问到crontab资源。

创建自定义对象

在创建CRD之后,即可创建其资源的对象了。资源文件示例:

# crontab.yml
apiVersion: "staight.k8s.io/v1"
kind: CronTab
metadata:
  name: new-crontab
spec:
  cronSpec: "* * * * *"
  image: new-image

注意spec中的字段应符合CRD的要求,创建它:

[root@node k8s]# kubectl create -f crontab.yml 
crontab.staight.k8s.io/new-crontab created

接着即可看到该对象:

[root@node k8s]# kubectl get crontab
NAME          AGE
new-crontab   28s

小结

CRD用来自定义资源,是扩展k8s最常用的方式。

只创建CRD并没有实际意义,想要CRD工作还需创建控制器,监听资源变动并做出相应动作。

总结

到此这篇关于如何使用Kubernetes自定义资源(CRD)的文章就介绍到这了,更多相关Kubernetes自定义资源使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • k8s之ingress-nginx详解和部署方案

    k8s之ingress-nginx详解和部署方案

    Ingress是一种向k8s集群外部的客户端公开服务的方法,下面这篇文章主要给大家介绍了关于k8s之ingress-nginx详解和部署方案的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 新版k8s拉取镜像失败问题解决办法

    新版k8s拉取镜像失败问题解决办法

    随着Kubernetes 1.23版本的发布,Docker作为默认容器运行时被弃用,转而默认采用Containerd,这一改变意味着用户在使用Kubernetes时,将不再通过Docker来拉取镜像,文中jiang,需要的朋友可以参考下
    2024-10-10
  • 某集团任意文件下载到虚拟主机getshell的方法

    某集团任意文件下载到虚拟主机getshell的方法

    这篇文章主要介绍了某集团任意文件下载到虚拟主机getshell的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • 详解K8S apiVersion对照表

    详解K8S apiVersion对照表

    k8s更新迭代比较快,apiVersion也在不断变化中,每个版本的对应的apiVersion略有不同,这篇文章主要介绍了K8S apiVersion对照表,需要的朋友可以参考下
    2022-07-07
  • 再分享6个可无限激活阿里云盘邀请码,不信你不能激活阿里云盘

    再分享6个可无限激活阿里云盘邀请码,不信你不能激活阿里云盘

    这篇文章主要分享6个可无限激活的阿里云盘邀请码,不信你不能激活阿里云盘,需要的朋友可以参考下
    2020-11-11
  • Rainbond使用Dockerfile构建便捷应用运行流程

    Rainbond使用Dockerfile构建便捷应用运行流程

    这篇文章主要为大家介绍了Rainbond使用Dockerfile构建便捷应用运行流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • k8s如何使用NFS作为StorageClass提供动态存储

    k8s如何使用NFS作为StorageClass提供动态存储

    本文主要介绍了k8s中的StorageClass,包括其定义、引入的原因、实现方式、定义方法以及回收策略对数据的影响等,首先,StorageClass是在K8s集群中创建用于动态PV的管理,可以链接至不同的后端存储,对存储的请求可以指向StorageClass
    2024-09-09
  • Kubernetes(K8S)彻底卸载详细教程

    Kubernetes(K8S)彻底卸载详细教程

    网络上有很多的K8S安装安装教程,但是唯独很少有卸载教程,有也讲得不清不楚,下面这篇文章主要给大家介绍了关于Kubernetes(K8S)彻底卸载的相关资料,需要的朋友可以参考下
    2024-01-01
  • kubernetes日志备份解决ELK中日志丢失问题

    kubernetes日志备份解决ELK中日志丢失问题

    这篇文章主要为大家介绍了kubernetes日志备份方案的细节探究分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • K8S节点本地存储被撑爆问题彻底解决方法

    K8S节点本地存储被撑爆问题彻底解决方法

    这篇文章主要为大家介绍了K8S节点本地存储被撑爆问题彻底解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论