关于Kubernetes探针第一次探测的问题

关于k8s的两种探针,想必大家都参考过(https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/),根据上面的解释,k8s的这两种探针都有initialDelaySeconds属性,它的作用是决定container启动后进行第一次探测的时间,由于服务启动是需要时间的,如果这个属性设置不好,则这个服务的状态很可能就是错误的,设置时间太短可能导致探针多次探测失败从而使服务失效,设置时间太长,则k8s要花很长时间才认为服务进入“ready”状态。因此,设置initialDelaySeconds必须慎之又慎,同时我们还经常让periodSecondsfailureThreshold配合其使用,例如:

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5
  failureThreshold: 3

上面的配置好理解,探针在容器启动5s后开始探测,并且之后每5s检测一次,如果检测失败的次数大于3,则放弃,认为服务“Unready”(对于liveness探针,则会在放弃后重新启动pod)。
这个配置在periodSeconds较小时,是比较符合预期的,但是当你将periodSeconds配置较大数值时,会发现,初次探针探测的时间也变长了,不是原有的5s,很有可能几分钟之后才进行第一次探测,这对于有的服务来说是不可接受的:明明我几秒就启动成功了,可以提供服务了,为什么k8s要几分钟后才认为我ready呢?有关这个问题的讨论,可以参考https://github.com/kubernetes/kubernetes/issues/62036,最终通过查看k8s源码(https://github.com/kubernetes/kubernetes/blob/b8ab2891b36baa3bbb4e81011e39d5d23a8d46e9/pkg/kubelet/prober/worker.go#L118),你会发现下面这段代码:

// run periodically probes the container.
func (w *worker) run() {
    probeTickerPeriod := time.Duration(w.spec.PeriodSeconds) * time.Second

    // If kubelet restarted the probes could be started in rapid succession.
    // Let the worker wait for a random portion of tickerPeriod before probing.
    time.Sleep(time.Duration(rand.Float64() * float64(probeTickerPeriod)))

    probeTicker := time.NewTicker(probeTickerPeriod)

    defer func() {
        // Clean up.
        probeTicker.Stop()
        if !w.containerID.IsEmpty() {
            w.resultsManager.Remove(w.containerID)
        }

        w.probeManager.removeWorker(w.pod.UID, w.container.Name, w.probeType)
        ProberResults.Delete(w.proberResultsMetricLabels)
    }()

probeLoop:
    for w.doProbe() {
        // Wait for next probe tick.
        select {
        case <-w.stopCh:
            break probeLoop
        case <-probeTicker.C:
            // continue
        }
    }
}

请特别注意time.Sleep()那段,正是由于那段代码,第一次探针进行探测的时间是initialDelaySeconds + random(periodSeconds),因此periodSeconds的值设得越大,探针第一次探测的时间就越长,服务处于“unready”的状态就越长,如果你要一次性重新部署多个服务,并且依赖于其他服务的话,这一个看似小小的隐患很有可能造成一连串所依赖的服务探针检测失败(因为有的探针是要对其他服务做healthcheck,其他服务由于重新部署,导致k8s第一次去检测状态是否ready的时间拖延太久,而此期间服务可能早已经ready,但k8s由于还没进行第一次检测,所以认为服务“unready”,引起其他探针探测失败),从而引发整个服务不可用,因此,这点大家在配置时要特别注意。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275