K8s 會透過coontainer, pod 等對象發出資源請求或消費compute resources
, 預設可使用的compute resources
沒有限制, 目前支援CPU
和MEM
的資源配置;CPU屬於可壓縮類型的資源, 可以按照需求收縮, MEM則屬於不可壓縮的資源, 壓縮可能會造成無法預期的錯誤。管理員可以在每個 Namespace 創建多個Resource Quotas, k8s cluster會隨時監控這些資源的使用狀況, 確保資源用量不超過限制。
Compute Resource Quota 支援的類型:
k8s上的對象可以透過設定requests
屬性定義資源可用值, 確保在需要時有足夠的資源可以使用, 以及設定limits
屬性用來限制資源的最大可用值
limits.cpu: 所有Pod總共能使用的CPU限額總量上限, 不能超過
limits.memory: 所有Pod總共能使用的MEM限額總量上限, 不能超過
requests.cpu: 所有Pod設定的CPU需求總量上限
requests.memory: 所有Pod設定的MEM需求總量上限
CPU
: K8s 上一單位的CPU等於虛擬機上的一顆CPU的概念或是實體機上的一顆邏輯CPU, 它支援分數計量方式, 1 core 等於 1000 millicores的概念MEM
:k8s 上Mem的單位和平常使用的單位相同, 可以使用 E、T、P、G、M、K作為單位後綴Storage Resource Quota 支援的類型:
可以根據相關的Storage Class
進行限制。
Pod 配置YAML時可以使用字段scopeSelector
制定Pod的資源使用優先順序, scopeSelector
有三個設定可選:low
, medium
, high
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-high
spec:
hard:
cpu: "1000"
memory: 200Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["high"]
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-medium
spec:
hard:
cpu: "10"
memory: 20Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["medium"]
- apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-low
spec:
hard:
cpu: "5"
memory: 10Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["low"]
Limit Ranges 是在Namespace底下限制資源分配策略的對象, 提供的限制有
管理員在創建Namespace時可以給訂一個LimitRange
, 用戶在Namespace底下創建或更新資源時一旦違反了LimitRange的限制, 則該次請求就會失敗; 當Namespace啟用了LimitRange對CPU 和MEM的限制, 用戶就必須指定對應的requests
和limits
, 若未指定也會造成請求失敗; LimitRange只會規範新創建的資源, 正在運行中資源則不受影響。
今天就這樣。