Alibaba Cloud Container Compute Service (ACS) は、オープンソース Kubernetes の ResourceQuota メカニズムを使用して、名前空間内のリソース使用量を制限および制御します。ResourceQuota を使用すると、名前空間内のさまざまなリソースの使用量 (CPU、メモリ、ストレージリソースの使用量、レプリケートされたポッドの数、サービスの数など) を制限および監視できます。これにより、名前空間内の他のアプリケーションが過剰なリソースを占有することを防ぎ、アプリケーションの安定性と信頼性を確保できます。
ResourceQuota
ACS クラスタでオープンソース Kubernetes の ResourceQuota メカニズムを使用して、各名前空間のリソース使用量の合計を制御できます。 ResourceQuota を定義して、名前空間内のリソース (CPU、メモリ、拡張リソースなど) の上限を制限できます。名前空間でポッドやサービスなどの Kubernetes リソースを作成すると、Kubernetes のクォータシステムはクラスタのリソース使用量を追跡し、リソース使用量の合計が名前空間の ResourceQuota で定義されているハードリソース制限を超えないようにします。
ResourceQuota を使用する場合、次の項目に注意してください。
各チームまたはアプリケーションには、個別の名前空間が必要です。
クラスタ管理者は、各名前空間に 1 つ以上の ResourceQuota を作成する必要があります。
リソース使用量が ResourceQuota のハードリソース制限を超えると、後続の Kubernetes リソース作成リクエストは拒否されます。
ResourceQuota で CPU およびメモリクォータを構成する場合は、作成するポッドのリソースリクエストと制限を構成する必要があります。そうしないと、ポッドを作成できません。
拡張リソースなどの他のリソースのリソースリクエストまたは制限を構成する必要はありません。注: LimitRanger アドミッションコントローラを使用して、リソースリクエストが構成されていないポッドのデフォルトのリソース制限を構成できます。
ResourceQuota の名前は、有効な DNS サブドメイン である必要があります。
ResourceQuota を変更した後、変更は既に ResourceQuota を使用しているリソースには適用されません。
ResourceQuota 機能の有効化
デフォルトでは、ACS コンソールで作成された Container Service for Kubernetes (ACK) クラスタでは、ResourceQuota 機能が有効になっています。名前空間で ResourceQuota を作成するだけで済みます。その後、名前空間で resourceQuota 機能が有効になります。
サポートされているリソースタイプ
ACS は、オープンソース Kubernetes の ResourceQuota メカニズムと完全に互換性があります。したがって、標準リソースと拡張リソースの両方が ResourceQuota をサポートしています。
標準リソース
リソース名 | 説明 |
limits.cpu | 終了状態ではないポッドの CPU 使用量は、この制限を超えてはなりません。 |
limits.memory | 終了状態ではないポッドのメモリ使用量は、この制限を超えてはなりません。 |
requests.cpu | 終了状態ではないポッドの CPU リクエストは、この制限を超えてはなりません。 |
requests.memory | 終了状態ではないポッドのメモリリクエストは、この制限を超えてはなりません。 |
enormouspages-<size> | 終了状態ではないポッドの EnormousPage リクエストのサイズは、この制限を超えてはなりません。 |
cpu | requests.cpu と同等です。 |
memory | requests.memory と同等です。 |
拡張リソース
Kubernetes は、拡張リソースのオーバーコミット (制限 > リクエスト) をサポートしていません。したがって、「requests.」で始まるリソースクォータのみを構成する必要があります。
詳細については、リソースクォータ を参照してください。
例
この例では、kubectl を使用して ResourceQuota を表示および作成する方法を示します。
名前空間を作成します。
ResourceQuota を作成して、test という名前の Namespace の CPU 制限を 4000 ミリコアに設定します。
ResourceQuota をクエリします。
4 つのポッドを作成します。各ポッドは最大 1000 ミリコアを使用できます。
ポッドをクエリします。出力は、4 つのポッドが実行中状態であることを示しています。
test-quota という名前の ResourceQuota の状態をクエリします。出力は、「使用済み」列の値が「ハード」列の値と等しいことを示しています。
別のポッドを作成します。ポッド作成リクエストは、ResourceQuota アドミッションコントローラによってインターセプトされます。
ポッドを作成します。
kubectl -n test scale deploy test-app --replicas 5
ReplicaSet をクエリします。「DESIRED」列には 5 が表示されますが、「CURRENT」列には 4 が表示されます。これは、ポッドの作成に失敗したことを示しています。
kubectl -n test get rs NAME DESIRED CURRENT READY AGE test-app-5ddc68c994 5 4 4 3m10s
ReplicaSet のイベントをクエリします。出力は、新しいポッドが 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
kubectl -n test describe resourcequota test-quota
Name: test-quota
Namespace: test
Resource Used Hard
-------- ---- ----
limits.cpu 0 4
requests.cpu 0 4
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-app
name: test-app
namespace: test
spec:
replicas: 5 // 5つのレプリカを指定
selector:
matchLabels:
app: test-app
template:
metadata:
labels:
app: test-app
spec:
containers:
- image: busybox:latest
imagePullPolicy: IfNotPresent
name: test
command:
- sleep
- "360000000"
resources:
limits:
cpu: "1"
EOF
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
kubectl -n test describe resourcequota
Name: test-quota
Namespace: test
Resource Used Hard
-------- ---- ----
limits.cpu 4 4
requests.cpu 4 4