簡體   English   中英

為 Kubernetes 中的 Pod 分配或限制資源?

[英]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,然后使所有節點滿載。 這不好。 可能需要分配資源而不是設置限制。

更新 2

我再次測試了限制和資源:

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

更新 3

現在我更改資源限制,請求5G並限制8G

resources:
  limits:
    cpu: 500m
    memory: 5Gi
  requests:
    cpu: 500m
    memory: 8Gi

結果是: 在此處輸入圖片說明

根據關於資源檢查k8s源代碼

在此處輸入圖片說明

總內存只有15G ,所有的 pod 需要24G ,所以可能會殺掉所有的 pod。 (如果沒有限制,我的單個容器通常會花費超過16G 。)

這意味着您最好保持requestslimits完全相同,以避免 pod 被殺死或節點崩潰。 就像沒有指定requests值一樣,它會被設置為默認的limit ,那么requests到底是用來做什么的呢? 我認為只有limits就完全足夠了,或者說IMO,與K8s聲稱的相反,我更喜歡將資源請求設置為大於限制,以確保節點的可用性。

更新 4

Kubernetes 1.1通過以下公式調度 pods mem 請求

(capacity - memoryRequested) >= podRequest.memory

似乎 kubernetes 並不像Vishnu Kannan所說的那樣關心內存使用情況。 因此,如果其他應用程序大量使用該內存,則該節點將被粉碎。

幸運的是,從提交e64fe822 開始,公式已更改為:

(allocatable - memoryRequested) >= podRequest.memory

等待 k8s v1.2!

Kubernetes 資源規范有兩個字段, requestlimit

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.

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