Best practice to set requests & limits for CPU & memory on Kubernetes
設定適當的 Resource Requests & Limits 是確保在 Kubernetes 集群上部署的 Pod 能夠順利運行並保持穩定性的關鍵步驟。透過合理地管理和調整資源,我們可以最大程度地提升系統的性能和可靠性,同時有效地利用集群中的資源,實現資源的最佳利用。
Kubernetes Limits and Requests
請求(Requests) 指定容器運行所需的最低 CPU 和記憶體量。當 Kubernetes 的 Scheduler 調度 Pod 資源時,會根據這個值進行決策。
限制(Limits) 定義容器可消耗的最大 CPU 和記憶體量。透過限制,可以防止容器超用資源,避免資源匱乏和潛在的性能下降。
Best Practice
在設定 CPU 的請求和限制時,建議不設定 CPU 的限制。這是因為在某些情況下,如果 Pod 需要額外的資源且集群中還有可用資源,就可以動態提供給 Pod 使用。
針對記憶體的請求和限制,最佳做法是將請求和限制設定為相同的值。這樣做的目的是為了避免 Pod 過度使用節點上的資源,進而觸發 Out of Memory(OOM)機制,導致 Pod 異常終止。
yamlapiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: myimage resources: requests: memory: "512Mi" cpu: "100m" limits: memory: "512Mi" # 設置為跟 requests 相同的值
Pod Eviction
當節點資源不足,觸發 Out of Memory(OOM)時,Kubernetes 就會進行 Pod Eviction 來釋放資源。這時Kubelet 根據 Pod 的記憶體使用情況和其重要性來決定哪個 Pod 該被「犧牲」。
若希望在節點資源不足時,確保重要的 Pod 不被犧牲,可以透過設定 PriorityClass 來向 Kubelet 指示哪些 Pod 是相對不重要的,因此可以被優先犧牲。
以下是一個示例 PriorityClass 的定義:
yamlapiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 globalDefault: false description: "This priority class should be used for XYZ service pods only."
Reference:
https://cast.ai/blog/kubernetes-resource-limits-how-to-make-limits-and-requests-work-for-you/
https://home.robusta.dev/blog/kubernetes-memory-limit
https://mihai-albert.com/2022/02/13/out-of-memory-oom-in-kubernetes-part-4-pod-evictions-oom-scenarios-and-flows-leading-to-them/
https://raviran.medium.com/understanding-kubernetes-evicted-pods-causes-prevention-and-troubleshooting-1adda844feb2
https://medium.com/pareture/kubernetes-node-overcommitted-57ec7c3dfe9e
https://komodor.com/learn/how-to-fix-oomkilled-exit-code-137/
https://web.archive.org/web/20220805232857/https://home.robusta.dev/blog/stop-using-cpu-limits/
留言
張貼留言