[英]Allocate or Limit resource for pods in Kubernetes?
Pod 的資源限制設置為:
resource
limit
cpu: 500m
memory: 5Gi
節點上還剩下10G
內存。
我在短時間內成功創建了5
pod,節點可能還有一些內存,例如8G
。
隨着時間的推移,內存使用量越來越大,達到極限( 5G x 5 = 25G > 10G
),節點就會失去響應。
為了保證可用性,有沒有辦法在節點上設置資源限制?
核心問題是pod內存使用並不總是等於limit,尤其是在剛啟動的時候。 因此可以盡快創建無限的 pod,然后使所有節點滿載。 這不好。 可能需要分配資源而不是設置限制。
我再次測試了限制和資源:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 5Gi
總內存是 15G 還剩 14G,但是有 3 個 pod 被調度並成功運行:
> free -mh
total used free shared buff/cache available
Mem: 15G 1.1G 8.3G 3.4M 6.2G 14G
Swap: 0B 0B 0B
> docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
44eaa3e2d68c 0.63% 1.939 GB / 5.369 GB 36.11% 0 B / 0 B 47.84 MB / 0 B
87099000037c 0.58% 2.187 GB / 5.369 GB 40.74% 0 B / 0 B 48.01 MB / 0 B
d5954ab37642 0.58% 1.936 GB / 5.369 GB 36.07% 0 B / 0 B 47.81 MB / 0 B
看來節點很快就要被壓垮了XD
現在我更改資源限制,請求5G
並限制8G
:
resources:
limits:
cpu: 500m
memory: 5Gi
requests:
cpu: 500m
memory: 8Gi
總內存只有15G
,所有的 pod 需要24G
,所以可能會殺掉所有的 pod。 (如果沒有限制,我的單個容器通常會花費超過16G
。)
這意味着您最好保持requests
與limits
完全相同,以避免 pod 被殺死或節點崩潰。 就像沒有指定requests
值一樣,它會被設置為默認的limit
,那么requests
到底是用來做什么的呢? 我認為只有limits
就完全足夠了,或者說IMO,與K8s聲稱的相反,我更喜歡將資源請求設置為大於限制,以確保節點的可用性。
Kubernetes 1.1通過以下公式調度 pods mem 請求:
(capacity - memoryRequested) >= podRequest.memory
似乎 kubernetes 並不像Vishnu Kannan所說的那樣關心內存使用情況。 因此,如果其他應用程序大量使用該內存,則該節點將被粉碎。
幸運的是,從提交e64fe822 開始,公式已更改為:
(allocatable - memoryRequested) >= podRequest.memory
等待 k8s v1.2!
Kubernetes 資源規范有兩個字段, request
和limit
。
limits
了容器可以使用的資源量。 對於內存,如果容器超出其限制,它將被 OOM 殺死。 對於 CPU,它的使用可能會受到限制。
requests
的不同之處在於,它們確保放置 Pod 的節點至少有足夠的可用容量。 如果您想確保您的 pod 能夠增長到特定大小而節點不會耗盡資源,請指定該大小的請求。 不過,這將限制您可以安排的 pod 數量——10G 節點只能容納 2 個具有 5G 內存請求的 pod。
Kubernetes 支持服務質量。 如果您的 Pod 設置了limits
,則它們屬於Guaranteed
類,並且它們由於系統內存壓力而被殺死的可能性極低。 如果您在節點上運行的 docker 守護程序或其他一些守護程序消耗了大量內存,那么有保證的 Pod 可能會被殺死。
Kube 調度器確實考慮了調度時分配的內存容量和內存。 例如,您不能在 10GB 節點上安排兩個以上的 Pod,每個 Pod 請求 5GB。
到目前為止,Kubernetes 不會出於調度目的消耗內存使用量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.