[英]kubernetes: how to restart pod on memory limit threshold
我有一个 memory 限制的部署
resources:
limits:
memory: 128Mi
但是我的应用程序在接近限制时开始失败,所以,有什么方法可以在 pod 达到 memory 限制的百分比之前重新启动它?
例如,如果限制为 128Mi,则在达到 85% 时重新启动 pod。
我将从 Kuberentes 方面解决这个问题。
正如 arjain13 已经提到的,您想到的解决方案不是通往 go 的方法,因为它违反了Requests and limits的想法:
如果您为该容器设置了 4GiB 的 memory 限制,则 kubelet(和容器运行时)会强制执行该限制。 运行时防止容器使用超过配置的资源限制。 例如:当容器中的进程尝试消耗超过允许的 memory 数量时,系统 kernel 终止尝试分配的进程,并出现 out of ZCD69B4957F06CD818D7BFOO3D61980E291 错误。
您还可以找到超出容器的 memory 限制的示例:
如果节点有 memory 可用,则容器可以超过其 memory 请求。 但是一个 Container 不能使用超过它的 memory 限制。 如果 Container 分配的 memory 超过其限制,则该 Container 成为终止的候选者。 如果 Container 继续消耗 memory 超出其限制,则 Container 被终止。 如果可以重新启动终止的容器,则 kubelet 会重新启动它,就像任何其他类型的运行时故障一样。
我想建议您在当前的用例中尝试两件事:
调试您的应用程序以消除 memory 泄漏,这似乎是此问题的根源。
使用livenessProbe :
指示容器是否正在运行。 如果 liveness 探测失败,kubelet 会杀死容器,容器会受到其重启策略的约束。
可以使用以下字段进行配置:
initialDelaySeconds
:容器启动后,在启动活动或就绪探测之前的秒数。 默认为 0 秒。 最小值为 0。
periodSeconds
:执行探测的频率(以秒为单位)。 默认为 10 秒。 最小值为 1。
timeoutSeconds
:探测超时的秒数。 默认为 1 秒。 最小值为 1。
successThreshold
:探测失败后被视为成功的最小连续成功。 默认为 1。活性必须为 1。 最小值为 1。
failureThreshold
:当探测失败时,Kubernetes 将在放弃之前尝试failureThreshold
次。 在 liveness probe 的情况下放弃意味着重新启动容器。 在就绪探测的情况下,Pod 将被标记为未就绪。 默认为 3。最小值为 1。
如果您为periodSeconds
、 timeoutSeconds
、 successThreshold
和failureThreshold
设置最小值,您可以期待更频繁的检查和更快的重启。
您将在下面找到一些有用的资源和指南:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.