阅读本节前请了解 Container Restart 的使用和功能,CRR 依赖 kruise daemon
系列教程: Openkruise
openkruise doc :openkruise.io/zh/docs/use…
目录: pkg/controller/containerrecreaterequest/
pkg/daemon/containerrecreate/
ContainerRecreateRequest 可以帮助用户重启/重建存量 Pod 中一个或多个容器。
和 Kruise 提供的原地升级类似,当一个容器重建的时候,Pod 中的其他容器还保持正常运行。重建完成后,Pod 中除了该容器的 restartCount 增加以外不会有什么其他变化。 注意,之前临时写到旧容器 rootfs 中的文件会丢失,但是 volume mount 挂载卷中的数据都还存在。
这个功能依赖于 kruise-daemon 组件来停止 Pod 容器。 如果 KruiseDaemon feature-gate 被关闭了,ContainerRecreateRequest 也将无法使用。
Reconcile
管理 crr 的生命周期
删除处理
-
if crr.DeletionTimestamp != nil || crr.Status.CompletionTime != nil, 含义:crr 已经被标记删除或者已经被标记完成- 如果 finializers 里有 "crr.apps.kruise.io/unready-acquired",则移除该 finalizer
- 如果 crr.DeletionTImestamp != nil ,则返回表示不需要处理(原因是这个字段的出现代表设置了优雅退出,意味着 kubelet 已经收到了请求并会在 30s 后结束 pod)
- 如果 crr 存在 label "crr.apps.kruise.io/active",意味着 crr 还没结束,与 status.completionTime != nil 不一致,则直接返回等下一次 reconcile 再处理
- 走到这里意味着 crr 已经完成了,检查一下优雅退出时间(TTLSecondsAfterFinished),如果超过了直接删除,没超过就等到优雅退出时间再做一次 reconcile 处理
异常处理
-
如果超过一分钟 crr.Status.Phase == "", 则报错
-
根据
crr.Spec.ActiveDeadlineSeconds可以计算出如果 crr 存活时长超过该值,则也报错 -
如果 crr 不处于工作中(crr.Status.Phase != "recreating"),则等待下一轮 reconcile 处理
- Phase 有三个状态 Pending, Recreating, Completed
状态更新
- 把 pod 状态同步到 crr
- 如果存在字段 crr.Spec.Strategy.UnreadyGracePeriodSeconds 且有 annotation crr.apps.kruise.io/unready-acquired == "",那么意味着需要优雅退出时间,则将 crr.apps.kruise.io/unready-acquired 添加到 finalizer 并在 readiness webhook 中标记 not ready