如何調(diào)整 Kubernetes 資源限制
Kubernetes 資源限制往往是一個難以調(diào)整的配置,因為你必須在太嚴(yán)格或者太寬松的限制之間找到最佳的平衡點。
通過本文,你可以學(xué)習(xí)到如何設(shè)置正確的 Kubernetes 資源限制:從檢測到無限制的容器,到找出你應(yīng)該在集群中正確配置的 Kubernetes 資源限制。我們假設(shè)你使用 Prometheus 來監(jiān)控你的 Kubernetes 集群。這就是為什么本文中的每個步驟都使用 PromQL 查詢進(jìn)行示例說明的原因。
檢測沒有 Kubernetes 資源限制的容器
設(shè)置正確的 Kubernetes 資源限制的第一步是檢測沒有任何限制的容器。沒有 Kubernetes 資源限制的容器可能會在你的節(jié)點中造成非常嚴(yán)重的后果。在最好的情況下,節(jié)點將開始按順序或評分驅(qū)逐 pod。由于 CPU 節(jié)流,它們也會出現(xiàn)性能問題。在最壞的情況下,節(jié)點將由于內(nèi)存不足而被終止。
查找沒有 Kubernetes 資源限制的容器
- 根據(jù)命名空間查找沒有限制 CPU 的容器
sum by (namespace)(count by (namespace,pod,container)(kube_pod_container_info{container!=""}) unless sum by (namespace,pod,container)(kube_pod_container_resource_limits{resource="cpu"}))
- 根據(jù)命名空間查找沒有限制內(nèi)存的容器
sum by (namespace)(count by (namespace,pod,container)(kube_pod_container_info{container!=""}) unless sum by (namespace,pod,container)(kube_pod_container_resource_limits{resource="memory"}))
發(fā)現(xiàn)太多容器沒有 Kubernetes 資源限制?
也許你發(fā)現(xiàn)了很多沒有Kubernetes資源限制的容器?,F(xiàn)在讓我們關(guān)注最危險的。如何查看?很簡單,只需找到使用最多資源且沒有Kubernetes資源限制的前10個容器。
- 使用最多CPU且沒有CPU限制的前10個容器
topk(10,sum by (namespace,pod,container)(rate(container_cpu_usage_seconds_total{container!=""}[5m])) unless sum by (namespace,pod,container)(kube_pod_container_resource_limits{resource="cpu"}))
- 使用最多內(nèi)存且沒有內(nèi)存限制的前10個容器
topk(10,sum by (namespace,pod,container)(container_memory_usage_bytes{container!=""}) unless sum by (namespace,pod,container)(kube_pod_container_resource_limits{resource="memory"}))
檢測 Kubernetes 資源限制過于嚴(yán)格的容器
檢測 CPU 限制過于嚴(yán)格的容器
如果容器非常接近其 CPU 限制,在需要執(zhí)行比平時更多的 CPU 操作時,由于 CPU 節(jié)流,它的性能會下降。
- 使用此查詢查找 CPU 使用率接近其限制的容器:
(sum by (namespace,pod,container)(rate(container_cpu_usage_seconds_total{container!=""}[5m])) / sum by (namespace,pod,container)(kube_pod_container_resource_limits{resource="cpu"})) > 0.8
檢測內(nèi)存限制過于嚴(yán)格的容器
如果容器接近其內(nèi)存限制并超過了它,它將被終止。
這張圖表顯示了一個容器如何增加它的內(nèi)存使用量,直到它達(dá)到限制并被終止。
- 使用此查詢查找內(nèi)存使用量接近其限制的容器:
(sum by (namespace,pod,container)(container_memory_usage_bytes{container!=""}) / sum by (namespace,pod,container)(kube_pod_container_resource_limits{resource="memory"})) > 0.8
如何設(shè)置正確的 Kubernetes 資源限制?
一種辦法是觀察一段時間我們想要限制的容器的資源使用情況。為此,我們需要把注意力集中在相同類型和工作負(fù)載的容器上(deployment, daemonset, statefulset等)。在這里,我們有兩種策略:
保守策略
我們將選擇每個時間段消耗最多的容器的值。如果我們將限制設(shè)置為該值,容器將不會耗盡資源。
- 使用保守策略找到正確的 CPU 限制
max by (namespace,owner_name,container)((rate(container_cpu_usage_seconds_total{container!="POD",container!=""}[5m])) * on(namespace,pod) group_left(owner_name) avg by (namespace,pod,owner_name)(kube_pod_owner{owner_kind=~"DaemonSet|StatefulSet|Deployment"}))
使用保守策略找到正確的內(nèi)存限制
max by (namespace,owner_name,container)((container_memory_usage_bytes{container!="POD",container!=""}) * on(namespace,pod) group_left(owner_name) avg by (namespace,pod,owner_name)(kube_pod_owner{owner_kind=~"DaemonSet|StatefulSet|Deployment"}))
激進(jìn)策略
我們將選擇99分位數(shù)作為限制。這將排除掉那1%超出限制的值。如果存在你不想要的偶發(fā)異?;蚍逯?,這是一個很好的策略。
- 使用激進(jìn)的策略找到正確的 CPU 限制
quantile by (namespace,owner_name,container)(0.99,(rate(container_cpu_usage_seconds_total{container!="POD",container!=""}[5m])) * on(namespace,pod) group_left(owner_name) avg by (namespace,pod,owner_name)(kube_pod_owner{owner_kind=~"DaemonSet|StatefulSet|Deployment"}))
使用激進(jìn)的策略找到正確的內(nèi)存限制
quantile by (namespace,owner_name,container)(0.99,(container_memory_usage_bytes{container!="POD",container!=""}) * on(namespace,pod) group_left(owner_name) avg by (namespace,pod,owner_name)(kube_pod_owner{owner_kind=~"DaemonSet|StatefulSet|Deployment"}))
集群有足夠的容量嗎?
在 Kubernetes 中,節(jié)點根據(jù)每個 pod 的容器請求來確保其中調(diào)度的 pod 有足夠的資源。這也意味著節(jié)點承諾為每個容器提供在其限制范圍內(nèi)設(shè)置的 CPU 和內(nèi)存量。
討論限制非常寬松的容器與討論限制過量使用是一樣的。當(dāng)所有 Kubernetes 資源限制的總和大于該資源的容量時,就會發(fā)生這種情況。
當(dāng)您在集群中過量使用資源時,一切都可能在正常情況下完美運行,但在高負(fù)載情況下,容器可能會開始消耗 CPU 和內(nèi)存并達(dá)到其限制值。這將導(dǎo)致節(jié)點開始執(zhí)行 pod eviction,并且在非常緊急的情況下,由于集群中可用資源的匱乏,節(jié)點將被終止。
查找集群的過量使用情況
我們可以通過以下方式檢查集群在內(nèi)存和 CPU 上的過量使用百分比:
- 集群內(nèi)存過量使用百分比
100 * sum(kube_pod_container_resource_limits{container!="",resource="memory"} ) / sum(kube_node_status_capacity_memory_bytes)
- 集群 CPU 過量使用百分比
100 * sum(kube_pod_container_resource_limits{container!="",resource="cpu"} ) / sum(kube_node_status_capacity_cpu_cores)
通常,并非所有容器都會同時消耗所有資源,因此從資源的角度來看,100% 的過量使用是理想的。另一方面,這將會為那些永遠(yuǎn)不會使用到的基礎(chǔ)設(shè)施付出額外的成本。
為了更好地調(diào)整集群的容量,你可以選擇保守策略,確保過量使用低于 125%,或者如果讓過量使用達(dá)到集群容量的 150%,則選擇激進(jìn)策略。
查找節(jié)點的過量使用情況
檢查每個節(jié)點的過量使用也很重要。節(jié)點過度使用的一個示例是一個pod請求為2個CPU,但是限制卻為8個CPU。該 pod 可以在具有 4 個核心的節(jié)點中調(diào)度,但由于 pod 有 8 個核心作為限制,該節(jié)點中的過度使用將為 8 – 4 = 4 個核心。
- 節(jié)點內(nèi)存過量使用百分比
sum by (node)(kube_pod_container_resource_limits{container!=””,resource=”memory”} ) / sum by (node)(kube_node_status_capacity_memory_bytes)
- 節(jié)點 CPU 過量使用百分比
sum by (node)(kube_pod_container_resource_limits{container!=””,resource=”memory”} ) / sum by (node)(kube_node_status_capacity_memory_bytes)
正確調(diào)整資源限制后的最終效果
*原文:https://sysdig.com/blog/kubernetes-resource-limits/*本文部分圖片來源于網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系刪除