#DevOps #K8s #RePost https://twitter.com/halfbloodrock/status/1729876674786070751 趁着滴滴宕机10小时,都说是Kubernetes升级引起的,刚好kubernetes是老本行,在eBay那几年,都是在做大规模kubernetes集群管理,kubernetes集群升级这块,正好蹭个热点,讲讲这几年在kubernetes上踩过的坑。

kubernetes 升级遇到的坑汇总:

ip pool block要是配小了,很可能出现pod拿不到IP起不来而计算资源空闲的情况。调度器可不看IPAM里还有多少剩余IP
为啥要改k8s代码?For KPI? k8s一直到1.12才趋于稳定,比如admission webhook是1.9才引入,到1.13稳定 之前admission上的一些需求只能改上游代码,改动提给社区,人家不一定要,而后面版本cherrypick这些自己改的代码,维护起来还是比较痛苦的。 不过到今天绝大部分需求都不用再改上游代码
改了上游代码,最好的结果是,提给社区合并进主干。但是大部分情况是提上去的社区不接受,原因众多。 那在下个大版本升级时候,需要把改过的代码cherry-pick进去,解决冲突,过UT,过e2e,过benchmark
k8s可以应用无感知升级吗? 至少1.18之前不行 Kubelet升级之后要重新算下pod hash,会重建底层容器,不少应用其实不太能容忍这个动作,每次升级都要收到很多pod重启的抱怨
有状态应用到底能不能上k8s? k8s的statefulset解决的是pod启动顺序问题,其实真正的核心点是有状态应用如何存数据。 像es这种天生分布式的,可采用本地lvm卷做存储https://github.com/openebs/lvm-localpv… 像MySQL,官方推荐的是mysql cluster+proxy (但是我没在生产上跑过) https://github.com/mysql/mysql-operator
为啥一升级就挂?k8s里有两个地方变动相对频繁,一个是feature gate,一个是api-version 问题七中的坑,1.10之前可以disable这个feature gate,但是1.10之后强制打开,没有disable的机会。 升级过程中发现了,用户改代码没那么快咋办?只能把上游的这个commit 去掉
能跨版本升级吗?能跨多少版本? 不要跨超过三个版本:https://kubernetes.io/zh-cn/releases/version-skew-policy/… 熟读ChangeLog 曾经的坑,用户在pod里对secret做修改,1.10之后社区去除了这个功能,这直挺挺升级上去用户应用就挂了。这些变动在每个版本ChangeLog里都有

source GitHub - openebs/lvm-localpv: CSI Driver for dynamic provisioning of Persistent Local Volumes for Kubernetes using LVM.
 
 
Back to Top
OKHK