是否在就绪探测失败后重试 Pod

Posted

技术标签:

【中文标题】是否在就绪探测失败后重试 Pod【英文标题】:Is probing of a Pod retried after a readiness probe fails 【发布时间】:2021-08-29 23:46:02 【问题描述】:

readinessProbe:指示容器是否准备好响应请求。如果就绪探测失败,端点控制器会从与 Pod 匹配的所有服务的端点中删除 Pod 的 IP 地址。初始延迟之前的默认就绪状态是失败。如果 Container 不提供就绪探测,则默认状态为 Success

如果就绪探测失败(并且 Pod 的 IP 地址已从端点移除),接下来会发生什么? 是否会再次检查 Pod 的就绪探测条件?它会在初始延迟后再次检查吗? Pod 的 IP 地址是否有可能再次添加到端点(如果 Pod 在就绪探测失败后自我修复)?如果 Pod 被修复,它会再次接收流量吗?

【问题讨论】:

您是在询问准备情况探测还是相似度探测? 嗨@Raedwald 我问的是准备情况探测而不是活性探测 Readiness 状态完全独立于 liveliness 状态。如果 Pod 没有准备好,就再也不会被选中,那么就绪探测将是 liveness 探测,除非你让垃圾运行而不是重新启动它。您可能希望从服务中显式删除 pod,例如,当它可能正在运行一些昂贵的计算/批处理作业时,当它完成时,您可能希望将其重新上线。 @GACy20 是的,即使它变成垃圾,它也会在周期时间间隔内不断检查。所以垃圾也不断评价对! 【参考方案1】:

是否会再次检查 pod 的就绪概率条件?

是的,将根据您设置的阈值再次检查条件。

将在每个periodSecondsconfiguration 上检查 POD 的准备情况。

它会在初始延迟后再次检查吗?

它只会在初始延迟之后检查。 POD 初始化或启动时会出现初始延迟。就绪检查将等待配置的时间,然后在每个时间间隔开始检查 POD 的就绪情况,假设每5 秒或10 秒取决于periodSeconds 的配置。

是否有机会将 pod 的 IP 地址再次添加到端点(如果 就绪探测失败后 pod 自我修复)?

是的,如果得到自动修复意味着,successThreshold 设置为 1 时间,如果 POD 给 200 一次,它将被标记为修复,运行 pod 在这种情况下,POD 将再次获得流量。

如果 pod 痊愈了,它还会再次接收流量吗?

是的

例如:

readinessProbe:
            httpGet:
              path: /k8/readiness
              port: 9595
            initialDelaySeconds: 25
            periodSeconds: 8
            timeoutSeconds: 10
            successThreshold: 1
            failureThreshold: 30
        livenessProbe:
            httpGet:
              path: /k8/liveness
              port: 9595
            initialDelaySeconds: 30
            periodSeconds: 8
            timeoutSeconds: 10
            successThreshold: 1
            failureThreshold: 30

readiness 和 liveness 探测将检查配置中提到的 HTTP 端点上的状态。

initialDelaySeconds :它只会在您的 POD 初始化或由于重新启动或其他任何原因重新启动时出现。因此,当 POD 开始准备就绪时,直到 30 秒才会检查服务状态。

30 seconds 之后会尝试检查端点上的状态。如果成功的 POD 将处于 ready 状态以处理流量,否则它将再次尝试periodSeconds,因此在 8 秒后,如果我们愿意,它将再次尝试@ 987654331@ POD 将 Ready 或将在 8 秒后尝试。

timeoutSeconds :单跳或请求将等待从服务获得响应的时间量,否则标记为失败检查。

failureThreshold :此 POD 将根据配置的活跃度或准备情况启动或更改为未就绪状态后的最大失败检查次数。

successThreshold :成功阈值表示单个请求是否获得成功响应,服务 POD 状态变为 Ready

如果连续 30 failureThreshold 发生,那么只有 POD 将被标记为 未准备好 如果在 single successThreshold 之间发生 POD 将将标记为 Ready 与活性相同。

注意:以上示例仅供参考,不能用于实际生产场景。

阅读更多:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

【讨论】:

嗨@Harsh manvar,我仍然需要澄清这部分。我已经编辑了我的问题。你能回答吗? 是的,它会根据设置的时间间隔每次检查活跃度和准备情况。并且 pod 可以在一次未通过 liveness 和 readiness 检查后恢复到健康和就绪状态。 以这个配置示例为例:initialDelaySeconds: 25 periodSeconds: 8 timeoutSeconds: 10 successThreshold: 1 failureThreshold: 30 initial delay second 表示 25 秒准备就绪后将检查 pod 是否可以处理请求。每 8 秒就绪检查后就会有一个就绪。 将等待 10 秒超时以响应读取表单服务。如果我们将从服务中获得 1 次 200 响应,则由于successThreshold,它将标记为就绪。如果在串行线路就绪检查失败 30 次并获得 404 或 400 状态将更改为 Not ready 和 POD 获得 restarted 并再次检查将开始,但在 25 秒后作为延迟,如果 POD 出现并开始工作,它将开始接受流量。 如果您的服务启动时间较短,则将initialDelaySeconds 也减少到 2-3 秒,但如果是繁重的工作并且服务需要大约 30-40 秒的时间,请以这种方式进行调整。还设置periodSeconds 表示您希望每 8 秒运行一次就绪检查的间隔时间。【参考方案2】:

在与往常一样的 periodSeconds 延迟之后再次检查它,然后当它连续通过 successThreshold 次时,它将再次被视为就绪,并具有所有正常行为。

【讨论】:

嗨@coderanger 你是说它只在 periodseconds 之后再次检查而不考虑初始延迟? 否,仅在容器启动时使用。在添加启动探测之前,我们就是这样处理启动延迟的。 嗨@codranger 在读取探针的情况下放弃,吊舱将被标记为未就绪。我的问题是放弃后是否会再次检查吊舱的就绪概率条件?那个吊舱会准备好吗? 正如我的回答所说,是的,在successThreshold 成功探测后,容器将再次标记为就绪。

以上是关于是否在就绪探测失败后重试 Pod的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq~消息失败后重试达到 TTL放到死信队列(事务型消息补偿机制)

K8s 存活(liveness)就绪(readiness)和启动(startup)探测器

聊聊数据库乐观锁和悲观锁,乐观锁失败后重试

k8s之Probe

Spring Kafka - 事务回滚后重试时,通过侦听器容器事务发布消息和提交记录偏移失败

Angular Http 请求出错后重试