kubernetes controller 实现

对于kubernetes中不存在的资源类型,咱们能够经过自定义资源的方式进行扩展,首先建立customresourcedefinition对象定义资源及其schema,而后就能够建立自定义的资源了,可是此时定义的资源是不具有生命周期的,没法在建立或销毁的过程当中自动执行一些操做,例如replicaSet能够自动根据pod的数量来进行failover,若是咱们也要实现这种自动控制此时就须要编写对应的controller, controller须要一个infromer来监听建立删除等事件,并执行预先定义的回调函数,代码使用自定义的资源须要经过codegen自动生成其client-go api, 若是资源的变化须要反应在k8s event对象上(这样咱们经过kubectl describe 就能够看到发生了什么)还须要利用eventRecorder来产生event.
下面是一些具体的参考资料,我就不重复造轮子了.html

CustomResourceDefinition(CRD)

Extend the Kubernetes API with CustomResourceDefinitions    git

Advanced topic:github

  • Finalizers: 用于controller删除过程,防止hard delete,能够在删除的过程当中执行一些必要的操做
  • Validation: 至关于filed的schema
  • Subresources: v1.10中处于alpha版本,定义了status,scale status subresource
  • Categories: 定义group,例如kubectl get all时是否显示

从kubernetes1.8中开始,在建立资源的时候若是指定了ower reference对象,则删除父对象的时候其子对象也会自动删除,因此对于有relationship的资源须要设置这个字段api

informer

Kubernetes Informer 详解 基本用法和实现简单介绍
work queue example demo, work queue和index的基本使用方法函数

能够在informer中EventHandler中添加一个filter
update失败的时候,须要retry, k8s 有 OptimisticConcurrency 机制,若是有两个 client 都在 update 同一个,会 fail。因此写代码时通常会把 update 写到 loop 里,直到 api-server 返回 200,ok 时才肯定 update 成功。oop

controller

sample-controller 完整的官方demo,注释很详细
使用 client-go 控制原生及拓展的 Kubernetes API 从client-go使用到Controller的编写,全覆盖,由google大佬所写
Writing Controllers写controller的注意事项,在上面的sample-controller中会有一些工程实践
A Deep Dive Into Kubernetes Controllers 很详细的controller的实现步骤,推荐google

controller中的event recorder相关

Kubernetes Events介绍 上中下
event有个过时时间,默认时间是1h, 因此若是须要一直显示给用户的话要不断用recorder来记录,event是独立存在的一种资源,当describe 其余资源的时候会从其中获取对应的event,.net

codegen生成client-go api

Kubernetes Deep Dive: Code Generation for CustomResources codegen的使用方式
Extend Kubernetes 1.7 with Custom Resources 这是一个不用code-gen实现的controllercode

最后发现一篇类似的博文开发operator扩展kubernetes 调研整理,内容有些重复,哈哈orm

相关文章
相关标签/搜索