前几天,朋友圈里疯转了一篇知乎上的帖子,《Kubernetes 惊天地泣鬼神之大Bug》。很多朋友看到了帖子,纷纷转发给我以表慰问。看到该bug会影响到所有的Kubernetes集群,吓得我赶紧吃根辣条冷静一下。

在线上的巡检邮件梳理了一遍,貌似没发现异常。冷静下来再想想,以我们的集群规模,如果真有这个bug,那么早就该发现了,为何到现在没有爆出来。按照作者的触发方式,我进行了反复的实验,怎么也触发不了。我感觉又不淡定了,啥情况,不是说所有的都会影响么?为啥触发不了?我决定追根溯源,来找找到底为啥会出现这样的问题。
此bug,按照作者的描述,基本上是这样的,对于Kubernetes的某一种资源(不仅是service,其他的资源一样应该也是如此),如果先创建一个最早的对象a,然后再执行一些创建对象的操作,最后再删除那个最早的对象a,此时watch到的删除event中的对象a的resourceVersion不是期待的一个最新最大的resourceVersion,而是最早创建这个对象a时的创建event中的那个老的resourceVersion,从而导致controller-manager的一些回放event的行为。对应到资源service上就是作者描述的service的删除创建被回放,导致其所属的endpoint的消失和重建,从而造成服务的不稳定性。
看完我们立刻在自己的环境上验证,看是否可以重现,结果是未能重现,实验结果如下,所有event的object的resourceVersion都是递增的。

这与作者描述的完全不符合啊。算了,我们还是去源码里找答案吧。
delete时间的resourceVersion是在这里,在我们的主力版本(1.6)上,该代码是这样的。

这里的入参 watchCacheEvent的event是从etcd中获取的。我们使用命令行从etcd中把这些事件抓取出来。

其中kv对应的是event中的Object,prev_kv对应的是event中的PrevObject。红线圈出的Delete情况的event.preObject的resourceVersion是此对象上一次event的mod_revision,因此会小于Object的resourceVersion。这样我们就可以理解了,在1.6版本中,始终是以当前的Object的resourceVersion作为watch event的resourceVersion,这样所有的event中的resourceVersion都是递增的。这个是没有问题的。
而在1.7+的版本中,该代码是这样的。

这个时候,watch event的resourceVersion变为了PreObject的,这样就必然存在在watch的event的resourceVersion不是严格递增的,当遇到delete事件时,会返回到前面某个event的resourceVersion上去的问题。
之后社区的修复#58547后的代码是这样的。

这里可以看到,watch event的resourceVersion被更新为了event的ResouceVersion,重新保证了event的resourceVersion始终是递增的。
在对比了GitHub上的commit记录,可以看到,此bug是在#46223这个pr中引入的。该pr被合入到1.7.0之后的版本,可以参见https://github.com/kubernetes/kubernetes/commit/e9e69356e4907fa4d0f45ea7e7768357ba71aba9#diff-dc17590f6b960d2fea2b44de5c0fbc10
而社区在#58547这个pr中修复此问题,也就是说可以对比https://github.com/kubernetes/kubernetes/commit/57998d247df74cc96547158a0b39e5d7bffa271b#diff-dc17590f6b960d2fea2b44de5c0fbc10中之后的版本得以修复。因此受影响的版本主要是介于两个pr之间的版本。
这里我们介绍一下复现的方法,大家可以参照来自检下自己的集群是否需要修复。

Kubernetes版本不断向前发展,这其中会有老的bug被修复,也可能会有新的bug被引入。这些对于社区都是很正常的。但是对于生产环境来说,又是存在着较大的风险的。在实际生产过程中,我们开发了一系列的周边工具和运营监控系统,用以保证集群的稳定。毕竟稳定可靠对于生产环境来说,才是最基本的原则。
本文转载自公众号:TIGCHAT,点击查看原文。
Kubernetes入门与进阶实战培训
本次培训内容包括:Docker基础、容器技术、Docker镜像、数据共享与持久化、Docker三驾马车、Docker实践、Kubernetes基础、Pod基础与进阶、常用对象操作、服务发现、Helm、Kubernetes核心组件原理分析、Kubernetes服务质量保证、调度详解与应用场景、网络、基于Kubernetes的CI/CD、基于Kubernetes的配置管理等,点击了解具体培训内容

6月22日正式上课,点击阅读原文链接即可报名。

虽然惊天地,但不是人人都会哭泣 ——再论Kubernetes惊天地泣鬼神之大Bug相关推荐

  1. 人人都会Vue,你的优势在哪里?

    Vue,React这样的框架可以说是现在前端的必备技能,一个刚入门两三个月的前端都是要会Vue的. 但是大家有没有想过一个问题?Vue,React这样的框架已经是基本功,我们凭什么敢说比别人厉害呢? ...

  2. 人人都会设计模式---代理模式--Proxy

    教程大纲 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/1b3b6b003- 本文出自 Tiger ...

  3. 07、人人都会设计模式:建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

  4. 人人都会设计模式---建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/300cbb9ee- 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1.阅读对象 本 ...

  5. 人人都会设计模式:07-建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

  6. 05、人人都会设计模式:代理模式--Proxy

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/1b3b6b003032 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

  7. 视频教程-人人都会深度学习之Tensorflow基础入门-深度学习

    人人都会深度学习之Tensorflow基础入门 大数据工程师/算法工程师/大数据讲师,毕业于西华大学软件工程专业.在大数据领域有着丰富的实战经验. 擅长领域:Spark/Hadoop.算法设计及系统架 ...

  8. 大数据治理不是人人都会(一)

    大数据治理不是人人都会  作者结合在区域医疗领域数据治理的经验,以Kimball数仓建设方法论为核心,希望能深入浅出的讲解大数据治理的思想和方法,让大家对大数据治理的功能效用有一个全面的认识,走出一些 ...

  9. oc引导windows蓝屏_人人都会遇到系统蓝屏问题,教大家自已排除蓝屏,学会一辈子受用...

    一.造成电脑蓝屏有那些? 1.在这里我跟大家聊聊,我想只要自已有电脑人都会遇到电脑蓝屏问题,那怎么排除蓝屏问题?首先要找到电脑蓝屏的原因才针对性的处理,引起电脑蓝屏的原因有很多: 2.硬件方面有:电脑 ...

最新文章

  1. VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 int __cdecl invoke_main(void)
  2. ITK:二进制XOR两个图像
  3. monkey测试_安卓测试之monkey
  4. modbus tcp主站和从站_【智】S7200PLC与台达变频器MODBUS轮询实时读取详解
  5. 计算机领域 热点应用,2017年度计算机科学各领域热点词汇
  6. 开始使用 TypeScript
  7. 推荐一些socket工具,TCP、UDP调试、抓包工具
  8. iOS音频采集技术解读:如何实现男女变声的音效?
  9. linux中文件颜色,蓝色,白色等各代表含义
  10. 如何提高迅雷下载速度
  11. EasyUI TreeGrid各行调整上下位置
  12. C语言实现-求m到n之和
  13. idm下载器如何使用 idm下载器使用技巧
  14. 如何开笔记本电脑的无线WIFI(有图有真相)
  15. 2、【斯纳克图书馆管理系统】运行环境
  16. 阿里中台高管,辞职创业做中台!这次会不会搞砸?
  17. 下单后,买家申请退款怎么办?(附金牌客服挽留方案及话术)
  18. 利用Vue.js实现简单员工管理系统(增删查)的功能
  19. C# 命令行如何静默调用 del 删除文件
  20. Java Swing 经典小游戏《飞机大战》———— (四)碰撞检测 游戏状态与得分 玩家升级

热门文章

  1. Apache Server搭建图片服务器
  2. mongodb,robomongo 数据查询
  3. vcruntime140_1.dll下载及安装【vcruntime140_1.dll丢失的解决方法】
  4. ffmpeg常用命令汇总(倒放/左右翻转/上下翻转/倍速/压缩/去声音/加水印/画中画/缩放等)
  5. P1610 鸿山洞的灯 - 贪心
  6. 计算机硬件相关的论文,计算机硬件论文范文
  7. pytdx 调用沪深300 所有股票实时行情
  8. 计算机游戏32,ppsspp模拟器pc版
  9. 考勤软件之:考勤排班规则
  10. 数据结构:图的基础知识