深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116705 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

25 | 深入解析声明式API(二):编写自定义控制器

决定业务逻辑
对比期望状态
获取实际状态
与控制循环协同
获取并监视API对象变化
ListAndWatch机制
触发Handler的客户端库
缓存和索引机制
同步实际状态和期望状态
处理工作队列
启动控制循环
注册Handler
初始化控制器
初始化自定义控制器
决定具体工作
监视API对象变化
实现原理
Informer和控制循环协作
核心思想
工作队列
Reflector
Informer
协同编排功能
默认API对象
自定义API对象
创建、更新、删除Network对象
启动控制器
编译项目
控制循环
控制器定义
main函数
控制器模式
声明式API
思考题
总结
应用场景
运行项目
编写自定义控制器
原理
深入解析声明式API之编写自定义控制器

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:深入解析声明式 API 之编写自定义控制器。
在上一篇文章中,我和你详细分享了 Kubernetes 中声明式 API 的实现原理,并且通过一个添加 Network 对象的实例,为你讲述了在 Kubernetes 里添加 API 资源的过程。
在今天的这篇文章中,我就继续和你一起完成剩下一半的工作,即:为 Network 这个自定义 API 对象编写一个自定义控制器(Custom Controller)。
正如我在上一篇文章结尾处提到的,“声明式 API”并不像“命令式 API”那样有着明显的执行逻辑。这就使得基于声明式 API 的业务功能实现,往往需要通过控制器模式来“监视”API 对象的变化(比如,创建或者删除 Network),然后以此来决定实际要执行的具体工作。
接下来,我就和你一起通过编写代码来实现这个过程。这个项目和上一篇文章里的代码是同一个项目,你可以从这个 GitHub 库里找到它们。我在代码里还加上了丰富的注释,你可以随时参考。
总得来说,编写自定义控制器代码的过程包括:编写 main 函数、编写自定义控制器的定义,以及编写控制器里的业务逻辑三个部分。
首先,我们来编写这个自定义控制器的 main 函数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入解析了声明式API中编写自定义控制器的过程。作者首先介绍了自定义控制器的主要工作,即监视API对象的变化并决定实际执行的工作。随后,通过代码示例详细解释了自定义控制器的初始化和工作原理。文章重点介绍了Informer的作用,它是一个带有本地缓存和索引机制的、可以注册EventHandler的client,负责与APIServer进行数据同步。作者还解释了Informer的ListAndWatch方法和定时resync操作的工作原理。最后,文章介绍了控制循环的启动逻辑,即等待Informer完成本地缓存的数据同步操作后,通过goroutine启动控制循环。整体而言,本文通过深入的技术解析,帮助读者了解了声明式API中编写自定义控制器的工作原理和实现过程。文章通过代码示例和详细解释,使读者能够清晰地理解自定义控制器的业务逻辑和实际操作过程。文章还提到了与Neutron相关的业务代码,虽然并非重点,但为读者提供了进一步探索的可能性。文章内容丰富,涵盖了Informer、控制循环、工作队列等核心概念,为读者提供了深入理解Kubernetes API编程范式的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(56)

  • 最新
  • 精选
  • mgxian
    Informer 和控制循环分开是为了解耦,防止控制循环执行过慢把Informer 拖死

    作者回复: 是的

    2018-10-19
    3
    104
  • Joe Black
    看了这两天的文章,感觉k8s的机制实在是太具有普适性了,可以基于它构建各种分布式业务平台。本质上它就是一个分布式对象管理平台。

    作者回复: 说对了。所以说把kubernetes跟swarm mesos各种paas等横向比较没啥实际意义

    2018-10-19
    3
    46
  • 如果一个master 管理的node非常多 通过ListAndWatch 会对master的性能有影响吧

    作者回复: 所以说kubernetes 当前规模是5000

    2018-11-08
    3
    33
  • 勤劳的小胖子-libo
    一般这种工作队列结构主要是为了匹配双方速度不一致,也为了decouple双方。比如典型生产者消费者问题

    作者回复: 对的

    2018-12-15
    17
  • gogo
    请问老师,如果用deployment部署一个tag是latest的镜像,怎样进行滚动更新呢?set image的话tag不变,不能出发更新呢

    作者回复: 要用滚动更新就不要用latest tag,否则你准备怎么知道当前在用的是哪个版本的镜像?

    2018-10-19
    2
    11
  • jssfy
    请问这个控制器是跑在node节点上的?一般哪些控制器是跑在node上哪些是跑在master上呢

    作者回复: 无所谓,哪都行

    2018-11-25
    5
  • Monokai
    处理完api对象的事件后就直接存储在etcd里了么?需不需要再和apiserver打交道?

    作者回复: 需要,所有对etcd的操作都要走apiserver

    2019-08-18
    4
  • xfan
    我在读完后,和学习的期间,发现不仅仅CRD有Informer,workqueue构成的自定义控制器,而且client-go中也有个类似的,这两者之间有什么联系吗,还是就是一个东西

    作者回复: 一个东西

    2019-01-17
    4
  • LinYongRui
    张老师您好,请问如果在这个框架下,有人手动删除了一个实际的neutron network,但是本地缓存和apiserver的状态是一致的,那么在period sync的时候,是不是就不会去真正检查实际状态和本地缓存的差别了呢?因为我看到eventhandler的update那边会直接return了? 谢谢

    作者回复: 这个逻辑可以自己在handler里处理一下,我没cover这种情况而已

    2018-11-10
    4
  • runner
    张老师,问个问题,我们公司的docker业务,容器总数上万个,部分容器依赖宿主机配置文件。现在我们想迁k8s 的话,能不改动这些容器,把他们加入pod管理起来么?如果上万容器都重新调度生成的话,这个改动太大了。

    作者回复: 给它们写yaml描述起来吧。

    2018-10-19
    4
收起评论
显示
设置
留言
56
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部