1 CustomResourceDefinition1
Tip
- k8s 在发展过程中, 肯定是不断的增加某种类型的资源, 比如 deployment, 我们会创建一个 类型是kind: Deployment的yaml文件
- k8s 系统里肯定有相关的代码来实现 这个类型的东西所具有的功能
- 增加这样一个功能, 可能就需要很多的代码, k8s 代码更新的周期 可能就比较长, 新功能等待时间可能就比较长
- 而自定义资源 的出现 ,就是让用户可以自己来简单的做这样一个扩展,增加了一个自己需要的功能.
1.我们现在来创建一个yaml文件来表示我们的资源
crontab.yaml
我们apply看看,肯定报错了
2.我们得让系统知道你yaml里的东西是啥玩意,我们定义一个CustomResourceDefinition让系统知道你yaml里的东西是啥意思
crontab-resource-definition.yaml
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:
1 openAPIV3Schema: #openAPIV3Schema 是验证自定义对象的模式
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
replicas:
type: integer
2 additionalPrinterColumns:
- name: Spec
type: string
description: The cron spec defining the interval a CronJob is run
jsonPath: .spec.cronSpec
- name: Replicas
type: integer
description: The number of jobs launched by the CronJob
jsonPath: .spec.replicas
- name: Age
type: date
jsonPath: .metadata.creationTimestamp
# 范围 可以是 Namespaced 或 Cluster
# 就像pod ,是有 ns 范围的
scope: Namespaced
names:
# 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
plural: crontabs
# 名称的单数形式,作为命令行使用时和显示时的别名
singular: crontab
# kind 通常是单数形式的驼峰命名(CamelCased)形式。你的资源清单会使用这一形式。
kind: CronTab
# shortNames 允许你在命令行使用较短的字符串来匹配资源, 比如 k get po 中的po 是pod
shortNames:
- ct# 这个时候我们再创建这个自定义类型的对象
k apply -f crontab.yaml
# 和我们使用 k get po 一样
# 可以用上面crd里定义的ct这个shortName
k get ct
curl localhost:8001/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object3.现在创建的CronTab 类型的对象 和我们POD 类似, 只是pod对象创建完后,系统会给创建真正的pod,而CronTab系统可没做啥实质性的动作, 这需要我们写一些代码(自定义控制器,就是operator), 让系统看到这样的对象被写入后,做些什么事情,完全由用户来设计. 详见operator
2 Finalizers23
2.1 介绍
如果给对象设置了metadata.finalizers字段, 那么删除k8s对象前会触发对应的钩子函数
可以使用 Finalizers 控制资源的垃圾收集, 或阻止删除未被管理的资源
Tip
- 一个常见的 Finalizer 的例子是 kubernetes.io/pv-protection, 它用来防止意外删除 PersistentVolume 对象
- 当一个 PersistentVolume 对象被 Pod 使用时, Kubernetes 会添加 pv-protection Finalizer. 如果你试图删除 PersistentVolume,它将进入 Terminating 状态, 但是控制器因为该 Finalizer 存在而无法删除该资源.当 Pod 停止使用 PersistentVolume 时, Kubernetes 清除 pv-protection Finalizer,控制器就会删除该卷
2.2 模拟一下
pod-finalizers.yaml