k8s-CRD编程

  在 Kubernetes 里面, API 编程范式也就是 Custom Resources Definition(CRD),就是用户自定义资源。

  随着 Kubernetes 使用的越来越多,用户自定义资源的需求也会越来越多。而 Kubernetes 提供的聚合各个子资源的功能,已经不能满足日益增长的广泛需求了。用户希望提供一种用户自定义的资源,把各个子资源全部聚合起来。但 Kubernetes 原生资源的扩展和使用比较复杂,因此诞生了用户自定义资源功能。

   Kubernetes 的 API Server 看来用户自己添加的 Kubernetes 对象资源和原生的那些 Pod、Deployment 是同样的对象资源。

  自定义资源和原生内置的资源一样,都可以用 kubectl 来去创建、查看,也享有 RBAC、安全功能。用户可以开发自定义控制器来感知或者操作自定义资源的变化。

CRD

  apiVersion:apiextensions.k8s.io/v1 指 CRD 的一个 apiVersion 声明,声明它是一个 CRD 的需求或者说定义的 Schema。

  kind 就是 CustomResourcesDefinition,指 CRD。

  metadata.name 是一个用户自定义资源中自己自定义的一个名字。一般建议使用“顶级域名.xxx.APIGroup”这样的格式。

  spec 用于指定该 CRD 的 group、version、kind、scope。

    names.kind 指的是当前crd 的 kind 是什么,比如 Deployment 的 kind 就是 Deployment。

    scope 字段表明该 CRD 是否被命名空间管理(可填写cluster和namespaced)。

  validation 指定 CRD的校验规则,以便apiserver校验cr的有效性

  status指定部署后可展示的状态

控制器

  只定义一个 CRD 其实没有什么作用,它只会被 API Server 简单地计入到 etcd 中。如何依据这个 CRD 定义的资源和 Schema 来做一些复杂的操作,把它变成用户期望的状态,则是由 Controller来实现。

  控制器工作流程:
    kube-apiserver 会监督所有 etcd 中资源的创建、更新与删除;

    Informer通过 ListFunc、WatchFunc监控kube-apiserver中发生的crd对象变化;

    Informer 接收到了对象的需求之后,就会调用对应的函数(例如AddFunc, UpdateFunc 以及 DeleteFunc),并将其按照 key 值的格式放到一个队列中去;

    Controller 从队列中拿到一个对象之后,就会去做相应的操作。

  

  首先,通过 kube-apiserver 来推送事件,比如 Added, Updated, Deleted;然后进入到 Controller 的 ListAndWatch() 循环中;ListAndWatch 中有一个先入先出的队列,在操作的时候就将其 Pop() 出来;然后去找对应的 Handler。Handler 会将其交给对应的函数(比如 Add(), Update(), Delete())。

  一个函数一般会有多个 Worker。多个 Worker 的意思是说比如同时有好几个对象进来,那么这个 Controller 可能会同时启动五个、十个这样的 Worker 来并行地执行,每个 Worker 可以处理不同的对象实例。

  工作完成之后,即把对应的对象创建出来之后,就把这个 key 丢掉,代表已经处理完成。如果处理过程中有什么问题,就直接报错,打出一个事件来,再把这个 key 重新放回到队列中,下一个 Worker 就可以接收过来继续进行相同的处理。

 

  

  

  

posted @ 2023-11-10 17:40  花都八达鸟  阅读(100)  评论(0)    收藏  举报