サービス

watchコマンド以外で定期的にkubectlコマンドの結果を確認する

Kubernetes(k8s)の特定サービスの pod のリソース状態を監視しようと思って、mac で watch コマンドを実行してみましたがコマンドが入ってない。

単純に pod の一覧を確認するだけなら、kubectl get の -w オプションで問題ありません。

$ kubectl get -h

-w, –watch=false: After listing/getting the requested object, watch for changes.
Uninitialized objects are excluded if no object name is provided.

こんな感じですね。

$ kubectl get -w pods -n [namespace]

ただし、kubectl top でリソースの状態を見たい場合には -w オプションが使えません。

$ kubectl top -h

Display Resource (CPU/Memory/Storage) usage.

The top command allows you to see the resource consumption for nodes or pods.

This command requires Heapster to be correctly configured and working on the server.

Available Commands:
node Display Resource (CPU/Memory/Storage) usage of nodes
pod Display Resource (CPU/Memory/Storage) usage of pods

Usage:
kubectl top [flags] [options]

今回は、kubectl top で特定サービスのリソースの状態を定期的にチェックしたいと思います。

watchコマンド

冒頭で書いた通り、手元の Mac に watch コマンドが入っていなかったので brew でインストールします。

これで 10 秒おきくらいに watch してあげれば、ある程度リアルタイムな CPU 使用率やメモリ使用量が確認できます。

$ watch -n 10 kubectl top po -n [namespace]

ただ、watch だとコンソールの標準出力が上書きされていってしまうので、数分前の状況を残しておきたいときは不便です。

また、結果に対して grep などでサービスを絞れないのでちょっと使い勝手はよくないです。

kubectl や watch コマンドのオプションで対処できるかもしれませんが、もっと単純でいいので記録が残るような監視をしてみたいところです。

シェルでチェックを繰り返す

ベタだしループが強引な気もしますが、目的は果たせます。

また、kubectl top の結果から抽出したりすることも可能なので、こんなパターンもアリかなと思います。

リソースの状態は 1 分ごとにしか変化しないので、60 秒のスリープを入れて繰り返してあげれば良さそうです。

残念ながらリアルタイムとはいきませんが、pod のリソースやスケールアウト(イン)の状況確認には事足りるかな。