簡體   English   中英

在 Kubernetes 中,如何在空閑時將部署擴展到零

[英]In Kubernetes, how can I scale a Deployment to zero when idle

我在 Kubernetes 集群上運行一個資源相當密集的服務來支持 CI 活動。 只需要一個副本,但它使用大量資源(16 cpu),並且通常只在工作時間(工作日,大約上午 8 點到下午 6 點)需要。 我的集群在雲中運行並設置了實例自動縮放,因此如果此服務縮放為零,則可以終止該實例。

該服務是無法修改的第三方代碼(嗯,不容易)。 這是一個相當典型的 HTTP 服務,除了它的工作是相當 CPU 密集型的。

有哪些選項可以在空閑時自動將此部署縮減為零?

我寧願不在工作時間設置一個時間表來擴大/縮小它,因為 CI 活動偶爾會在正常時間之外執行。 我希望縮放是動態的(例如,當空閑 > 30 分鍾時縮放到零,或者當傳入連接到達時縮放到一)。

實際上 Kubernetes 僅通過調用 API 支持縮放到零,因為 Horizontal Pod Autoscaler 僅支持縮小到 1 個副本。

無論如何,有一些 Operator 可以讓您通過攔截到達您的 pod 的請求或檢查一些指標來超越該限制。

你可以看看KnativeKeda 它們使您的應用程序成為無服務器的,並且它們以不同的方式實現。

Knative ,通過 Istio 攔截請求,如果有一個活動的 pod 為它們服務,它會將傳入的請求重定向到那個,否則它會觸發縮放。

相比之下, Keda最適合事件驅動架構,因為它能夠檢查預定義的指標,例如延遲、隊列長度或自定義指標(例如從 Prometheus 收集)並觸發縮放。

如果在同樣預定義的 window 中滿足預定義條件,兩者都支持縮放為零。

希望它有所幫助。

有幾種方法可以實現這一點,可能最“原生”的方式是將 Knative 與 Istio 結合使用。 默認情況下,Kubernetes 允許您縮放到零,但是您需要可以基於“輸入事件”來代理擴展事件的東西,本質上是支持事件驅動架構的東西。

您可以在這里查看官方文檔: https://knative.dev/docs/serving/configuring-autoscaling/

水平 pod 自動縮放器當前不允許將 minReplicas 字段設置為 0,因此自動縮放器永遠不會縮小到零,即使 pod 沒有做任何事情。 允許將 pod 的數量縮減到零可以顯着提高硬件的利用率。

當您運行每隔幾個小時甚至幾天才收到一次請求的服務時,讓它們一直運行是沒有意義的,會占用其他 Pod 可以使用的資源。

但是您仍然希望在收到客戶請求時立即提供這些服務。

這稱為空閑和非空閑。 它允許將提供某種服務的 pod 縮小到零。 當有新的請求進來時,請求會被阻塞,直到 pod 被啟動,然后請求最終被轉發到 pod。

Kubernetes 目前還沒有提供此功能,但最終會提供。

我最終實施了一個自定義解決方案: https://github.com/greenkeytech/zero-pod-autoscaler

與 Knative 相比,它更像是一個“玩具”項目,相當小,並且不依賴於 istio。 它在我的用例中運行良好,但我不建議其他人在不願意采用代碼作為自己的代碼的情況下使用它。

根據文檔,到目前為止它不支持 minReplicas=0 。 閱讀此線程:- https://github.com/kubernetes/kubernetes/issues/69687 要正確設置 HPA,您可以使用此公式來設置所需的 pod:-

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

您還可以按照以下鏈接根據 prometheus 指標設置 HPA:-

https://itnext.io/horizontal-pod-autoscale-with-custom-metrics-8cb13e9d475

暫無
暫無

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

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