在K8S中,Requests 和 Limits 如何影響 Pod 的排程?

黄嘉波發表於2024-10-15

在 Kubernetes 中,Pod 的排程過程受到資源請求(Requests)和資源限制(Limits)的直接影響。以下是這些引數如何影響 Pod 排程的詳細說明:

  1. 資源請求(Requests)

    • 資源請求定義了 Pod 中每個容器所需的最小資源量。在排程 Pod 時,Kubernetes 排程器會尋找具有足夠可用資源的節點來滿足這些請求。如果一個節點上所有 Pod 的資源請求總和超過了該節點的可分配資源,新的 Pod 將不會被排程到該節點上。
    • 對於 CPU,這是一個可壓縮資源,如果 Pod 使用的 CPU 超過其請求量但未達到限制(Limits),它可能會與其他 Pod 共享 CPU 資源。但如果一個 Pod 的 CPU 使用量超過了其限制,它可能會被限制,導致效能下降。
    • 對於記憶體,這是一個不可壓縮資源,Pod 需要確保它們請求的記憶體量。如果一個 Pod 使用的記憶體超過了其請求量,它可能會被 OOM Killer(Out of Memory Killer)終止。
  2. 資源限制(Limits)

    • 資源限制定義了容器可以消耗的最大資源量。如果容器超出了這個限制,Kubernetes 將採取行動,對於 CPU,可能會導致效能下降;對於記憶體,可能會導致容器被殺死。
    • 如果設定了資源限制但沒有指定資源請求,Kubernetes 預設將資源請求設定為與限制相同的值。
  3. 服務質量(QoS)

    • Kubernetes 根據資源請求和限制將 Pod 分為不同的服務質量(QoS)類別:Guaranteed、Burstable 和 BestEffort。
      • Guaranteed:所有容器的資源請求和限制完全匹配。
      • Burstable:至少有一個容器的資源請求小於其限制。
      • BestEffort:容器沒有設定資源請求或限制。
    • QoS 類別影響排程決策,因為 Guaranteed 類別的 Pod 需要更多的資源保證,而 BestEffort 類別的 Pod 可能會在資源緊張時被首先犧牲。
  4. 排程演算法

    • Kubernetes 的排程器使用多種演算法來決定將 Pod 排程到哪個節點。這些演算法包括過濾(Filter)和打分(Score)階段。在打分階段,排程器會考慮節點的資源剩餘量和其他因素,如親和性(Affinity)和反親和性(Anti-Affinity)規則。
    • Pod 的資源請求和限制直接影響 NodeResourcesLeastAllocated 演算法的結果,該演算法傾向於將 Pod 排程到資源剩餘量最多的節點。
  5. 專案配額(Resource Quotas)

    • 專案配額限制了名稱空間內資源的總使用量,確保不同團隊或專案之間的資源隔離。這進一步影響了 Pod 的排程,因為配額會限制在特定名稱空間內可以建立的 Pod 的數量和資源量。

綜上所述,資源請求和限制是 Kubernetes 排程決策的關鍵因素,它們確保了 Pod 能夠獲得所需的資源,同時防止資源爭用和過度消耗。透過合理配置這些引數,可以提高叢集的資源利用率和應用程式的穩定性。

相關文章