在K8S中,Pod 如何實現對節點的資源控制?

黄嘉波發表於2024-10-15

在 Kubernetes 中,Pod 是可以被排程到叢集中任何節點上的最小部署單元。Pod 透過資源請求(requests)和資源限制(limits)來實現對節點資源的控制。這些資源控制機制確保了容器能夠獲得它們所需的資源,同時防止它們消耗過多資源,影響節點上其他容器或 Pod 的執行。

以下是 Pod 實現對節點資源控制的幾個關鍵方面:

  1. 資源請求(Resource Requests)

    • Pod 的每個容器都可以宣告資源請求,這是排程器在排程 Pod 時考慮的最小資源保證。資源請求包括 CPU 和記憶體。

    • 當排程器放置 Pod 時,它會查詢具有足夠可用資源的節點。

    • 資源請求的格式通常如下所示:

      resources:
        requests:
          memory: "64Mi"
          cpu: "250m"
      
    • 這裡 memorycpu 分別指定了記憶體和 CPU 的請求量。"64Mi" 表示 64 兆位元組的記憶體,"250m" 表示 250 毫核(0.25 核)的 CPU。

  2. 資源限制(Resource Limits)

    • Pod 的每個容器也可以宣告資源限制,這是容器可以使用的最大資源量。

    • 如果容器嘗試使用超過其限制的資源,它可能會被終止或受到限制。

    • 資源限制的格式通常如下所示:

      resources:
        limits:
          memory: "128Mi"
          cpu: "500m"
      
    • 這裡 memorycpu 分別指定了記憶體和 CPU 的限制量。

  3. 資源配額(Resource Quotas)

    • 資源配額允許管理員限制名稱空間內資源的總使用量,確保不同團隊或專案之間的資源隔離。
    • 資源配額可以限制 CPU、記憶體、儲存等資源的使用量。
  4. 限制範圍(Limit Ranges)

    • 限制範圍定義了名稱空間內 Pod 或容器的最小和最大資源請求和限制。
    • 它們可以防止資源請求過低或限制過高,從而保證叢集資源的合理分配。
  5. 服務質量(Quality of Service, QoS)

    • Kubernetes 根據資源請求和限制將 Pod 分為不同的服務質量等級:
      • Guaranteed:所有容器的資源請求和限制完全匹配。
      • Burstable:至少有一個容器的資源請求小於限制。
      • BestEffort:所有容器的資源請求都為零。
    • 不同的 QoS 等級在資源不足時有不同的處理方式。
  6. 節點資源分配

    • 每個節點都有一個固定的 CPU 和記憶體資源池。
    • 當 Pod 被排程到節點上時,排程器會檢查該節點是否有足夠的資源來滿足 Pod 的請求。
  7. 容器執行時和 Cgroups

    • 容器執行時(如 Docker、containerd)使用控制組(Cgroups)來限制容器的資源使用。
    • Cgroups 確保容器不會超過其資源限制,並且可以根據資源請求進行合理的資源分配。

綜上所述,透過這些機制,Kubernetes 可以有效地管理叢集資源,確保 Pod 能夠穩定執行,同時防止資源爭用和過度消耗。

相關文章