技術系TIPS
PR

EKSでマネージドノードグループに使用しているEC2のディスク使用量を確認する

saratogax
記事内に商品プロモーションを含む場合があります

AWS の EKS で使用している EC2 のノードインスタンス。

クラスターの設定ファイルで指定しなければ、デフォルトのディスク容量はインスタンプタイプによって決定されます。

例えば、r5.xlarge だと 80GiB ですね。

ただ、EC2 インスタンスのディスク使用量はサクッと確認する方法がわからなかったので、もしかすると想像以上に消費してないかもと思い調べてみることにしました。

ここでは、EC2 インスタンスに ssh やセッションマネージャーでログインできない場合を想定しています。ログインできる場合は、df コマンドなどで確認してください。

EC2のディスク容量

冒頭にも注意書きしましたが、EC2 インスタンスに ssh やセッションマネージャーでログインできるならコマンド一発です。

tmpfs を除外して合計を付けるとこんな感じ。

$ df -h --total | grep -v tmpfs

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      200G  5.3G  195G   3% /
/dev/xvda128     10M  1.3M  8.7M  13% /boot/efi
total           202G  5.3G  196G   3% -

しかし、EC2 インスタンスの外からだとディスク消費量を確認する方法がなかなか見つかりません。

metrics-server がいてもディスク総量は見れても消費量は見れず・・・。

AWS のコンソール画面で EBS のボリュームを確認してもダメです。

別のプラグインなどを追加で入れたくないですしね。

KubernetesのNode metrics data

っと悩んでいたら、Kubernetes 標準で「Node metrics data」というものがあることを教えてもらいました。

The kubelet gathers metric statistics at the node, volume, pod and container level, and emits this information in the Summary API.

You can send a proxied request to the stats summary API via the Kubernetes API server.

kubelet は、ノード、ボリューム、ポッド、コンテナ レベルでメトリック統計を収集し、この情報を Summary API に出力します。

Kubernetes API サーバー経由で、プロキシされたリクエストを統計サマリー API に送信できます。

https://kubernetes.io/docs/reference/instrumentation/node-metrics/

では、早速ノードの一覧を取得してみましょう。

$ kubectl get nodes

NAME                                              STATUS   ROLES    AGE   VERSION
ip-xx-xxx-xxx-1.ap-northeast-1.compute.internal   Ready    <none>   13h   v1.29.3-eks-ae9a62a
ip-xx-xxx-xxx-2.ap-northeast-1.compute.internal   Ready    <none>   13h   v1.29.3-eks-ae9a62a
ip-xx-xxx-xxx-3.ap-northeast-1.compute.internal   Ready    <none>   13h   v1.29.3-eks-ae9a62a
ip-xx-xxx-xxx-4.ap-northeast-1.compute.internal   Ready    <none>   13h   v1.29.3-eks-ae9a62a

ノードの名前が取得できたら、以下のコマンドに埋め込みます。

kubectl get –raw “/api/v1/nodes/[NODENAME]/proxy/stats/summary” | jq .node.fs

約 80GiB のうち、利用可能なディスク容量が 68 GiB くらいあることがわかります。

availableBytes: 利用可能なディスク容量
capacityBytes: ディスク総量
usedBytes: ディスク使用量
$ kubectl get --raw "/api/v1/nodes/ip-xx-xxx-xxx-1.ap-northeast-1.compute.internal/proxy/stats/summary" | jq .node.fs

{
  "time": "2024-07-22T09:40:29Z",
  "availableBytes": 73743478784,
  "capacityBytes": 85886742528,
  "usedBytes": 12143263744,
  "inodesFree": 41790976,
  "inodes": 41942000,
  "inodesUsed": 151024
}

ノード一覧取得のコマンドと組み合わせて、ワンライナーで表現できるようにすると楽そうですね。

grep Ready のところがダサいけど・・・。

$ for s in `kubectl get nodes | grep Ready | awk '{print $1}'`; do echo ${s}; kubectl get --raw "/api/v1/nodes/${s}/proxy/stats/summary" | jq .node.fs; done

使用量を GB で表示するだけならこんな感じで。

$ for s in `kubectl get nodes | grep Ready | awk '{print $1}'`; do kubectl get --raw "/api/v1/nodes/${s}/proxy/stats/summary" | jq ".node.fs.usedBytes / 1024 / 1024 / 1024"; done

EKSクラスタのコンフィグでボリューム指定

キャパがあることがわかれば、コスト削減目的でディスク総量を減らすのもアリですよね。

ということで、クラスタの再構築は必要になってしまいますが、設定ファイルにボリュームを指定しましょう。

managedNodeGroups:
  - name: test-nodes
    volumeSize: 30

10GiB で月に約 1 ドルくらいかかるので、80 GiB と 30 GiB ではなかなかの違いです。

これでノードが何十台もあるなら節約するに越したことはないでしょう。

まとめ

ログインができない EC2 インスタンスの、ディスク使用量を確認する方法を紹介してきました。

CPU やメモリのリソースを追いかけることが多かったので気付かなかったですが、確かにノードのディスク使用量は盲点でした。

普段、コストとなるとインスタンスタイプばかり目にいってしまいますが、遊んでいるディスクが多い場合も要注意ですね。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました