EKSでマネージドノードグループに使用しているEC2のディスク使用量を確認する
AWS の EKS で使用している EC2 のノードインスタンス。
クラスターの設定ファイルで指定しなければ、デフォルトのディスク容量はインスタンプタイプによって決定されます。
例えば、r5.xlarge だと 80GiB ですね。
ただ、EC2 インスタンスのディスク使用量はサクッと確認する方法がわからなかったので、もしかすると想像以上に消費してないかもと思い調べてみることにしました。
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 やメモリのリソースを追いかけることが多かったので気付かなかったですが、確かにノードのディスク使用量は盲点でした。
普段、コストとなるとインスタンスタイプばかり目にいってしまいますが、遊んでいるディスクが多い場合も要注意ですね。