コンテナコンピューティングサービス(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 | Terminated 状態ではないポッドの CPU 使用量は、この制限を超えてはなりません。 |
limits.memory | Terminated 状態ではないポッドのメモリ使用量は、この制限を超えてはなりません。 |
requests.cpu | Terminated 状態ではないポッドの CPU リクエストは、この制限を超えてはなりません。 |
requests.memory | Terminated 状態ではないポッドのメモリリクエストは、この制限を超えてはなりません。 |
enormouspages-<size> | Terminated 状態ではないポッドの EnormousPage リクエストのサイズは、この制限を超えてはなりません。 |
cpu |
|
memory |
|
拡張リソース
Kubernetes は、拡張リソースのオーバーコミット(制限 > リクエスト)をサポートしていません。したがって、requests. で始まるリソースクォータのみを構成する必要があります。詳細については、「リソースクォータ」をご参照ください。
例
この例では、kubectl を使用して ResourceQuota を表示および作成する方法を示します。
次のコマンドを実行して、test という名前の名前空間を作成します。
ResourceQuota を作成して、test という名前の Namespace の CPU 制限を 4000 ミリコアに設定します。
次のコマンドを実行して、ResourceQuota をクエリします。
kubectl -n test describe resourcequota test-quota予期される結果:
Namespace: test Resource Used Hard -------- ---- ---- limits.cpu 0 4 // limits.cpu の使用量と制限 requests.cpu 0 4 // requests.cpu の使用量と制限4 つのポッドを作成します。各ポッドは最大 1000 ミリコアを使用できます。
次のコマンドを実行して、ポッドをクエリします。
kubectl -n test get pod予期される結果:
NAME READY STATUS RESTARTS AGE test-app-5ddxxxxx94-jdv4m 1/1 Running 0 35s test-app-5ddxxxxx94-jhmtb 1/1 Running 0 35s test-app-5ddxxxxx94-mr8vq 1/1 Running 0 35s test-app-5ddxxxxx94-pjdfn 1/1 Running 0 35s出力は、4 つのポッドが Running 状態であることを示しています。
次のコマンドを実行して、ResourceQuota のステータスをクエリします。
kubectl -n test describe resourcequota予期される結果:
Name: test-quota Namespace: test Resource Used Hard -------- ---- ---- limits.cpu 4 4 // limits.cpu の使用量と制限 - 使用量が制限に達している requests.cpu 4 4 // requests.cpu の使用量と制限 - 使用量が制限に達しているUsed 列の値は、Hard 列の値と同じです。
別のポッドを作成します。ポッド作成リクエストは、ResourceQuota アドミッションコントローラーによってインターセプトされます。
ポッドを作成します。
kubectl -n test scale deploy test-app --replicas 5ReplicaSet をクエリします。DESIRED 列には 5 が表示されますが、CURRENT 列には 4 が表示されます。これは、ポッドの作成に失敗したことを示しています。
kubectl -n test get rs予期される結果:
NAME DESIRED CURRENT READY AGE test-app-5ddxxxxx94 5 4 4 3m10sReplicaSet のイベントをクエリします。出力は、新しいポッドが ResourceQuota アドミッションコントローラーによってインターセプトされたことを示しています。
kubectl -n test describe rs test-app-5ddxxxxx94予期される結果:
Name: test-app-5ddc68c994 // ReplicaSet名 Namespace: test // ... (省略) ... Events: // ... (省略) ... 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=4 // リソースクォータ超過でポッド作成失敗を示すイベント
kubectl create namespace testcat << EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-quota
namespace: test
spec:
hard:
requests.cpu: "4000m" // requests.cpu を 4000m に設定
limits.cpu: "4000m" // limits.cpu を 4000m に設定
EOFcat << 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: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2
imagePullPolicy: IfNotPresent
name: test
command:
- sleep
- "360000000"
resources:
limits:
cpu: "1" // 各ポッドのCPU制限を1コアに設定
EOF