如何避免container频繁地restart?
发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,如何避免container频繁地restart?相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。分析:在 Pod 中 restart container
千家信息网最后更新 2025年01月27日如何避免container频繁地restart?
如何避免container频繁地restart?相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。
分析:
- 在 Pod 中 restart container 的时候(具体时机是,周期性执行 SyncPod() 的时候),Pod 会通过自身的 Status 结构找到当前这个 container(因为 Pod 中可能有多个 container)上一次退出的时间,记为 ts
- 如果是第一次 restart,那么直接重启 container,并且在 Kubelet 的 backOff.perItemBackoff (一个 map 结构,key 是根据 container 和所在 pod 对象计算出来的 id)中记录下次 backoff 的时间(初始值为 10s,然后按照指数增长,最大 5min)
- 如果不是第一次 restart,即 Kubelet 的 backOff.perItemBackoff 中已经有这个 container 的 backOff 记录,计为 backoff,那么
- 如果 now() - ts < backoff,表明等待的时间还不够,抛出 CrashLoopBackOff Event(然后等到下一个 SyncPod 的周期到的时候,重新比较这个值)
- 否则,说明已经等待 backoff 时间了,可以 restart 了,此时执行 backOff.Next(),将该容器对应的 backoff 翻倍,然后执行 restart 操作
- 在步骤 3 中计算 backoff 的过程中,还会去检查当前时间距离上一次 container 退出时的间隔,如果大于 2 * MaxContainerBackOff = 10 minutes,那么会将这个 container 对应的 backoff 重置为初始值 10s
源码细节
kubernetes/pkg/kubelet/kubelet.go
通过源码发现,kubernetes/pkg/kubelet/kubelet.go 文件中有两个常量:MaxContainerBackOff = 300 * time.SecondbackOffPeriod = time.Second * 10
使用这两个变量构造了一个 BackOff 对象,这个是 kubelet 的属性,对该 node 上所有 pod 都适用
klet.backOff = flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff)
BackOff 结构如下
type Backoff struct { sync.Mutex Clock clock.Clock defaultDuration time.Duration maxDuration time.Duration perItemBackoff map[string]*backoffEntry}
然后在 SyncPod 方法中使用这个对象
// Call the container runtime's SyncPod callbackresult := kl.containerRuntime.SyncPod(pod, apiPodStatus, podStatus, pullSecrets, kl.backOff)
- kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go
SyncPod 具体做的事有:
// SyncPod syncs the running pod into the desired pod by executing following steps://// 1. Compute sandbox and container changes.// 2. Kill pod sandbox if necessary.// 3. Kill any containers that should not be running.// 4. Create sandbox if necessary.// 5. Create init containers.// 6. Create normal containers.func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, _ v1.PodStatus, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, backOff *flowcontrol.Backoff) (result kubecontainer.PodSyncResult) {
同样在这个文件中,有一个关键的函数
// If a container is still in backoff, the function will return a brief backoff error and// a detailed error message. func (m *kubeGenericRuntimeManager) doBackOff(pod *v1.Pod, container *v1.Container, podStatus *kubecontainer.PodStatus, backOff *flowcontrol.Backoff) (bool, string, error) { var cStatus *kubecontainer.ContainerStatus for _, c := range podStatus.ContainerStatuses { if c.Name == container.Name && c.State == kubecontainer.ContainerStateExited { cStatus = c break } } if cStatus == nil { return false, "", nil } glog.Infof("checking backoff for container %q in pod %q", container.Name, format.Pod(pod)) // Use the finished time of the latest exited container as the start point to calculate whether to do back-off. ts := cStatus.FinishedAt // backOff requires a unique key to identify the container. key := getStableKey(pod, container) if backOff.IsInBackOffSince(key, ts) { if ref, err := kubecontainer.GenerateContainerRef(pod, container); err == nil { m.recorder.Eventf(ref, v1.EventTypeWarning, events.BackOffStartContainer, "Back-off restarting failed container") } err := fmt.Errorf("Back-off %s restarting failed container=%s pod=%s", backOff.Get(key), container.Name, format.Pod(pod)) glog.Infof("%s", err.Error()) return true, err.Error(), kubecontainer.ErrCrashLoopBackOff } backOff.Next(key, ts) return false, "", nil}
其中 backOff.Next 函数定义如下
// move backoff to the next mark, capping at maxDurationfunc (p *Backoff) Next(id string, eventTime time.Time) { p.Lock() defer p.Unlock() entry, ok := p.perItemBackoff[id] if !ok || hasExpired(eventTime, entry.lastUpdate, p.maxDuration) { entry = p.initEntryUnsafe(id) } else { delay := entry.backoff * 2 // exponential entry.backoff = time.Duration(integer.Int64Min(int64(delay), int64(p.maxDuration))) } entry.lastUpdate = p.Clock.Now()}
看完上述内容,你们掌握避免container频繁地restart的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
时间
内容
对象
时候
结构
频繁
两个
函数
周期
技能
文件
方法
更多
源码
第一次
上一
最大
不够
关键
变量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
在小学宣讲网络安全PPT
移动端软件开发 北京
空间数据库管理模式分
技术领域中网络安全包括什么
四诊数据库
长春有名的网络技术咨询口碑推荐
软件开发物理图
简单的数据库系统
胜帮科技软件开发
腾德信息科技移动互联网
捷顺停车场服务器初始密码
网络安全工程师都有哪些名人
上海网络技术培训中心
数据库SQL查询的经典例子
企业视角下的网络安全
东莞尚梦互联网科技有限公司
u8卫生财务系统数据库
软件开发岗位的区别
服务器系统怎么开启多界面
阿里云服务器如果不备案能解析吗
立柜式服务器
宜兴加工软件开发商店
软件开发合同范本标题
网络安全风险泄露
山西快云软件开发地址
安徽服务器机柜专卖店
网络安全软件挣钱游戏
奉化软件开发报价
sql复制数据库文件
广西涉密软件开发资质