Kubernetes自定义资源(CRD)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes自定义资源(CRD)相关的知识,希望对你有一定的参考价值。
参考技术A Kubernetes系统拥有强大的高扩展功能,其中自定义资源(Custom Resource)就是一种常见的扩展方式,即可将自己定义的资源添加到Kubernetes系统中。Kubernetes系统附带了许多内置资源,但是仍有些需求需要使用自定义资源来扩展Kubernetes的功能。在Kubernetes系统早期,是通过 ThirdPartyResource(TPR) 来实现扩展自定义资源的,但自Kubernetes 1.7版本后,ThirdPartyResource功能已被弃用,并且其已根据Beta功能的弃用政策在Kubernetes 1.8中被删除,取而代之的是 CustomResourceDefinitions(自定义资源定义,简称CRD) 。
开发者通过CRD可以实现自定义资源,它允许用户将自己定义的资源添加到Kubernetes系统中,并像使用Kubernetes内置资源一样使用这些资源,例如,在YAML/JSON文件中带有Spec的资源定义都是对Kubernetes中的资源对象的定义,所有的自定义资源都可以与Kubernetes系统中的内置资源一样使用kubectl或client-go进行操作。
当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所指定的每一个版本生成一个 RESTful 的资源路径。CRD 可以是命名空间作用域的,也可以是集群作用域的,取决于 CRD 的 scope 字段设置。和其他现有的内置对象一样,删除 一个命名空间时,该名字空间下的所有 CRD 对象也会被删除。CustomResourceDefinition 本身是不受命名空间限制的,对所有命名空间可用。
例如,如果你将下面的 CustomResourceDefinition 保存到 resourcedefinition.yaml 文件:
之后创建它:
这样一个新的受名字空间约束的 RESTful API 端点会被创建在:
此端点 URL 自此可以用来创建和管理定制对象。对象的 kind 将是来自你上面创建时 所用的 spec 中指定的 CronTab。
创建端点的操作可能需要几秒钟。你可以监测你的 CustomResourceDefinition 的 Established 状况变为 true,或者监测 API 服务器的发现信息等待你的资源出现在那里。
在创建了 CustomResourceDefinition 对象之后,你可以创建定制对象(Custom Objects)。定制对象可以包含定制字段。这些字段可以包含任意的 JSON 数据。 在下面的例子中,在类别为 CrontTab 的定制对象中,设置了 cronSpec 和 image 定制字段。类别 CronTab 来自你在上面所创建的 CRD 的规约。
如果你将下面的 YAML 保存到 my-crontab.yaml :
并执行创建命令:
你就可以使用 kubectl 来管理你的 CronTab 对象了。例如:
应该会输出如下列表:
使用 kubectl 时,资源名称是大小写不敏感的,而且你既可以使用 CRD 中所定义的单数 形式或复数形式,也可以使用其短名称:
你可以看到输出中包含了你创建定制对象时在 YAML 文件中指定的定制字段 cronSpec 和 image:
当你删除某 CustomResourceDefinition 时,服务器会卸载其 RESTful API 端点,并删除服务器上存储的所有定制对象。
如果你在以后创建相同的 CustomResourceDefinition 时,该 CRD 会一个空的结构。
使用 CustomResourceDefinition 扩展 Kubernetes API
Kubernetes CRD 系列:CRD 介绍
Kubernetes_CRD自定义资源
系列文章目录
文章目录
前言
CRD就是自定义资源,就是自定义 apiVersion+Kind
参考资料:https://liugp.blog.csdn.net/article/details/126773609
一、CRD操作命令
1.1 定义一种资源并查看
当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所指定的每个版本生成一个新的 RESTful 资源路径。 基于 CRD 对象所创建的自定义资源可以是名字空间作用域的,也可以是集群作用域的, 取决于 CRD 对象 spec.scope 字段的设置。
cat > resourcedefinition.yaml << EOF
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
# 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
name: crontabs.stable.example.com
spec:
# 组名称,用于 REST API: /apis/<组>/<版本>
group: stable.example.com
# 列举此 CustomResourceDefinition 所支持的版本
versions:
- name: v1
# 每个版本都可以通过 served 标志来独立启用或禁止
served: true
# 其中一个且只有一个版本必需被标记为存储版本
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
replicas:
type: integer
# 可以是 Namespaced 或 Cluster
scope: Namespaced
names:
# 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
plural: crontabs
# 名称的单数形式,作为命令行使用时和显示时的别名
singular: crontab
# kind 通常是单数形式的驼峰命名(CamelCased)形式。你的资源清单会使用这一形式。
kind: CronTab
# shortNames 允许你在命令行使用较短的字符串来匹配资源
shortNames:
- ct
EOF
执行创建
kubectl apply -f resourcedefinition.yaml
这样一个新的受名字空间约束的 RESTful API 端点会被创建在:
/apis/stable.example.com/v1/namespaces/
对象的 kind 将是来自你上面创建时 所用的 spec 中指定的 CronTab。
Kubernetes(k8s)API 的 操作可以参考我之前的文章:Kubernetes(k8s)API Server详解
kubectl get --raw /apis/stable.example.com/v1/
kubectl get --raw /apis/stable.example.com/v1/|python -m json.tool
1.2 使用刚刚定义的资源
在创建了 CustomResourceDefinition 对象之后,你可以创建定制对象(Custom Objects)。定制对象可以包含定制字段。这些字段可以包含任意的 JSON 数据。 在下面的例子中,在类别为 CronTab 的定制对象中,设置了cronSpec 和 image 定制字段。类别 CronTab 来自你在上面所创建的 CRD 的规约。
cat >my-crontab.yaml<<EOF
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * */5"
image: my-awesome-cron-image
EOF
并执行创建命令:
kubectl apply -f my-crontab.yaml
你就可以使用 kubectl 来管理你的 CronTab 对象了。例如:
kubectl get crontab
kubectl get ct -o yaml
3)删除 CustomResourceDefinition
当你删除某 CustomResourceDefinition 时,服务器会卸载其 RESTful API 端点,并删除服务器上存储的所有定制对象。
kubectl delete -f resourcedefinition.yaml
kubectl get crontabs
二、CRD效果演示
2.1 实践:定义一种资源并查看
步骤1:定义资源
步骤2:应用资源
步骤3:查看资源
在外网访问,要么打开匿名权限,要么手动添加一个secret,操作方式见博客:https://maoqizhi.blog.csdn.net/article/details/127337611
https://192.168.100.152:6443/apis/stable.example.com/v1/
2.2 实践:使用刚刚定义的资源
restful接口:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/
kubectl命令:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#patch
swagger:https://raw.githubusercontent.com/kubernetes/kubernetes/master/api/openapi-spec/swagger.json
https://192.168.100.152:6443/apis/apps/v1/namespaces/default/deployments
https://192.168.100.152:6443/apis/stable.example.com/v1/namespaces/default/crontabs
https://192.168.100.152:6443/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object
总结
很简单,照着操作就好了,理解就好了,一种资源就是 apiVersion + name + metadata+ spec,创建完成之后,在postman/外网能访问到,就算成功了。
唯一注意的是 kind: CustomResourceDefinition 这个好像要在比较高的版本里面才能用,我用 k8s 1.14 不行,用 k8s 1.21 才完成的。
天天打码,天天进步!!
以上是关于Kubernetes自定义资源(CRD)的主要内容,如果未能解决你的问题,请参考以下文章
使用Go语言操作Istio和其他Kubernetes CRD