• 如何用 Kubernetes 自定义资源?


    什么是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命令查看集群中已定义的资源:

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

    从如上输出中可以略窥一二,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资源文件示例:

    1. # crd-test.yml
    2. apiVersion: apiextensions.k8s.io/v1beta1
    3. kind: CustomResourceDefinition
    4. metadata:
    5. # 名称必须符合如下格式:<plural>.<group>
    6. name: crontabs.staight.k8s.io
    7. spec:
    8. # 组名,表示使用该API: /apis/<group>/<version>
    9. group: staight.k8s.io
    10. # version列表,表示该CRD支持的版本
    11. versions:
    12. - name: v1
    13. # 开启/关闭该API
    14. served: true
    15. # 有且只能有一个版本要将storage设置为true
    16. storage: true
    17. # Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性
    18. scope: Namespaced
    19. names:
    20. # API中使用的名称:/apis/<group>/<version>/<plural>
    21. plural: crontabs
    22. # 单数名称,cli中使用
    23. singular: crontab
    24. # 往往是首字母大写的单数名称,资源文件中需要用到
    25. kind: CronTab
    26. # cli中的简称
    27. shortNames:
    28. - ct
    29. # 阻止无法识别的字段,集群版本1.15以上才可使用
    30. preserveUnknownFields: false
    31. # 创建资源文件时需验证的字段
    32. validation:
    33. openAPIV3Schema:
    34. type: object
    35. properties:
    36. spec:
    37. type: object
    38. properties:
    39. cronSpec:
    40. type: string
    41. image:
    42. type: string
    43. replicas:
    44. type: integer

    然后创建该CRD:

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

    接着就能查到该CRD:

    1. [root@node k8s]# kubectl get crd crontabs.staight.k8s.io
    2. NAME CREATED AT
    3. 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之后,即可创建其资源的对象了。资源文件示例:

    1. # crontab.yml
    2. apiVersion: "staight.k8s.io/v1"
    3. kind: CronTab
    4. metadata:
    5. name: new-crontab
    6. spec:
    7. cronSpec: "* * * * *"
    8. image: new-image

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

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

    接着即可看到该对象:

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

    小结

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

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

    来源:https://staight.github.io/2019/10/08/Kubernetes-CRD%E7%AE%80%E4%BB%8B/

  • 相关阅读:
    【C++面向对象】9. 重载
    Ubuntu环境下遇到的问题与解决方法
    asm:operand number missing after %-letter
    Linux 信号捕捉函数 signal sigaction
    ASUS华硕天选4笔记本FA507NU7735H_4050原装出厂Win11系统
    抽象类和抽象方法
    .net 杂谈之二
    我是一个Dubbo数据包...
    【TS】类和接口
    阿里P8大牛手撸的分布式架构文档:ZK+高可用+缓存+事务+中间件等
  • 原文地址:https://blog.csdn.net/LinkSLA/article/details/126719186