新聞中心
如何調(diào)整 Kubernetes 資源限制
作者:顧暑晨 翻譯 2022-03-24 08:04:50
云計(jì)算
云原生 我們假設(shè)你使用 Prometheus 來監(jiān)控你的 Kubernetes 集群。這就是為什么本文中的每個(gè)步驟都使用 PromQL 查詢進(jìn)行示例說明的原因。

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。成都創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價(jià)值。
Kubernetes 資源限制往往是一個(gè)難以調(diào)整的配置,因?yàn)槟惚仨氃谔珖?yán)格或者太寬松的限制之間找到最佳的平衡點(diǎn)。
通過本文,你可以學(xué)習(xí)到如何設(shè)置正確的 Kubernetes 資源限制:從檢測到無限制的容器,到找出你應(yīng)該在集群中正確配置的 Kubernetes 資源限制。我們假設(shè)你使用 Prometheus 來監(jiān)控你的 Kubernetes 集群。這就是為什么本文中的每個(gè)步驟都使用 PromQL 查詢進(jìn)行示例說明的原因。
檢測沒有 Kubernetes 資源限制的容器
設(shè)置正確的 Kubernetes 資源限制的第一步是檢測沒有任何限制的容器。沒有 Kubernetes 資源限制的容器可能會在你的節(jié)點(diǎn)中造成非常嚴(yán)重的后果。在最好的情況下,節(jié)點(diǎn)將開始按順序或評分驅(qū)逐 pod。由于 CPU 節(jié)流,它們也會出現(xiàn)性能問題。在最壞的情況下,節(jié)點(diǎn)將由于內(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)注最危險(xiǎn)的。如何查看?很簡單,只需找到使用最多資源且沒有Kubernetes資源限制的前10個(gè)容器。
- 使用最多CPU且沒有CPU限制的前10個(gè)容器
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個(gè)容器
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í)行比平時(shí)更多的 CPU 操作時(shí),由于 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)存限制并超過了它,它將被終止。
這張圖表顯示了一個(gè)容器如何增加它的內(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 資源限制?
一種辦法是觀察一段時(shí)間我們想要限制的容器的資源使用情況。為此,我們需要把注意力集中在相同類型和工作負(fù)載的容器上(deployment, daemonset, statefulset等)。在這里,我們有兩種策略:
保守策略
我們將選擇每個(gè)時(shí)間段消耗最多的容器的值。如果我們將限制設(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ā)異?;蚍逯担@是一個(gè)很好的策略。
- 使用激進(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é)點(diǎn)根據(jù)每個(gè) pod 的容器請求來確保其中調(diào)度的 pod 有足夠的資源。這也意味著節(jié)點(diǎn)承諾為每個(gè)容器提供在其限制范圍內(nèi)設(shè)置的 CPU 和內(nèi)存量。
討論限制非常寬松的容器與討論限制過量使用是一樣的。當(dāng)所有 Kubernetes 資源限制的總和大于該資源的容量時(shí),就會發(fā)生這種情況。
當(dāng)您在集群中過量使用資源時(shí),一切都可能在正常情況下完美運(yùn)行,但在高負(fù)載情況下,容器可能會開始消耗 CPU 和內(nèi)存并達(dá)到其限制值。這將導(dǎo)致節(jié)點(diǎn)開始執(zhí)行 pod eviction,并且在非常緊急的情況下,由于集群中可用資源的匱乏,節(jié)點(diǎn)將被終止。
查找集群的過量使用情況
我們可以通過以下方式檢查集群在內(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)通常,并非所有容器都會同時(shí)消耗所有資源,因此從資源的角度來看,100% 的過量使用是理想的。另一方面,這將會為那些永遠(yuǎn)不會使用到的基礎(chǔ)設(shè)施付出額外的成本。
為了更好地調(diào)整集群的容量,你可以選擇保守策略,確保過量使用低于 125%,或者如果讓過量使用達(dá)到集群容量的 150%,則選擇激進(jìn)策略。
查找節(jié)點(diǎn)的過量使用情況
檢查每個(gè)節(jié)點(diǎn)的過量使用也很重要。節(jié)點(diǎn)過度使用的一個(gè)示例是一個(gè)pod請求為2個(gè)CPU,但是限制卻為8個(gè)CPU。該 pod 可以在具有 4 個(gè)核心的節(jié)點(diǎn)中調(diào)度,但由于 pod 有 8 個(gè)核心作為限制,該節(jié)點(diǎn)中的過度使用將為 8 – 4 = 4 個(gè)核心。
- 節(jié)點(diǎn)內(nèi)存過量使用百分比
sum by (node)(kube_pod_container_resource_limits{container!=””,resource=”memory”} ) / sum by (node)(kube_node_status_capacity_memory_bytes)- 節(jié)點(diǎn) 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)系刪除
文章題目:如何調(diào)整Kubernetes資源限制
轉(zhuǎn)載來于:http://m.fisionsoft.com.cn/article/djsojjj.html


咨詢
建站咨詢
