このページでは、コンテナと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を作成します。
kubectl create namespace constraints-cpu-example
次に、例として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に対する制限も指定できます。
ただし、これらのリソースに対してdefaultとdefaultRequestの両方を指定する場合は、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
kubectl delete pod constraints-cpu-demo --namespace=constraints-cpu-example
コンテナを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.
コンテナを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要求も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制約は、LimitRangeによってNamespaceに対して課されますが、それらが適用されるのはPodが作成または更新されるときだけです。 LimitRangeを変更しても、すでに作成済みのPodには影響しません。
クラスター管理者として、あなたはPodが使用できるCPUリソースに制限を設けたい場合があります。 例えば:
クラスター内の各Nodeが2 CPUを持っている場合。この場合、2 CPUを超えて要求するPodは受け入れたくありません。 なぜならクラスター内のどのNodeもその要求を満たすことができないためです。
1つのクラスターを本番部門と開発部門で共有している場合。 本番ワークロードには最大3 CPUまで使用できるようにし、一方で開発ワークロードは1 CPUに制限したいとします。 この場合、本番用と開発用に別々のNamespaceを作成し、それぞれのNamespaceに対してCPU制約を適用します。
Namespaceを削除します:
kubectl delete namespace constraints-cpu-example