TechLunch

The free lunch is over.

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と同じようにリソース管理するための機能が備わっています。次は、拡張リソースやボリュームなど、管理するには難易度が少し高いリソースについてまとめていきたいと思います。