CRD
CRD的作用只是在K8S里注册资源类型,使K8S可以识别我们自定义的资源类型,简称GVK(每个资源类型都有group-version-kind对应),比如在YAML中经常申明的类型 KIND: Deployment
比如下面命令列出的的Deployment就是一个K8S的资源类型,对应的GVK关系是
Group: apps Version: v1 Kind: Deployment
[root@jumpserver ~]# kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
deployments deploy apps true Deployment
....
CRD的作用非常有限,只是将自定义资源类型注册到了K8S中。可以使用kubect api-resources查看。
比如此处我们注册了一个资源类型, group是dtkapps,v是v1,kind是snapshot。
这个时候我们通过yaml创建KINS: snapshot的资源时,可以正常创建。但是不会有实际动作(比如创建pod),我们想要实现自定的动作,需要再编写controller来实现自定义逻辑
[root@jumpserver ~]# kubectl api-resources | grep -i snapshot
snapshotrollbacks dtkapps.itgod.org true SnapshotRollback
snapshots dtkapps.itgod.org true Snapshot
控制器
三种自定义控制器类型
基础控制器
一般用于监听GVK的变化,再异步进行一些额外的逻辑操作(并不能干预原始请求)
应用场景:
比如希望Deployment变化的时候,将Deployment的image记录到数据库中, 或则自动创建一个svc关联这个deployment中的pod
变异控制器
可以干扰请求,对请求进行修改。
应用场景:
比如我希望Pod在被创建或者更新的时候,在pod里面自动加入一个env变量
准入控制器
可以决定这个请求是否被执行
应用场景:
比如我希望pod在被创建的时候,比如包含某个env变量。如果不包含则拒绝创建