LoginSignup
22

More than 3 years have passed since last update.

Kubernetesのリソース確認

Posted at

はじめに

KubernetesのクラスタにPodを立てていくとリソースを消費するわけで、Pod/コンテナのリソース消費量は少ないとは言え、やはりリソースの監視は必要になります。
実運用ではPrometheusとか別ツールで監視するのが一般的だと思いますが、ここではkubectlコマンドでの確認方法をまとめます。

kubectl topコマンド

kubectl topコマンドを使用するには、metrics-serverを構築する必要がある場合があります。
Kubernetesのmetrics-serverを構築する

node

以下のコマンドでクラスタを構成する各ノードのCPU、メモリの使用量と使用率が確認できます。

$ kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master     318m         15%    987Mi           35%
k8s-worker01   1035m        51%    1705Mi          62%
k8s-worker02   1039m        51%    1460Mi          53%

Pod

以下のコマンドで各Podが使用するCPU、メモリの使用量が確認できます。
-n でnamespaceを指定しないと、defaultのnamespaceのPodのみが表示されます。

$ kubectl -n kube-system top pod
NAME                                      CPU(cores)   MEMORY(bytes)
calico-kube-controllers-77c4b7448-6prr9   2m           11Mi
calico-node-2hc9b                         29m          40Mi
calico-node-cgdgk                         30m          47Mi
calico-node-tkcz5                         39m          43Mi
coredns-6955765f44-55wbn                  22m          10Mi
coredns-6955765f44-bhdvr                  25m          10Mi
etcd-k8s-master                           24m          52Mi
kube-apiserver-k8s-master                 48m          343Mi
kube-controller-manager-k8s-master        18m          46Mi
kube-proxy-8pngh                          1m           16Mi
kube-proxy-gqt42                          2m           17Mi
kube-proxy-pq2fb                          1m           14Mi
kube-scheduler-k8s-master                 5m           16Mi
metrics-server-fbc46dc5f-9k6kt            1m           10Mi

Podには複数のコンテナがデプロイされる場合もあります。その場合は、--containersオプションを付けることで、コンテナごとの使用量も確認できます。

$ kubectl -n kube-system top pod --containers
POD                                       NAME                      CPU(cores)   MEMORY(bytes)
calico-kube-controllers-77c4b7448-6prr9   calico-kube-controllers   1m           11Mi
calico-node-2hc9b                         calico-node               29m          42Mi
calico-node-cgdgk                         calico-node               26m          50Mi
calico-node-tkcz5                         calico-node               31m          50Mi
coredns-6955765f44-55wbn                  coredns                   20m          12Mi
coredns-6955765f44-bhdvr                  coredns                   24m          12Mi
etcd-k8s-master                           etcd                      21m          56Mi
kube-apiserver-k8s-master                 kube-apiserver            44m          343Mi
kube-controller-manager-k8s-master        kube-controller-manager   15m          45Mi
kube-proxy-8pngh                          kube-proxy                1m           17Mi
kube-proxy-gqt42                          kube-proxy                1m           19Mi
kube-proxy-pq2fb                          kube-proxy                1m           17Mi
kube-scheduler-k8s-master                 kube-scheduler            4m           16Mi
metrics-server-fbc46dc5f-9k6kt            metrics-server            1m           10Mi

この例だと1Pod/1コンテナなので、あまり意味はないけど・・

kubectl describeコマンド

kubectl describeは指定したリソースの詳細を表示します。その中で使用リソースを確認することもできます。
nodeを指定すると、そのノードにデプロイされているPodと使用量が確認できます。

$ kubectl describe node k8s-worker02
Name:               k8s-worker02
Roles:              <none>
・・・
Non-terminated Pods:          (12 in total)
  Namespace                   Name                              CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                              ------------  ----------  ---------------  -------------  ---
  default                     sample-web1                       0 (0%)        0 (0%)      0 (0%)           0 (0%)         13h
  default                     sample-web2                       0 (0%)        0 (0%)      0 (0%)           0 (0%)         12h
  kube-system                 calico-node-tkcz5                 250m (12%)    0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 kube-proxy-8pngh                  0 (0%)        0 (0%)      0 (0%)           0 (0%)         10d
  kube-system                 metrics-server-fbc46dc5f-9k6kt    0 (0%)        0 (0%)      0 (0%)           0 (0%)         3d12h
  loadtest                    load-test-7f75b94bb8-njm97        0 (0%)        0 (0%)      0 (0%)           0 (0%)         5d12h
  sock-shop                   carts-5fc45568c4-r4fqk            300m (15%)    300m (15%)  500Mi (18%)      500Mi (18%)    5d12h
  sock-shop                   orders-74c6b45f4f-42rns           200m (10%)    500m (25%)  500Mi (18%)      500Mi (18%)    5d12h
  sock-shop                   orders-db-df75f545f-vvth6         0 (0%)        0 (0%)      0 (0%)           0 (0%)         5d12h
  sock-shop                   rabbitmq-c7b9db6cc-bb5hn          0 (0%)        0 (0%)      0 (0%)           0 (0%)         5d12h
  sock-shop                   user-559d7f794f-65sxs             100m (5%)     300m (15%)  100Mi (3%)       100Mi (3%)     5d12h
  sock-shop                   user-db-87f548457-ldqvh           0 (0%)        0 (0%)      0 (0%)           0 (0%)         5d12h
・・・

リソースの単位

CPU

CPUの使用量には「m」の単位がついています。これは$10^-3$を表す「ミリ」で、「1(v)CPU=1000m」となります。物理的なCPUのクロック周波数とは無関係です。
Kubernetesドキュメント

以下の場合、k8s-worker01には2コア(2000m)割り当ててますので、使用量が847mだと使用率が「847/2000=0.42」で42%になります。

$ kubectl top node k8s-worker01
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-worker01   847m         42%    1797Mi          65%

メモリ

メモリの単位には「Mi」がついています。メモリの単位はバイト単位になります。
Kubernetesドキュメント

上の結果の場合メモリの使用量は「1797Mi」になっています。
k8s-worker01には3GB割り当ててますので、「1797/(3*1024)=0.58」になります。でもメモリの利用率(65%)と合わない。

そこで、OS上でメモリ容量を確認してみると「2914176KiB」になってました。
VertualBoxで少し取られるのかな?

$ top

top - 11:25:19 up  1:13,  1 user,  load average: 2.72, 2.77, 2.40
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.8 us,  2.4 sy,  0.0 ni, 91.8 id,  0.0 wa,  0.0 hi,  2.1 si,  0.0 st
KiB Mem :  2914176 total,   718616 free,   994636 used,  1200924 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1751636 avail Mem
・・・

改めて計算してみると「(1797*1024)/2914176=0.63」。まだ微妙に合わない。
kubectl describeで確認してみると、「Capacity」の値はOSから認識されている容量ですが、「Allocatable」の値は微妙に減っています。
Kubernetesが少し使うのかな?

$ kubectl describe node k8s-worker01
Name:               k8s-worker01
Roles:              <none>
・・・
Capacity:
  cpu:                2
  ephemeral-storage:  17394Mi
  hugepages-2Mi:      0
  memory:             2914176Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:  16415037823
  hugepages-2Mi:      0
  memory:             2811776Ki
  pods:               110
・・・

Allocatableの値で確認してみると「(1797*1024)/2811776=0.65」。合った!

わずかではありますが、CapacityとAllocatableの値に違いがあるのが気になりますが、リソースの確認方法を確認することができました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22