【独家】K8s 漏洞报告|引起 Kube-Apiserver 崩溃的 PR

举报
鲲鹏小玩家 发表于 2020/03/31 19:13:08 2020/03/31
【摘要】 1. 近期 BugFix 汇总2. 近期重要 BugFix 分析——本期更新内容1近期 Bug Fix 数据汇总Kubernetes 1.17 已于一个月前发布,针对此版本的 bug fix 相对较少,且到现在为止仍然只有 1.17.0 一个小版本。笔者通过分析发现绝大多数的 Bug Fix 都是一些小的或者冷门特性的修复,不影响正常使用。下面会挑选用户可能比较关心的 Bug 进行解读。1近...

1. 近期 BugFix 汇总

2. 近期重要 BugFix 分析

——本期更新内容

1

近期 Bug Fix 数据汇总

Kubernetes 1.17 已于一个月前发布,针对此版本的 bug fix 相对较少,且到现在为止仍然只有 1.17.0 一个小版本。笔者通过分析发现绝大多数的 Bug Fix 都是一些小的或者冷门特性的修复,不影响正常使用。下面会挑选用户可能比较关心的 Bug 进行解读。

1

近期重要 Bug Fix 分析

回滚# 83520: 引起 Kube-Apiserver 崩溃的 PR

按照 Kubernetes 的设计,在进行 List 操作时,请求参数 option 的 ResourceVersion 字段有以下三种设置:

  1. 如果不设置,则请求 Etcd 中最新的数据。

  2. 如果设置为 0,则返回 Api-server 中缓存的所有数据。

  3. 如果设置为非 0 值,则返回至少与给定值一样新的结果。

#83520 这个 PR 合入之前,Client-go 中的 List 操作总是将请求参数 option 中的 ResourceVersion 设置为“0”,也就是返回 Api-server 中缓存的所有数据。这样会导致在重新 List 时,有返回旧数据的可能。spacer.gif

image.png

#83520 合入后,在重新 List 时,option 中的 ResourceVersion 不再设为 0,而是设置为上一次收到的资源的 ResourceVersion。这样可以避免收到老的事件且重复处理。如果服务端返回 410(即请求中的 ResourceVersion 太旧),将会把 ResourceVersion 设为空并继续 List,此时将请求 Etcd 中最新的数据。

image.png

但在测试过程中发现#83520 合入后,在 master 滚动升级的过程中会引起集群失败。原因在于:

  1. 大规模集群环境下,在滚动升级 master 的过程中,新起的 Api-Server 都是从 Etcd 获取的最新数据。

  2. 客户端用本地缓存的上一次收到的资源的 ResourceVersion 去 List,此时服务端将给客户端返回 410,那么客户端都会将 ResourceVersion 设为空并继续 List。

  3. 此时对于每个请求 Api-Server 都会去 Etcd 请求数据,并且转码。

  4. 大规模场景下,大量的客户端执行此操作,这将使 Api-Server 卡死,出现集群失败的情况。

目前#83520 已经被回滚,并且 cherry-pick 到 release-1.17,但是还未出现在小版本中。

受影响版本: v1.17.0

相关 PR、Issue:

https://github.com/kubernetes/kubernetes/pull/83520

https://github.com/kubernetes/kubernetes/pull/86824

https://github.com/kubernetes/kubernetes/issues/86483

END

原文: https://www.infoq.cn/article/rsJKxKpSgzVNmBy1uxtb

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。