成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 Kubernetes 中的等待重試機制

云計算 云原生
經常使用 Kubernetes 的朋友應該對 CrashLoopBackOff 不陌生,這是一種較常見的 Pod 異常狀態。通常發生在 Pod 內的進程啟動失敗或意外退出(退出碼不為 0),而 Pod 的重啟策略為?OnFailure?或?Always,kubelet 重啟該 Pod 后。

Kubernetes 中有很多需要重試的地方,比如重啟 Pod、CSI 的 PVC 掛載重試等。出錯重試時通常都會等待一個指數增長的時間,本文就來解析這個等待重試的機制。

Pod 的 CrashLoopBackOff 狀態

經常使用 Kubernetes 的朋友應該對 CrashLoopBackOff 不陌生,這是一種較常見的 Pod 異常狀態。通常發生在 Pod 內的進程啟動失敗或意外退出(退出碼不為 0),而 Pod 的重啟策略為 OnFailure 或 Always,kubelet 重啟該 Pod 后。

該狀態表示 Pod 在運行失敗不斷重啟的循環中,而 kubelet 每次重啟的時候都會等待指數級增長的時間。這個重啟等待時間就是通過 backoff 實現的,以下是相關代碼:

// 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.Status
for _, c := range podStatus.ContainerStatuses {
if c.Name == container.Name && c.State == kubecontainer.ContainerStateExited {
   cStatus = c
   break
  }
 }

if cStatus == nil {
returnfalse, "", nil
 }

 klog.V(3).InfoS("Checking backoff for container in pod", "containerName", container.Name, "pod", klog.KObj(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 containerRef, err := kubecontainer.GenerateContainerRef(pod, container); err == nil {
   m.recorder.Eventf(containerRef, v1.EventTypeWarning, events.BackOffStartContainer,
    fmt.Sprintf("Back-off restarting failed container %s in pod %s", container.Name, format.Pod(pod)))
  }
  err := fmt.Errorf("back-off %s restarting failed container=%s pod=%s", backOff.Get(key), container.Name, format.Pod(pod))
  klog.V(3).InfoS("Back-off restarting failed container", "err", err.Error())
returntrue, err.Error(), kubecontainer.ErrCrashLoopBackOff
 }

 backOff.Next(key, ts)
returnfalse, "", nil
}

backoff 的用法

使用 backoff 的方法很簡單,只需要用到 .IsInBackOffSince 和 .Next 方法:

func startBackoff() {
 backOff := flowcontrol.NewBackOff(5*time.Second, 60*time.Second)
 backOffID := "test"

 lastDo := time.Now()
 t := time.NewTicker(1 * time.Second)
defer t.Stop()
forrange t.C {
if backOff.IsInBackOffSince(backOffID, lastDo) { // 判斷當前是否應該執行
   continue
  }
  fmt.Printf("doing work after %s\n", time.Now().Sub(lastDo))
  backOff.Next(backOffID, time.Now()) // 標記已經執行過了
  lastDo = time.Now()
 }
}

以上代碼的輸出結果:

doing work after 1.001035775s
doing work after 5.999162394s
doing work after 10.9999193s
doing work after 21.000754631s
doing work after 40.999154124s
...

也可以對特定 id 重新計時:

backOff.Reset(backOffID)

將所有 id 全部清除:

backOff.GC()

backoff 的實現原理

backoff 的實現就百來行代碼,短小精悍。主結構體內定義了每個 id 對應的任務執行時間和等待時間。

在記錄當前執行時間時,將等待時間設置為上一次等待時間乘 2,實現等待時間指數級增長的效果:

func (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)
  entry.backoff += p.jitter(entry.backoff)
 } else {
  delay := entry.backoff * 2       // exponential
  delay += p.jitter(entry.backoff) // add some jitter to the delay
  entry.backoff = min(delay, p.maxDuration)
 }
 entry.lastUpdate = p.Clock.Now()
}

判斷當前是否需要執行時,只需要判斷是否到了等待時間即可:

func (p *Backoff) IsInBackOffSince(id string, eventTime time.Time) bool {
 p.RLock()
defer p.RUnlock()
 entry, ok := p.perItemBackoff[id]
if !ok {
returnfalse
 }
if hasExpired(eventTime, entry.lastUpdate, p.maxDuration) {
returnfalse
 }
return p.Clock.Since(eventTime) < entry.backoff
}
責任編輯:武曉燕 來源: CS實驗室
相關推薦

2025-01-03 08:44:37

kafka消息發送策略

2021-02-20 10:02:22

Spring重試機制Java

2022-11-14 08:19:59

重試機制Kafka

2024-09-25 08:32:05

2020-07-19 15:39:37

Python開發工具

2022-05-06 07:44:10

微服務系統設計重試機制

2023-10-27 08:20:12

springboot微服務

2017-07-02 16:50:21

2017-06-16 15:16:15

2023-11-27 07:44:59

RabbitMQ機制

2023-11-06 08:00:38

接口高可用機制

2025-05-28 01:15:00

Golang重試機制

2025-02-27 09:35:22

2020-04-02 15:10:57

Kubernetes集群安全

2025-04-18 03:00:00

2024-01-04 18:01:55

高并發SpringBoot

2024-09-30 08:30:37

2025-02-26 08:10:40

2025-03-11 08:30:00

Pythonretrying代碼

2021-11-24 08:33:09

Android廣播機制應用程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美色性 | 91社影院在线观看 | 国产亚洲网站 | 日韩在线一区二区 | 毛片一区二区三区 | 黄免费观看视频 | 毛片黄片 | 伊人超碰在线 | 亚洲欧美中文日韩在线v日本 | 特级毛片爽www免费版 | 亚洲精品久久久一区二区三区 | 999久久久免费精品国产 | 国产精品久久久久久吹潮日韩动画 | 久久久国产精品网站 | 美女啪啪国产 | 日本不卡一区二区三区在线观看 | 亚洲一区二区三区四区五区中文 | 视频国产一区 | 欧美一区二区在线观看 | 国产精品视频在线播放 | 一级毛片免费 | 日韩精品在线免费观看视频 | 亚洲高清在线观看 | 亚洲精品成人网 | 精精国产xxxx视频在线 | 欧美精品综合在线 | h片在线观看网站 | 在线一区二区三区 | 日韩午夜网站 | 国产日韩精品一区二区三区 | 欧美一区精品 | 成人福利网站 | 人人干人人艹 | 日韩成人一区二区 | 午夜在线视频 | 日韩电影免费在线观看中文字幕 | 国产在线观看一区二区 | 亚洲久久一区 | 欧美在线观看一区 | 成人精品一区二区 | 天堂男人av|