开发operator扩展kubernetes 调研整理

异步通信执行

operator

Operator:固化到软件中的运维技能

黄东旭DTCC2017演讲实录:When TiDB Meets Kubernetes

使用 Operator 来扩展 Kubernetes(视频)

  • 部署这有状态的应用和部署管理它们会比无状态的复杂,是因为它们有这些复杂的运维和逻辑在里面。

  • Operator 是跟应用紧密相关的,所以其中最重要的工作就是把应用自身的运维方法编码成为资源和控制逻辑。

  • Operator的意义在于它其实是相当于使用了 Kubernetes 的 TPR(现在CRD)的 API,去把你的系统运维的一些领域知识,封装到 Operator 里面,然后把 Operator 这个模块注入到 Kubernetes 上面,整个这些集群是通过 Operator 这个模块来去做调度。

  • Operator技术上就说通过CRD和controller来实现的。根据需求,与其他Pod等公民一样,先用CustomResources扩展添加新Resource,用controller来达到预期状态。
  • 参考项目:redis-operator

CustomResources

kubernetes 指南:customresourcedefinition

官方相关文档: custom-resources, extend-api-custom-resource-definitions

kubernetes-deep-dive-api-server-part-3a

代码级例子 : extend-kubernetes-1-7-custom-resources

  • 无需改变代码来扩展 Kubernetes API 的机制,用来管理自定义对象.

  • For any new resource, you follow the same methodology:

    • Define the resource schema;
    • Register the resource with the API service and provide proper APIs;
    • Implement a controller which will watch for resource spec changes and make sure your application complies with the desired state.

Kubernetes Deep Dive: Code Generation for CustomResources

  • 通过code-generator生成相关代码库包,来访问自定义的CRD,减少开发量(解决上面提的第二步:provide proper APIs)

controller

A Deep Dive Into Kubernetes Controllers

kubewatch-an-example-of-kubernetes-custom-controller

官方社区给出的开发controller指导: kubernetes/community:controllers

  • Kubernetes runs a group of controllers that take care of routine tasks to ensure the desired state of the cluster matches the observed stat.(each controller is responsible for a particular resource in the Kubernetes world).
  • 伪代码模型:
1
2
3
4
5
for {
desired := getDesiredState()
current := getCurrentState()
makeChanges(desired, current)
}
  • client-go包的Informer/SharedInformer

    • Informer/SharedInformer watches for changes on the current state of Kubernetes objects and sends events to Workqueue where events are then popped up by worker(s) to process.(从Kubernetes 1.7开始,所有需要监控资源变化情况的调用均推荐使用Informer。Informer提供了基于事件通知的只读缓存机制,可以注册资源变化的回调函数,并可以极大减少API的调用。)
    • Kubernetes Informer 详解
  • 处理函数:

    • client-go包封装了获取事件变化和针对对异步的队列框架机制,我们只需实现处理逻辑接口:
    1
    2
    3
    4
    5
         type ResourceEventHandlerFuncs struct {
    AddFunc func(obj interface{})
    UpdateFunc func(oldObj, newObj interface{})
    DeleteFunc func(obj interface{})
    }

框架图

其他相关开发资源

markdown文件放在 github.com/yucs/yucs-awesome-resource 持续更新,欢迎star ,watch

如有出入请请教,文章持续更新…

如果觉得我写的帮助到您,请随意打赏,是我最大的肯定和动力
分享