kruise原地升级问题记录
首先关注 pod 上原地升级状态的流转
其次关注单个 pod 原地升级过程中的详细步骤:
图片中详细介绍了 kruise 组件进行原地升级的全过程,主要关注:
- kruise controller 记录上次 pod 的信息打进 pod annotation
- 更改 pod 字段
- 由 kueblet 和 kruise daemon 负责对应的容器更新过程
- daemon 上报一些container 相关的信息到 pod annotation 中
- kruise controller 利用 daemon 上报的容器元信息和 pod 当时的状态进行对比,确定该 pod 是否更新完成
- (H) kruise controller 将更新完成的 pod 状态 readiness gate 和 label 中的状态置为 Normal (webhook逻辑)
一般确定原地升级字段已经更改为期望的值后,我们主要关注为什么 pod 的 readiness gate 还不置为 True,主要是第六步的判断逻辑。
案例:
当 daemon 一直没起来,或者之前没有部署 daemon 的情况下, pod 会因为缺少 daemon 上报的容器元信息而无法推进原地升级判断(开启 env from metadat 时)
此时即使把 daemon 拉起之后,pod 依然没有该 annotation。
阅读源码后可知,daemon 在启动时只会对存在 “apps.kruise.io/runtime-containers-meta” annotation 的 pod 进行处理,其余不触发后续操作
此时有几种思路但都是为了触发容器状态上报流程
- 手动添加改 “apps.kruise.io/runtime-containers-meta” annotation,可行
- 任意修改该 pod 描述,以 annotation 为例,可行
提供一个简单的命令触发该流程
1 | kubectl annotate po -n {{ns}} {{pod}} trigger=aa |