Prometheus で特定のコンテナのメモリ使用率を監視する方法
タイトル通り、Kubernetes クラスタ上で特定のコンテナのメモリ使用率を監視する方法が調べてもすぐに出てこなかったので、まとめます。記事ではメモリを監視対象としていますが、同様の方法で CPU 使用率も監視できると思います(未検証)。
結論
container_memory_working_set_bytes{container="container-name"} / on (pod) kube_pod_container_resource_limits{container="container-name", resource="memory"}
特定のコンテナのメモリ使用量の監視
コンテナのメモリ使用量は、Kubernetes が提供しているcontainer_memory_working_set_bytes
メトリクスから取得できます(公式ドキュメント)。今回のように、特定のコンテナのメモリ使用量を取得したい場合、次の PromQL expression を用います。
container_memory_working_set_bytes{container="container-name"}
特定のコンテナのメモリ上限の監視
Kubernetes では、特定のコンテナのメモリ上限は Resource Limit と呼ばれる設定を使って指定します。例えば、次のように YAML ファイルを記述すると、app
コンテナには 128 MiB のメモリ使用量の上限が課されます。詳しくは公式ドキュメントの「コンテナのリソース管理」を参照してください。
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: some-image
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
自分の知る限り、 Kubernetes 本体のメトリクスはコンテナ単位の Resource Limit を返す API を提供していません(Pod 単位ならkube_pod_resource_limit
メトリクスが使用できます)。もちろん Kubernetes の設定ファイルを見て、各コンテナ Resource Limit を PromQL にハードコーディングしてもよいですが、できれば避けたいところです。
特定のコンテナの Resource Limit を取得するには、kube-state-metrics がエクスポートしているkube_pod_container_resource_limits
メトリクスを使用できます(kube-state-metrics のドキュメント)。
次の PromQL の expression を用いることで Prometheus から特定のコンテナのメモリ使用量を取得できます。
kube_pod_container_resource_limits{container="container-name", resource="memory"}
メモリ使用率
メモリ使用量をメモリ上限で割ることでメモリ使用率が計算できます。アラートにかける場合は 100 倍してパーセント表記にしたほうが通知メッセージへ埋め込む際に読みやすいかもしれません。
上述の通り、以下の expression は同じコンテナが複数の Pod で稼働している場合の例です。この場合、container_memory_working_set_bytes
およびkube_pod_container_resource_limits
が vector を返すため、でどのラベルを軸に除算をするかon (pod)
などで指定してあげる必要があります。
container_memory_working_set_bytes{container="container-name"} / on (pod) kube_pod_container_resource_limits{container="container-name", resource="memory"}
Discussion