なぜ監視するのか?
自分たちのサービスが動いているかどうか知りたいに尽きると思います。
今回はGKEにDatadogを入れて、どう監視すべきなのかについて書いていきたいと思います。
主に下記の記事を参考に書いています。
Monitoring Kubernetes with Datadog | Datadog
Datadogが提唱するモニタリング理論
下記3つのデータを集めるべきだと、Datadogは提唱しています。
- Work Metrics
- Resource Metrics
- Events
Work Metrics
自分のシステムが正常に働いている度合いを示すメトリクスのことを指します。
Resource Metrics
正常じゃない場合に何が原因かを示すメトリクスのことを指します。
具体的には、CPU, memory, I/O, Networkなどです。
How to monitor Docker resource metrics
Events
Resource Metricsで、正常でない原因がわかったとしても、現状だとどの事象でそれが生じたのかはわかりません。
その事象を明らかにするのが、Eventsです。
具体的には、デプロイとかになります。
どうやって監視するのか
では上3つを使用してどのように監視するのかというと、再帰的に上記3つを監視していくことになります。
例えば、何かアラートがSlackに送られるとします。
そのアラートは、Work Metrics、次にResource Metrics、その次にEvents見てみようといった感じです。
これを下記の図のように再帰的に行っていくことで、最終的に原因にたどり着く形となっています。
Kubernetesの動いているとは
Kubernetes
のモニタリングは、コンテナのモニタリングと、クラスタのモニタリングの2つがあります。
ここでは、クラスタのモニタリングに焦点を当てます。
クラスタのモニタリング
Kubernetes
を使用するにあたって、自分のサービスが動いているとはどういうことか?
結論、PodとServiceが動いていれば、サービスが動いていると定義できそうです。
ただ、Kubernetesの場合、Podが問題があっても、トップレベルシステムが存在しないため、Kubernetes が原因なのかを簡単に切り分けられません。
そこで、Kuberentes クラスタ自体のモニタリングとして、Kubernetes を構成する各コンポーネントを監視します。
KubernetesのWork Metrics
kubelet
下記図のように、各ノードで実行されるエージェントのことを指します。
Monitoring Kubernetes with Datadog | Datadogより引用
Kubernetesのコンポーネント - Kubernetes
Kubelet
これを監視することで以下の監視ができます。
- ping による死活監視
- Docker daemon が動いているかどうか
- kubelet の syncloop (current state を desired state に近づけるための処理を kubelet は繰り返し行っている)
etcd
一貫性、高可用性を持ったキーバリューストアで、Kubernetesの全てのクラスター情報の保存場所として利用されています。
Kubernetesのコンポーネント - Kubernetesより引用
kube-system
Datadogの記事には監視する必要があると書かれているんだけど、これを監視する理由がわかっていない......
主なResource Metrics[おまけ]
dockerコンテナ
sources:docker
dockerコンテナのcreate/start/stop/destroy イベントを表します。
Monitor Docker with Datadog
docker.containers.running
イメージでタグ付けされたこのホストで実行されているコンテナの数
CPU
docker.cpu.user
CPUがこのコンテナのプロセスの直接制御下にあり、正規化されていない(非正規化)時間の割合。パーセンテージで表す。
システムコール
docker.cpu.system
CPUがこのコンテナのプロセスに代わってシステムコールを実行している時間の割合、非正規化。パーセンテージで表す。
straceコマンドの使い方 - Qiita
Memory
docker.mem.rss
コンテナのプロセスに属する非キャッシュメモリの量。スタック、ヒープなどに使用されます。バイトで表す。
docker.mem.swap
コンテナが現在使用しているスワップの量。バイトで表す。
docker.mem.cache
ディスクからデータをキャッシュするために使用されているメモリの量(たとえば、ブロックデバイス上のブロックに正確に関連付けることができるメモリの内容)。バイトで表す。
Network
docker.net.bytes_rcvd
ネットワークから受信した1秒あたりのバイト数。バイト数で表す。
rcvd
受信したパケット数(秒単位)を監視します。
Network Rcvd/sec
docker.net.bytes_sent
ネットワークに毎秒送信されるバイト。 バイトとして表示
I/O
docker.io.read_bytes
コンテナのプロセスによってディスクから読み取られた1秒あたりのバイト数。バイトとして表示
docker.io.write_bytes
コンテナーのプロセスによってディスクに1秒あたりに書き込まれたバイト数。バイトとして表示
メトリクス一覧
Docker 収集データ
Datadog で Docker コンテナをモニタリングする
その他参考にした記事
Kubernetes: 構成コンポーネント一覧 - Qiita
Kubernetesで監視を行う際の注意点 - Qiita
Dockerコンテナのメトリクスを監視する
Datadog で Docker コンテナをモニタリングする - Qiita
CPU使用率は間違っている | Yakst