【Kubernetes】ResourceQuotaでリソース制限

スポンサーリンク

はじめに

Kubernetesのリソース制限ができるResourceQuotaについてざっくり解説しながら、実際に使っていきたいと思います。

ResourceQuotaとは

ResourceQuotaとは、Namespaceごとのリソース量を制限することができるオブジェクトです。

コンピュータリソースからPodの数などのオブジェクト数までの割り当て(クォータ)を決めることができます。

現状はNamespaceごとにResourceQuotaを作成することを強制することはできませんが、将来的に設定できるように計画しているみたいです。(公式ドキュメントより)

クォータ

設定できるクォータについてざっくり紹介します。

コンピュートリソース

リソース名説明
limits.cpuPodのCPUのlimitの合計
limits.memoryPodのMemoryのlimitの合計
requests.cpu(cpu)PodのCPUのrequestの合計
requests.memory(memory)PodのMemoryのrequestの合計
hugepages-<size>Podでの指定したサイズのリクエストの数

request(要求)とlimit(制限)の違いは下記を参考にしてください。

コンテナのリソース管理
Podを指定する際に、コンテナが必要とする各リソースの量をオプションで指定することができます。 指定する最も一般的なリソースはCPUとメモリ(RAM)ですが、他にもあります。 Pod内のコンテナのリソース要求を指定すると、スケジューラはこの情報を使用して、どのNodeにPodを配置するかを決定します。コンテナに制限ソー...

0.5CPUは1CPUの半分になります。

ストレージリソース

リソース名説明
requests.storagePVCのストレージの合計
persistentvolumeclaimsPVCの総数
<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の合計

オブジェクト数

リソース名説明
configmapsConfigMapの総数
persistentvolumeclaimsPersistentVolumeClaimの総数
podsPodの総数
replicationcontrollersReplicationControlerの総数
resourcequotasResourceQuotaの総数
servicesServiceの総数
services.loadbalancersLoadBalancerのServiceの総数
services.nodeportsNodePortのServiceの総数
secretsSecretの総数

使ってみる

ここからは実際にResourceQuotaを実際に使ってみたいと思います。

Namespace作成

まずはリソース制限をするNamespaceを作成します。

kubectl create ns demo

kubensコマンドでNamespaceを切り替えます。

kubens demo

kubensコマンドのインストールや使い方については下記を参考にしてください。

【Kubernetes】kubectxとkubensでContextとNamespaceを簡単に切り替える
はじめにKubernetesにおいて、ContextとNamespaceを簡単に切り替えられるkubectxとkubensについて簡単な使い方を紹介していきます。kubectxとkubenskubectxはContexを切り替えるツー...

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ごとのリソースの制限をできる

参考

タイトルとURLをコピーしました