ACS通過Kubernetes原生的ResourceQuota機制限制和控制命名空間中的資源使用。通過ResourceQuota,您可以限制和監控命名空間中各種資源的使用情況,如CPU、內存、存儲、副本數和服務數。這樣就可以防止某個命名空間中的資源被其他應用程序過度占用,從而保證應用程序的穩定性和可靠性。
資源配額(ResourceQuota)
您可以在ACS集群中使用Kubernetes原生的資源配額機制來控制每個命名空間的資源消耗總量。通過定義ResourceQuota對象,可以先在命名空間中某種資源類型的總量上限,包括CPU、內存和擴展資源等。當在命名空間下創建Pod、Services等K8s資源時,Kubernetes的配額系統會跟蹤集群的資源使用情況,并保證資源總用量不超過命名空間下ResourceQuota定義的硬性(Hard)限額。
在使用資源配額時:
每個團隊或者應用使用獨立的命名空間。
集群管理員針對不同的命名空間創建一個或者多個ResourceQuota對象。
如果用量超過了ResourceQuota的硬性限額時,后續新建的資源會被拒絕。
如果使用ResourceQuota配置了CPU和內存,創建的Pod必須要設置request和limit,否則將會拒絕創建。
對于其他資源(例如擴展資源):無需為該資源設置request和limit。提示:可使用LimitRanger準入控制器來為沒有設置計算資源需求的Pod設置默認值。
ResourceQuota對象的名稱必須是合法的DNS子域名。
配額的修改不會影響已經創建的資源使用對象。
啟用資源配額
通過ACS控制臺創建的Kubernetes集群已經默認開啟了資源配額機制。您只需要在新增的命名空間下創建ResourceQuota對象,這個命名空間而言就開啟了資源配額。
支持的資源類型
ACS完全兼容Kubernetes原生資源配額機制,因此標準資源類型和擴展資源都可以通過ResourceQuota進行配置。
標準資源類型
資源名稱 | 描述 |
limits.cpu | 所有非終止狀態的Pod,其CPU限額總量不能超過該值。 |
limits.memory | 所有非終止狀態的Pod,其內存限額總量不能超過該值。 |
requests.cpu | 所有非終止狀態的Pod,其CPU需求總量不能超過該值。 |
requests.memory | 所有非終止狀態的Pod,其內存需求總量不能超過該值。 |
hugepages-<size> | 對于所有非終止狀態的Pod,針對指定大小的HugePage請求總數不能超過此值。 |
cpu | 與 |
memory | 與 |
擴展資源的資源配額
因為K8s不支持擴展資源超量分配(即limit>request),因此只需要配置前綴為requests.
的配額項。
有關更多詳細信息,請參閱資源配額。
示例
以下演示如何通過kubectl查看和創建ResourceQuota。
執行以下命令,創建命名空間test。
創建ResourceQuota,限制命名空間test最多只能使用4000m CPU。
執行以下命令,查看ResourceQuota。
kubectl -n test describe resourcequota test-quota
預期輸出:
Namespace: test Resource Used Hard -------- ---- ---- limits.cpu 0 4 requests.cpu 0 4
創建4個Pod,每個Pod使用1000m cpu。
執行以下命令,查看Pod創建結果。
kubectl -n test get pod
預期輸出:
NAME READY STATUS RESTARTS AGE test-app-5ddc68c994-jdv4m 1/1 Running 0 35s test-app-5ddc68c994-jhmtb 1/1 Running 0 35s test-app-5ddc68c994-mr8vq 1/1 Running 0 35s test-app-5ddc68c994-pjdfn 1/1 Running 0 35s
可以看出4個Pod都處于Running狀態。
執行以下命令,查看ResourceQuota狀態。
kubectl -n test describe resourcequota
預期輸出:
Name: test-quota Namespace: test Resource Used Hard -------- ---- ---- limits.cpu 4 4 requests.cpu 4 4
可以看到test-quota的Used資源量與Hard資源量相等。
再嘗試擴容一個新的Pod,驗證ResourceQuota的準入控制器攔截功能。
先嘗試擴容一個新的Pod。
kubectl -n test scale deploy test-app --replicas 5
查看對應的ReplicaSet,發現DESIRED是5,但CURRENT是4,證明有個Pod有異常。
kubectl -n test get rs NAME DESIRED CURRENT READY AGE test-app-5ddc68c994 5 4 4 3m10s
查看ReplicaSet的Event,可以發現新的Pod被ResourceQuota的準入控制器攔截了
k -n test describe rs test-app-5ddc68c994 Name: test-app-5ddc68c994 Namespace: test Selector: app=test-app,pod-template-hash=5ddc68c994 Labels: app=test-app pod-template-hash=5ddc68c994 Annotations: deployment.kubernetes.io/desired-replicas: 5 deployment.kubernetes.io/max-replicas: 7 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/test-app Replicas: 4 current / 5 desired Pods Status: 4 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=test-app pod-template-hash=5ddc68c994 Containers: test: Image: busybox:latest Port: <none> Host Port: <none> Command: sleep 360000000 Limits: cpu: 1 Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ ReplicaFailure True FailedCreate Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-pjdfn Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-jdv4m Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-jhmtb Normal SuccessfulCreate 3m18s replicaset-controller Created pod: test-app-5ddc68c994-mr8vq Warning FailedCreate 3m18s replicaset-controller Error creating: pods "test-app-5ddc68c994-5s4ph" is forbidden: exceeded quota: test-quota, requested: limits.cpu=1,requests.cpu=1, used: limits.cpu=4,requests.cpu=4, limited: limits.cpu=4,requests.cpu=
kubectl create namespace test
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-quota
namespace: test
spec:
hard:
requests.cpu: "4000m"
limits.cpu: "4000m"
EOF
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-app
name: test-app
namespace: test
spec:
replicas: 5
selector:
matchLabels:
app: test-app
template:
metadata:
labels:
app: test-app
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
imagePullPolicy: IfNotPresent
name: test
command:
- sleep
- "360000000"
resources:
limits:
cpu: "1"
EOF