【问题标题】:Rediness & Livenesss failing at random intervalReadiness 和 Liveness 以随机间隔失败
【发布时间】:2020-05-13 15:50:09
【问题描述】:

我们正在 GKE 上运行烧瓶微服务。接受所有流量并将其分配给其他服务的主应用程序正在重新启动。

POD 的就绪和活跃度开始随机超时。但是,我们正在运行 5 个特定服务的 pod,它是无状态应用程序。我注意到一件事,记忆也随着时间的推移而不断增加。

是否由于 docker python-slim 图像在某个级别无法处理应用程序以及 pod 中的持续内存增加,是否就像操作系统 python-slim 不释放内存一样?

注意:此行为仅适用于生产而不是暂存(运行单个应用程序 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

【问题讨论】:

  • 它看起来像连接到这个stackoverflow.com/questions/59134207/…。在我看来,您应该尝试增加限制,监控内存使用情况并关注cloud.google.com/blog/products/gcp/…。顺便说一句,正如您在 flask.palletsprojects.com/en/1.0.x/deploying 看到的那样,“虽然轻量级且易于使用,但 Flask 的内置服务器不适合生产,因为它不能很好地扩展。”
  • @SerhiiRohoza 感谢您撰写答案和建议,我已经尝试了所有方法,但到目前为止没有任何帮助。设置的资源限制绰绰有余。
  • 你有任何可以阻塞和锁定线程的请求处理程序吗?如果您有太多这些并且它们都同时发生,您可能会用完工作线程并且无法处理新请求。

标签: python kubernetes google-cloud-platform microservices google-kubernetes-engine


【解决方案1】:

虽然在不查看集群中的清单、事件或其他跟踪信息的情况下提供答案有点困难,但我经常看到这种情况发生在人们误解/错误配置就绪和活跃度探测器和/或未正确扩展时.

例如,您可能有一个探针:

readinessProbe:
  httpGet:
    path: /healthz
    port: 443
  failureThreshold: 1
  periodSeconds: 10

这意味着,每 10 秒检查一次,如果 http GET/healthz:443 正常,如果失败一次,则停止发送流量(因为它只是一个就绪探测)。

如果不设置timeoutSeconds,默认为1秒。

在负载下经常发生的情况是,如果不添加额外的 pod 并且延迟不断增加,/healthz:443 端点需要越来越长的响应时间。

最终,一旦它徘徊在 1 秒左右,一次超时将导致准备失败 - 这是最好的情况。

如果你的 liveness probe 是这样配置的,你会重启 pod,这会更糟。

这个article 很好地解释了为什么使用活性探针并不总是明智的(除非你有一个非常具体的检查)。

在负载导致这种情况的情况下,您实际上可以设置 1 秒超时(默认值),但如果您的延迟增加,您可能希望使用 HPA 之类的东西来添加额外的 pod。

【讨论】:

  • timeout: 10failureThreshold: 30 非常“放松”我想说,在停止发送流量/重新启动之前,您可以有很长的停机时间,periodSeconds: 8 * 30 = 4 分钟可能的停机时间。我会让它更严格。但在这种情况下,探针可能不是您的问题(如果您看到的是光点而不是延长停机时间) - 除非您看到延迟在 10 秒左右徘徊
  • 我认为您需要进一步分析您的应用程序并查看您提到的可能的内存泄漏。如果您的 pod 被 OOMKilled,您可能会看到 pod 重新启动 - 不确定是否是这种情况
  • 是的,非常“放松”,我有停机时间,但有时准备就绪和活跃度仍然失败,我在集群操作 GKE 中看到了日志。但是,没有用于杀死容器的日志。在堆栈驱动程序监控中,pod 也未达到内存或 cpu 限制。
  • 在这些情况下,您的健康检查是否可能需要 10 秒才能做出响应?基本上,这意味着在就绪/活跃度开始失败之前,您连续 30 次运行状况检查失败。您需要了解您的健康检查失败的原因,这也可能是上游问题(取决于您的健康检查实际检查的内容)。
  • 健康检查随机失败,但是我们有简单的健康检查端点返回 204 响应,背后没有逻辑我认为在重负载下可能是应用程序无法响应健康检查。
猜你喜欢
  • 2020-06-19
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2018-02-11
  • 2019-05-18
  • 2020-12-13
  • 2022-01-01
相关资源
最近更新 更多