はじめに
Kubernetesのリソース制限ができるResourceQuotaについてざっくり解説しながら、実際に使っていきたいと思います。
ResourceQuotaとは
ResourceQuotaとは、Namespaceごとのリソース量を制限することができるオブジェクトです。
コンピュータリソースからPodの数などのオブジェクト数までの割り当て(クォータ)を決めることができます。
現状はNamespaceごとにResourceQuotaを作成することを強制することはできませんが、将来的に設定できるように計画しているみたいです。(公式ドキュメントより)
クォータ
設定できるクォータについてざっくり紹介します。
コンピュートリソース
リソース名 | 説明 |
---|---|
limits.cpu | PodのCPUのlimitの合計 |
limits.memory | PodのMemoryのlimitの合計 |
requests.cpu (cpu ) | PodのCPUのrequestの合計 |
requests.memory (memory ) | PodのMemoryのrequestの合計 |
hugepages-<size> | Podでの指定したサイズのリクエストの数 |
request(要求)とlimit(制限)の違いは下記を参考にしてください。
0.5CPUは1CPUの半分になります。
ストレージリソース
リソース名 | 説明 |
---|---|
requests.storage | PVCのストレージの合計 |
persistentvolumeclaims | PVCの総数 |
<storage-class-name>.storageclass.storage.k8s.io/requests.storage | 特定のストレージクラスのPVCのストレージの合計 |
<storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims | 特定のストレージクラスのPVCの総数 |
requests.ephemeral-storage (ephemeral-storage ) | エフェメラルストレージのrequestの合計 |
limits.ephemeral-storage | エフェメラルストレージのlimitの合計 |
オブジェクト数
リソース名 | 説明 |
---|---|
configmaps | ConfigMapの総数 |
persistentvolumeclaims | PersistentVolumeClaimの総数 |
pods | Podの総数 |
replicationcontrollers | ReplicationControlerの総数 |
resourcequotas | ResourceQuotaの総数 |
services | Serviceの総数 |
services.loadbalancers | LoadBalancerのServiceの総数 |
services.nodeports | NodePortのServiceの総数 |
secrets | Secretの総数 |
使ってみる
ここからは実際にResourceQuotaを実際に使ってみたいと思います。
Namespace作成
まずはリソース制限をするNamespaceを作成します。
kubectl create ns demo
kubens
コマンドでNamespaceを切り替えます。
kubens demo
kubens
コマンドのインストールや使い方については下記を参考にしてください。

ResourceQuota作成
ResouceQuotaを作成します。
マニフェストresourcequota.yaml
は下記の通りです。
apiVersion: v1
kind: ResourceQuota
metadata:
name: resource-quota
spec:
hard:
limits.cpu: "0.7"
limits.memory: 1Gi
requests.cpu: "0.3"
requests.memory: 500Mi
pods: "2"
CPUとMemoryのlimitsとrequests、Pod数の制限をしています。
マニフェストからResourceQuotaを作成します。
kubectl apply -f resourcequota.yaml
作成したResouceQuotaを確認してみます。
このNamespaceでは何も作成していないので、Usedが全て0になっています。
❯ kubectl describe quota
Name: resource-quota
Namespace: demo
Resource Used Hard
-------- ---- ----
limits.cpu 0 700m
limits.memory 0 1Gi
pods 0 2
requests.cpu 0 300m
requests.memory 0 500Mi
Deployment作成
Deploymentを作成していきます。
Deploymentが作成するPodには2つのコンテナを含めています。
マニフェストdeployment.yaml
は下記の通りです。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
replicas: 2
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 200Mi
cpu: 200m
- name: redis
image: redis:latest
resources:
requests:
memory: 200Mi
cpu: 200m
limits:
memory: 500Mi
cpu: 500m
PodのCPUとMemoryのlimitsとrequestsの合計はそれぞれ下記になります。
- requests CPU: 300m
- limits CPU: 700m
- requests Memory: 300Mi
- limits Memory: 700Mi
さらにレプリカ数が2であるので、上記の倍のリソースが必要になります。
つまり、最終的に必要なリソースは下記になります。
- requests CPU: 600m
- limits CPU: 1400m
- requests Memory: 600Mi
- limits Memory: 1.4Gi
Deploymentを作成します。
kubectl apply -f deployment.yaml
作成結果確認
DeploymentからPodを作成できたのか確認してみます。
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
test-deployment 1/2 1 1 14s
❯ kubectl get rs
NAME DESIRED CURRENT READY AGE
test-deployment-8676fcf7bc 2 1 1 19s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
test-deployment-8676fcf7bc-pzg86 2/2 Running 0 23s
Podは1つしか作成されていないのが確認できます。
また、ReplicaSetの詳細を確認してみるとPodの作成でエラーになっていることがわかります。
❯ kubectl describe rs test-deployment-8676fcf7bc
Name: test-deployment-8676fcf7bc
Namespace: demo
:
:
Conditions:
Type Status Reason
---- ------ ------
ReplicaFailure True FailedCreate
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 112s replicaset-controller Created pod: test-deployment-8676fcf7bc-pzg86
Warning FailedCreate 112s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-cpkjn" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 112s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-qvtb8" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 112s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-ckk7b" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 112s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-2ck57" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 112s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-sktfv" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 112s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-gkwxb" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 111s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-m2nzz" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 111s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-9hhpv" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 111s replicaset-controller Error creating: pods "test-deployment-8676fcf7bc-f9fbc" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
Warning FailedCreate 61s (x6 over 109s) replicaset-controller (combined from similar events): Error creating: pods "test-deployment-8676fcf7bc-bgzk6" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, used: limits.cpu=700m,limits.memory=700Mi,requests.cpu=300m,requests.memory=300Mi, limited: limits.cpu=700m,limits.memory=1Gi,requests.cpu=300m,requests.memory=500Mi
ResourceQuotaの詳細を確認してみると、リソースが足りていないことがわかります。
❯ kubectl describe quota
Name: resource-quota
Namespace: demo
Resource Used Hard
-------- ---- ----
limits.cpu 700m 700m
limits.memory 700Mi 1Gi
pods 1 2
requests.cpu 300m 300m
requests.memory 300Mi 500Mi
ResourceQuota変更
ResouceQuotaが足りていないことがわかったので、ResouceQuotaのクォータを増やしてみます。
apiVersion: v1
kind: ResourceQuota
metadata:
name: resource-quota
spec:
hard:
limits.cpu: "1.5"
limits.memory: 2Gi
requests.cpu: "0.6"
requests.memory: 800Mi
pods: "2"
ResouceQuotaを更新します。
kubectl apply -f resourcequota.yaml
クォータが増えているのを確認します。
❯ kubectl describe quota
Name: resource-quota
Namespace: demo
Resource Used Hard
-------- ---- ----
limits.cpu 700m 1500m
limits.memory 700Mi 2Gi
pods 1 2
requests.cpu 300m 600m
requests.memory 300Mi 800Mi
Pod再作成
クォータが足りるようになったので、Deploymentのマニフェストを反映してPodを再作成します。
kubectl apply -f deployment.yaml
作成結果確認
再作成の結果を確認してみると、正常にPodが作成されているのが確認できます。
❯ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
test-deployment 2/2 2 2 5m53s
❯ kubectl get rs
NAME DESIRED CURRENT READY AGE
test-deployment-8676fcf7bc 2 2 2 5m57s
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
test-deployment-8676fcf7bc-mlbv8 2/2 Running 0 64s
test-deployment-8676fcf7bc-pzg86 2/2 Running 0 6m1s
最後にクォータを確認するとぎりぎりで作成できたのがわかります。
❯ kubectl describe quota
Name: resource-quota
Namespace: demo
Resource Used Hard
-------- ---- ----
limits.cpu 1400m 1500m
limits.memory 1400Mi 2Gi
pods 2 2
requests.cpu 600m 600m
requests.memory 600Mi 800Mi
まとめ
- ResouceQuotaはNamespaceごとのリソースの制限をできる