什么是CRD
CustomResourceDefinitions
,即自定义资源。k8s拥有一些内置的资源,比如说Pod,Deployment,ReplicaSet等等,而CRD则提供了一种方式,使用户可以自定义新的资源,以扩展k8s的功能。logcollectors.ccs.cloud.tencent.com
以添加日志收集服务,而Istio也大量使用到了CRD。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:资源文件需要,用以识别资源
kube-controller-manager
组件提供了多种内置控制器,比如说:cronjob
,daemonset
,deployment
,namespace
等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于CRD来说,也可以编写相应的控制器来完成对应的功能。CRD使用
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的要求,创建它:
[ ]
crontab.staight.k8s.io/new-crontab created
接着即可看到该对象:
[ ]
NAME AGE
new-crontab 28s
小结
-
CRD用来自定义资源,是扩展k8s最常用的方式。
-
只创建CRD并没有实际意义,想要CRD工作还需创建控制器,监听资源变动并做出相应动作。
2022年10月,GOPS 全球运维大会 2022 · 上海站,字节、小红书、ebay、中通等互联网一线运维经验,扫码解锁更多精彩~
<< 滑动查看下一张图片 >>
腾讯会议回应“崩了”;80岁作者再更新!Linux 三剑客之 Awk 霸榜;英伟达、AMD 断供中国 | 一周 IT 资讯
“高效运维”公众号诚邀广大技术人员投稿
原文始发于微信公众号(高效运维):如何用 Kubernetes 自定义资源?一文聊聊 CRD
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论