簡體   English   中英

kubernetes:如何在 memory 限制閾值上重啟 pod

[英]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 會重新啟動它,就像任何其他類型的運行時故障一樣。

我想建議您在當前的用例中嘗試兩件事:

  1. 調試您的應用程序以消除 memory 泄漏,這似乎是此問題的根源。

  2. 使用livenessProbe

指示容器是否正在運行。 如果 liveness 探測失敗,kubelet 會殺死容器,容器會受到其重啟策略的約束。

可以使用以下字段進行配置:

  • initialDelaySeconds :容器啟動后,在啟動活動或就緒探測之前的秒數。 默認為 0 秒。 最小值為 0。

  • periodSeconds :執行探測的頻率(以秒為單位)。 默認為 10 秒。 最小值為 1。

  • timeoutSeconds :探測超時的秒數。 默認為 1 秒。 最小值為 1。

  • successThreshold :探測失敗后被視為成功的最小連續成功。 默認為 1。活性必須為 1。 最小值為 1。

  • failureThreshold :當探測失敗時,Kubernetes 將在放棄之前嘗試failureThreshold次。 在 liveness probe 的情況下放棄意味着重新啟動容器。 在就緒探測的情況下,Pod 將被標記為未就緒。 默認為 3。最小值為 1。

如果您為periodSecondstimeoutSecondssuccessThresholdfailureThreshold設置最小值,您可以期待更頻繁的檢查和更快的重啟。

您將在下面找到一些有用的資源和指南:

您不能使用 pod 中的resources來執行此操作,因為它違背了limits的目的。 相反,您可以設置horizontalpodautoscaler ntalpodautoscaler,當它達到任何 CPU 和 memory 的閾值時,它將旋轉一個新的 pod。

可以在此處參考設置 hpa 的鏈接,並在此處提供一些示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM