Kubernetes入門3: Podに割り当てるCPU時間を制限する
Kubernetesでは、VMを管理するとき同様に、Podに割り当てるリソースを制限することができます。
前回の記事のメモリの時と同様に、公式ドキュメントを参照しながら、Podに割り当てるCPU時間を制限する方法と挙動について試してみました。
- Podが制限以上のCPU時間を消費
- Podがノードに搭載されているCPU時間を要求する
の2パターンを試して、実際にどのような挙動となるか見ていきます。
準備
メモリの時と同じように、metrics-serverというadd-onsを有効にします。
$ minikube addons enable metrics-server
metrics-serverが実行されているかどうかは次のコマンドで確認できます。
$ kubectl get apiservices NAME v1beta1.metrics.k8s.io
今回のチュートリアル用にnamespaceを作成します。
$ kubectl create namespace cpu-example namespace/cpu-example created $ kubectl get namespaces NAME STATUS AGE cpu-example Active 18s
Podが要求通りのCPU時間を消費
Podを構成するコンテナのCPU要求を0.5cpu、CPU制限を1cpuとして設定します。また、2cpuを消費するコンテナを実行しています。
# https://k8s.io/examples/pods/resource/cpu-request-limit.yaml apiVersion: v1 kind: Pod metadata: name: cpu-demo namespace: cpu-example spec: containers: - name: cpu-demo-ctr image: vish/stress resources: limits: cpu: "1" requests: cpu: "0.5" args: - -cpus - "2"
Podを作成。
$ kubectl create -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example
作成したPodが使用中のCPU時間を表示。
$ kubectl top pods cpu-demo --namespace=cpu-example NAME CPU(cores) MEMORY(bytes) cpu-demo 998m 1Mi
Podはstressコマンドによって、2CPUを消費しようとしていますが、制限値を超えて利用することはできないことがわかります。
Podを削除。
$ kubectl delete pods cpu-demo --namespace=cpu-example
Podがノードに搭載されているCPU時間を要求する
最後に膨大なCPU(設定では100cpu)を要求した時の挙動を見ていきます。
# https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml apiVersion: v1 kind: Pod metadata: name: cpu-demo-2 namespace: cpu-example spec: containers: - name: cpu-demo-ctr-2 image: vish/stress resources: limits: cpu: "100" requests: cpu: "100" args: - -cpus - "2"
Podの作成
$ kubectl create -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example
Podの情報を取得すると、STATUSが、 Pending
となっています。つまり、Podはスケジューリングされておらず、どのノードでも動作していない状態となります。
$ kubectl get pod cpu-demo-2 --namespace=cpu-example
Podの詳細情報を表示すると、
$ kubectl describe pod cpu-demo-2 --namespace=cpu-example
次のように、ノード上のCPU不足により、スケジューリングができないことがわかります。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 32s (x7 over 1m) default-scheduler 0/1 nodes are available: 1 Insufficient cpu.
PodとNamespaceを削除して終了。
$ kubectl delete pod cpu-demo-2 --namespace=cpu-example $ kubectl delete namespaces cpu-example
以上で、CPU時間割り当てに関するチュートリアルは終了となります。Kubernetesで管理できるリソースはCPUやメモリ以外にもボリュームなどさまざまなものがあり、VMと同じようにリソース管理するための機能が備わっています。次は、拡張リソースやボリュームなど、管理するには難易度が少し高いリソースについてまとめていきたいと思います。