限制範圍
預設情況下,容器在 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
和說明已違反約束的訊息。 - 如果您在命名空間中新增適用於運算相關資源(例如
cpu
和memory
)的 LimitRange,則必須為這些值指定請求或限制。 否則,系統可能會拒絕 Pod 建立。 - LimitRange 驗證僅在 Pod 許可階段發生,而不是在執行中的 Pod 上發生。 如果您新增或修改 LimitRange,則該命名空間中已存在的 Pod 將保持不變。
- 如果命名空間中存在兩個或多個 LimitRange 物件,則無法確定將套用哪個預設值。
Pod 的 LimitRange 和許可檢查
LimitRange 不會檢查其套用預設值的一致性。這表示由 LimitRange 設定的 limit 預設值可能小於用戶端提交至 API 伺服器的 spec 中,為容器指定的 request 值。如果發生這種情況,最終的 Pod 將無法排程。
例如,您可以使用以下 manifest 定義 LimitRange
注意
以下範例在叢集的預設命名空間中運作,因為未定義命名空間參數,且 LimitRange 作用域僅限於命名空間層級。這表示這些範例中的任何參考或操作都將與叢集預設命名空間中的元素互動。您可以透過在metadata.namespace
欄位中配置命名空間來覆寫操作命名空間。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
如果您同時設定 request
和 limit
,即使在相同的 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 的範例,請參閱
- 如何設定每個命名空間的最小和最大 CPU 約束.
- 如何設定每個命名空間的最小和最大記憶體約束.
- 如何設定每個命名空間的預設 CPU Requests 和 Limits.
- 如何設定每個命名空間的預設記憶體 Requests 和 Limits.
- 如何設定每個命名空間的最小和最大儲存消耗量.
- 關於設定每個命名空間配額的詳細範例。
請參閱 LimitRanger 設計文件,以取得背景資訊和歷史資訊。