🏞️ K8s的叢集,像是大自然的生態系統,資源有其極限,可能有多個團隊(不同namespace)共享叢集資源,也可能某顆肥貓Pod增長過頭,為了適當限制使用量,設計有不同層級的資源限制方法處理
此物件讓管理員能根據namespace分配資源量,當超過資源使用量時,將會回傳403
訊息說明違反的限制為何,若有設定關於運算資源的欄位(cpu, memory),則新建立的Pod需同步做明確的資源設定,否則可能會被駁回請求 (能用LimitRange
做資源預設),設定時可以針對整個namespace或是特定object。
在大部分的K8s版本預設啟用資源配額功能,可從API server的參數查看( --enable-admission-plugins= ResourceQuota),另外需注意不同版本的K8s新增的資源限制功能
幾種不同資源配額方式
apiVersion: v1
kind: ResourceQuota
metadata:
name: pods-medium
spec:
hard:
cpu: "10"
memory: 20Gi
pods: "10"
scopeSelector:
matchExpressions:
- operator : In
scopeName: PriorityClass
values: ["medium"]
另外還可以限制pod跨namespace的node親和性
apiVersion: v1
kind: ResourceQuota
metadata:
name: disable-cross-namespace-affinity
namespace: foo-ns
spec:
hard: # 設定為0
pods: "0"
scopeSelector:
matchExpressions: # 加上此scope name
- scopeName: CrossNamespacePodAffinity
operator: Exists
預設無限制各pod使用的cpu和memoery,因此可能讓node上面的其它pod或processes卡住,可以設定請求量(request),保底資源可用量,及閾值(limit),限制不可超出的使用量,
apiVersion: v1
kind: Pod
metadata:
name: ithome-test
spec:
containers:
- name: app
image: image.rubato/master-container:v1
resources: # resource欄位,設定requests及limits
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: image.rubato/helper-container:v1
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
從pod的 "State" 可以查看資源設定
Memory的單位 bytes
1G(Gigabyte) = 1 * 10^9 bytes
1M(Megabyte) = 1 * 10^6 bytes
1K(Kilobyte) = 1 * 10^3 bytes
1Gi(Gibibyte) = 2^30 bytes
1Mi(Mebibyte) = 2^20 bytes
1Ki(Kibibyte) = 2^10 bytes
CPU的單位: vCore,對應實體core或虛擬core
1 vCore = 1000m vCore
📢 當超出設定值會發生的事
資源規劃 | 組合1 | 組合2 | 組合3 | 組合4 |
---|---|---|---|---|
Requests | X | X | O | O |
Limits | X | O | O | X |
說明 | 可能會資源不足,超出node負荷 | 資源限制,具空閒資源 | 資源限制,具空閒資源 | 確保資源用量,並加以運用資源 |
resourceQuota 操作指令
# 取得說明
kubectl get quota
kubectl describe quota
# 建立
kubectl create -f ./compute-resources.yaml