如何用 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
组件提供了多种内置控制器,比如说: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
# 名称必须符合如下格式:<plural>.<group>
name crontabs.staight.k8s.io
spec
# 组名,表示使用该API: /apis/<group>/<version>
group staight.k8s.io
# version列表,表示该CRD支持的版本
versions
name v1
# 开启/关闭该API
servedtrue
# 有且只能有一个版本要将storage设置为true
storagetrue
# Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性
scope Namespaced
names
# API中使用的名称:/apis/<group>/<version>/<plural>
plural crontabs
# 单数名称,cli中使用
singular crontab
# 往往是首字母大写的单数名称,资源文件中需要用到
kind CronTab
# cli中的简称
shortNames
ct
# 阻止无法识别的字段,集群版本1.15以上才可使用
preserveUnknownFieldsfalse
# 创建资源文件时需验证的字段
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工作还需创建控制器,监听资源变动并做出相应动作。
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023