OpenKruise: Container Restart

233 阅读2分钟

阅读本节前请了解 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 的生命周期

删除处理

  1. if crr.DeletionTimestamp != nil || crr.Status.CompletionTime != nil , 含义:crr 已经被标记删除或者已经被标记完成

    1. 如果 finializers 里有 "crr.apps.kruise.io/unready-acquired",则移除该 finalizer
    2. 如果 crr.DeletionTImestamp != nil ,则返回表示不需要处理(原因是这个字段的出现代表设置了优雅退出,意味着 kubelet 已经收到了请求并会在 30s 后结束 pod)
    3. 如果 crr 存在 label "crr.apps.kruise.io/active",意味着 crr 还没结束,与 status.completionTime != nil 不一致,则直接返回等下一次 reconcile 再处理
    4. 走到这里意味着 crr 已经完成了,检查一下优雅退出时间(TTLSecondsAfterFinished),如果超过了直接删除,没超过就等到优雅退出时间再做一次 reconcile 处理

异常处理

  1. 如果超过一分钟 crr.Status.Phase == "", 则报错

  2. 根据 crr.Spec.ActiveDeadlineSeconds可以计算出如果 crr 存活时长超过该值,则也报错

  3. 如果 crr 不处于工作中(crr.Status.Phase != "recreating"),则等待下一轮 reconcile 处理

    1. Phase 有三个状态 Pending, Recreating, Completed

状态更新

  1. 把 pod 状态同步到 crr
  2. 如果存在字段 crr.Spec.Strategy.UnreadyGracePeriodSeconds 且有 annotation crr.apps.kruise.io/unready-acquired == "",那么意味着需要优雅退出时间,则将 crr.apps.kruise.io/unready-acquired 添加到 finalizer 并在 readiness webhook 中标记 not ready

Kruise-Daemon: Containerrecreate

详情参考 kruise-daemon: containerrecreate