Namespaceの最小および最大CPU制約を設定する

Namespaceに対して有効なCPUリソース制限の範囲を定義することで、そのNamespace内のすべての新規Podが、設定した範囲内に収まるようにします。

このページでは、コンテナとPodがNamespace内で使用するCPUリソースの最小値と最大値を設定する方法を説明します。 最小および最大のCPU値はLimitRangeオブジェクトで指定します。 PodがそのLimitRangeによって課される制約を満たさない場合、そのNamespace内ではPodを作成できません。

始める前に

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

クラスター内でNamespaceを作成できる権限が必要です。

クラスター内の各Nodeには、Pod用に少なくとも1.0 CPUが利用可能である必要があります。 Kubernetesにおける「1 CPU」の意味については、CPUの意味を参照してください。

Namespaceの作成

この演習で作成するリソースをクラスター内の他のリソースから分離するために、Namespaceを作成します。

kubectl create namespace constraints-cpu-example

LimitRangeとPodの作成

次に、例としてLimitRangeのマニフェストを示します。

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    type: Container

LimitRangeを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints.yaml --namespace=constraints-cpu-example

LimitRangeの詳細情報を表示します:

kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example

出力には、期待どおり最小および最大のCPU制約が表示されます。 ただし、LimitRangeの設定ファイルでデフォルト値を指定していないにもかかわらず、それらの値が自動的に作成されている点に注目してください。

limits:
- default:
    cpu: 800m
  defaultRequest:
    cpu: 800m
  max:
    cpu: 800m
  min:
    cpu: 200m
  type: Container

これで、constraints-cpu-example Namespace内でPodを作成するたびに(またはKubernetes APIの別のクライアントが同等のPodを作成するたびに)、Kubernetesは次の手順を実行します:

  • そのPod内のコンテナがCPU要求やCPU制限を指定していない場合、コントロールプレーンはそのコンテナにデフォルトのCPU要求とCPU制限を割り当てます。

  • そのPod内のすべてのコンテナが、200ミリCPU以上のCPU要求を指定していることを検証します。

  • そのPod内のすべてのコンテナが、800ミリCPU以下のCPU制限を指定していることを検証します。

備考:

LimitRangeオブジェクトを作成するときには、HugePagesやGPUに対する制限も指定できます。 ただし、これらのリソースに対してdefaultdefaultRequestの両方を指定する場合は、2つの値を同じにする必要があります。

コンテナを1つ持つPodのマニフェストを次に示します。 このコンテナのマニフェストでは、CPU要求が500ミリCPU、CPU制限が800ミリCPUとして指定されています。 これらは、このNamespaceのLimitRangeによって課される最小および最大のCPU制約を満たしています。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo
spec:
  containers:
  - name: constraints-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "500m"

Podを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod.yaml --namespace=constraints-cpu-example

Podが実行中であり、そのコンテナが正常であることを検証します:

kubectl get pod constraints-cpu-demo --namespace=constraints-cpu-example

Podの詳細情報を表示します:

kubectl get pod constraints-cpu-demo --output=yaml --namespace=constraints-cpu-example

出力には、Pod内の唯一のコンテナがCPU要求として500ミリCPU、CPU制限として800ミリCPUを持っていることが示されています。 これらは、LimitRangeによって課されている制約を満たしています。

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 500m

Podを削除する

kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example

最大CPU制約を超えるPodを作成する試み

コンテナを1つ持つPodのマニフェストを次に示します。 このコンテナでは、CPU要求を500ミリCPU、CPU制限を1.5 CPUとして指定しています。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-2
spec:
  containers:
  - name: constraints-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1.5"
      requests:
        cpu: "500m"

このPodの作成を試みます。

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-2.yaml --namespace=constraints-cpu-example

出力から、このPodが作成されていないことがわかります。 これは、許容されないコンテナが定義されているためです。 このコンテナは、CPU制限が大きすぎるために許容されません:

Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-2.yaml":
pods "constraints-cpu-demo-2" is forbidden: maximum cpu usage per Container is 800m, but limit is 1500m.

最小CPU要求を満たさないPodを作成する試み

コンテナを1つ持つPodのマニフェストを次に示します。 このコンテナでは、CPU要求を100ミリCPU、CPU制限を800ミリCPUとして指定しています。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-3
spec:
  containers:
  - name: constraints-cpu-demo-3-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "100m"

このPodの作成を試みます。

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-3.yaml --namespace=constraints-cpu-example

出力から、このPodが作成されていないことがわかります。 これは、許容されないコンテナが定義されているためです。 このコンテナは、強制されている最小値よりも低いCPU要求を指定しているために許容されません:

Error from server (Forbidden): error when creating "examples/admin/resource/cpu-constraints-pod-3.yaml":
pods "constraints-cpu-demo-3" is forbidden: minimum cpu usage per Container is 200m, but request is 100m.

CPU要求や制限を指定しないPodを作成する試み

次に、CPU要求もCPU制限も一切指定しないPodを作成する例を見てみます。 コンテナを1つ持つPodのマニフェストを次に示します。 このコンテナでは、CPU要求もCPU制限も指定していません。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo-4
spec:
  containers:
  - name: constraints-cpu-demo-4-ctr
    image: vish/stress

Podを作成します:

kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints-pod-4.yaml --namespace=constraints-cpu-example

Podの詳細情報を表示します:

kubectl get pod constraints-cpu-demo-4 --namespace=constraints-cpu-example --output=yaml

出力から、このPod内の1つだけのコンテナが、CPU要求として800ミリCPU、CPU制限として800ミリCPUを持っていることがわかります。 では、このコンテナはどのようにしてこれらの値を持つようになったのでしょうか。

resources:
  limits:
    cpu: 800m
  requests:
    cpu: 800m

このコンテナ自身ではCPU要求とCPU制限を指定していないため、コントロールプレーンはこのNamespaceのLimitRangeに設定されているデフォルトのCPU要求とCPU制限を適用しました。

この時点で、あなたのPodが実行されている場合もあれば、されていない場合もあります。 このタスクの前提条件として、各Nodeで少なくとも1 CPUが使用可能である必要がある点を思い出してください。 各Nodeが1 CPUしか持たない場合、どのNodeにも800ミリCPUの要求を満たすだけの割り当て可能なCPUがない可能性があります。 一方で、2 CPUを持つNodeを使用している場合は、800ミリCPUの要求を満たすのに十分なCPUを確保できる可能性が高いでしょう。

Podを削除します:

kubectl delete pod constraints-cpu-demo-4 --namespace=constraints-cpu-example

最小および最大CPU制約の適用

最小および最大のCPU制約は、LimitRangeによってNamespaceに対して課されますが、それらが適用されるのはPodが作成または更新されるときだけです。 LimitRangeを変更しても、すでに作成済みのPodには影響しません。

最小および最大CPU制約を設定する理由

クラスター管理者として、あなたはPodが使用できるCPUリソースに制限を設けたい場合があります。 例えば:

  • クラスター内の各Nodeが2 CPUを持っている場合。この場合、2 CPUを超えて要求するPodは受け入れたくありません。 なぜならクラスター内のどのNodeもその要求を満たすことができないためです。

  • 1つのクラスターを本番部門と開発部門で共有している場合。 本番ワークロードには最大3 CPUまで使用できるようにし、一方で開発ワークロードは1 CPUに制限したいとします。 この場合、本番用と開発用に別々のNamespaceを作成し、それぞれのNamespaceに対してCPU制約を適用します。

クリーンアップ

Namespaceを削除します:

kubectl delete namespace constraints-cpu-example

次の項目

クラスター管理者向け

アプリケーション開発者向け