良许Linux教程网 干货合集 通过Kubernetes 自定义资源具体方法

通过Kubernetes 自定义资源具体方法

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

image-20220929232744845

什么是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组件提供了多种内置控制器,比如说:cronjob,daemonset,deployment,namespace等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于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:
 # 名称必须符合如下格式:.
 name: crontabs.staight.k8s.io
spec:
 # 组名,表示使用该API: /apis//
 group: staight.k8s.io
 # version列表,表示该CRD支持的版本
 versions:
   - name: v1
     # 开启/关闭该API
     served: true
     # 有且只能有一个版本要将storage设置为true
     storage: true
 # Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性
 scope: Namespaced
 names:
   # API中使用的名称:/apis///
   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:
             typeinteger

然后创建该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

接着即可看到该对象:

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

小结

CRD用来自定义资源,是扩展k8s最常用的方式。 只创建CRD并没有实际意义,想要CRD工作还需创建控制器,监听资源变动并做出相应动作。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部