限制範圍

預設情況下,容器在 Kubernetes 叢集上以不受限制的運算資源執行。 使用 Kubernetes 資源配額,管理員(也稱為叢集運營商)可以限制指定命名空間內叢集資源(例如 CPU 時間、記憶體和持久儲存)的消耗和建立。 在命名空間中,Pod 可以消耗 ResourceQuotas 允許的最大 CPU 和記憶體,這些 ResourceQuotas 適用於該命名空間。 作為叢集運營商或命名空間層級管理員,您可能還會擔心確保單一物件不會壟斷命名空間內的所有可用資源。

LimitRange 是一種策略,用於約束您可以為命名空間中每個適用的物件種類(例如 Pod 或 PersistentVolumeClaim)指定的資源分配(限制和請求)。

LimitRange 提供可以進行以下約束:

  • 強制執行命名空間中每個 Pod 或容器的最低和最高運算資源使用量。
  • 強制執行命名空間中每個 PersistentVolumeClaim 的最低和最高儲存請求。
  • 強制執行命名空間中資源的請求和限制之間的比例。
  • 為命名空間中的運算資源設定預設請求/限制,並在執行時自動將其注入到容器中。

只要命名空間中至少有一個 LimitRange 物件,Kubernetes 就會限制對特定命名空間中 Pod 的資源分配。

LimitRange 物件的名稱必須是有效的 DNS 子網域名稱

資源限制和請求的約束

  • 管理員在命名空間中建立 LimitRange。
  • 使用者在該命名空間中建立(或嘗試建立)物件,例如 Pod 或 PersistentVolumeClaim。
  • 首先,LimitRange 許可控制器會為所有未設定運算資源需求的 Pod(及其容器)套用預設請求和限制值。
  • 其次,LimitRange 會追蹤使用量,以確保其不超過命名空間中任何 LimitRange 中定義的資源最小值、最大值和比例。
  • 如果您嘗試建立或更新違反 LimitRange 約束的物件(Pod 或 PersistentVolumeClaim),則您向 API 伺服器的請求將失敗,並顯示 HTTP 狀態碼 403 Forbidden 和說明已違反約束的訊息。
  • 如果您在命名空間中新增適用於運算相關資源(例如 cpumemory)的 LimitRange,則必須為這些值指定請求或限制。 否則,系統可能會拒絕 Pod 建立。
  • LimitRange 驗證僅在 Pod 許可階段發生,而不是在執行中的 Pod 上發生。 如果您新增或修改 LimitRange,則該命名空間中已存在的 Pod 將保持不變。
  • 如果命名空間中存在兩個或多個 LimitRange 物件,則無法確定將套用哪個預設值。

Pod 的 LimitRange 和許可檢查

LimitRange 不會檢查其套用預設值的一致性。這表示由 LimitRange 設定的 limit 預設值可能小於用戶端提交至 API 伺服器的 spec 中,為容器指定的 request 值。如果發生這種情況,最終的 Pod 將無法排程。

例如,您可以使用以下 manifest 定義 LimitRange

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  limits:
  - default: # this section defines default limits
      cpu: 500m
    defaultRequest: # this section defines default requests
      cpu: 500m
    max: # max and min define the limit range
      cpu: "1"
    min:
      cpu: 100m
    type: Container

以及一個宣告 CPU 資源 request 為 700m,但未宣告 limit 的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: example-conflict-with-limitrange-cpu
spec:
  containers:
  - name: demo
    image: registry.k8s.io/pause:2.0
    resources:
      requests:
        cpu: 700m

那麼該 Pod 將無法排程,並因類似以下的錯誤而失敗

Pod "example-conflict-with-limitrange-cpu" is invalid: spec.containers[0].resources.requests: Invalid value: "700m": must be less than or equal to cpu limit

如果您同時設定 requestlimit,即使在相同的 LimitRange 存在的情況下,新的 Pod 仍將成功排程

apiVersion: v1
kind: Pod
metadata:
  name: example-no-conflict-with-limitrange-cpu
spec:
  containers:
  - name: demo
    image: registry.k8s.io/pause:2.0
    resources:
      requests:
        cpu: 700m
      limits:
        cpu: 700m

資源約束範例

以下是可以使用 LimitRange 建立的策略範例

  • 在具有 8 GiB RAM 和 16 個核心容量的 2 節點叢集中,限制命名空間中的 Pod 要求 100m 的 CPU,CPU 最大限制為 500m,以及要求 200Mi 的記憶體,記憶體最大限制為 600Mi。
  • 為在其 spec 中沒有 CPU 和記憶體 request 的容器,定義預設 CPU limit 和 request 為 150m,以及記憶體預設 request 為 300Mi。

如果命名空間的總 limit 小於 Pod/容器的 limit 總和,則可能會發生資源爭用。在這種情況下,將不會建立容器或 Pod。

爭用或 LimitRange 的變更都不會影響已建立的資源。

下一步

有關使用 limit 的範例,請參閱

請參閱 LimitRanger 設計文件,以取得背景資訊和歷史資訊。

上次修改時間:2024 年 11 月 25 日 11:32 AM PST:更新縮排 (67676624a5)