はじめに
Kubernetesで、パフォーマンスやキャパシティの監視を行う際、Prometheusなどを使い各種メトリクスを収集しGrafanaなどでグラフ化している人も多いのではないでしょうか。
本ドキュメントでは、KuberntesにてPV(Persistent Volume)を利用する際、モニタリングにて利用できるストレージ関連のメトリクスを紹介します。
※ Kubernetes 1.17.3, Node exporter 0.18.1時点のメトリクスになります。
PVのマウントと監視範囲
PVがどのようにマウントされているのかを一例を用いて説明します。
以下の図は、外部ストレージから提供されているiSCSI VolumeがPod内のコンテナのディレクトリにマウントされるまでの、各デバイスファイルとディレクトリのマウントについて示しています。
まず、外部ストレージにより提供されたVolumeは、ベアメタルのサーバと同じくNode上のデバイス(この例では/dev/sdb
)にマッピングされ、その後、kubeletにて管理されているディレクトリ(/var/lib/kubelet/pods
配下)にマウントされます。
次に、kubeletによりPod内のコンテナにマッピングされた後、ディレクトリ(この例では/mnt/data
)にマウントされます。
どのようにマウントされているのかを理解することが、PVの監視では重要となります。
PVの監視では、メトリクスの収集元となるExporter/Serviceがどのデバイス・ディレクトリ(およびFileSystem)を監視しているかを理解する必要があります。
例えば、コンテナの監視を行うcAdvisorは、上記図のPod内のデバイス(/dev/sda
)およびその上に作られているFileSystem(この例だと/mnt/data
がFileSystemのRoot)が監視の範囲となります。kubeletは、kubeletが把握しているディレクトリ(/var/lib/kubelet/pods
配下)が監視の範囲となります。Nodeのリソースを監視するNode exporterはNodeのリソースとして見える全てのデバイス・ディレクトリが監視の範囲となります。
ストレージ関連のメトリクス一覧
以下に、ストレージ関連のメトリクスを示します。
メトリクス | 説明 | Exporter/Service |
---|---|---|
container_file_descriptors | オープンしているファイルディスクリプタ数 | cAdvisor |
container_fs_inodes_free | フリーのinode数 | cAdvisor |
container_fs_inodes_total | inodeのトータル数 | cAdvisor |
container_fs_io_current | 実行中のIO数 | cadvisor |
container_fs_io_time_seconds_total | IOに費やされた時間の合計値 | cAdvisor |
container_fs_io_time_weighted_seconds_total | IOに費やされた加重秒数の合計値 | cAdvisor |
container_fs_limit_bytes | このFileSystem上のコンテナが消費できるバイト数 | cAdvisor |
container_fs_read_seconds_total | readに費やした秒数の合計値 | cAdvisor |
container_fs_reads_bytes_total | readされたbyte数の合計値 | cAdvisor |
container_fs_reads_merged_total | マージされたread数の合計値 | cAdvisor |
container_fs_reads_total | 完了したread数の合計値 | cAdvisor |
container_fs_sector_reads_total | 完了したセクターのread数の合計値 | cAdvisor |
container_fs_sector_writes_total | 完了したセクターのwrite数の合計値 | cAdvisor |
container_fs_usage_bytes | FileSystem上のコンテナによって消費されるバイト数 | cAdvisor |
container_fs_write_seconds_total | writeに費やした秒数の合計値 | cAdvisor |
container_fs_writes_bytes_total | writeされたbyte数の合計値 | cAdvisor |
container_fs_writes_merged_total | マージされたwrite数の合計値 | cAdvisor |
container_fs_writes_total | 完了したwrite数の合計値 | cAdvisor |
kubelet_volume_stats_available_bytes | Volumeの空き容量(バイト) | kubelet |
kubelet_volume_stats_capacity_bytes | Volumeの容量(バイト) | kubelet |
kubelet_volume_stats_used_bytes | Volumeの使用済みバイト数 | kubelet |
kubelet_volume_stats_inodes | Volumeのinode数 | kubelet |
kubelet_volume_stats_inodes_free | Volumeの空きinode数 | kubelet |
kubelet_volume_stats_inodes_used | Volumeの使用済みinode数 | kubelet |
storage_operation_duration_seconds_bucket | ストレージ操作時間 | kubelet |
storage_operation_duration_seconds_count | ストレージ操作時間の数 | kubelet |
storage_operation_duration_seconds_sum | ストレージ操作時間の合計 | kubelet |
storage_operation_errors_total | ストレージ操作のエラー回数 | kubelet |
storage_operation_status_count | ストレージ操作のステータスの回数 | kubelet |
volume_manager_total_volumes | Volume Managerのボリュームの数 | kubelet |
node_disk_io_time_seconds_total | IOに費やされた時間の合計値 | Node exporter |
node_disk_io_time_weighted_seconds_total | IOに費やされた加重秒数の合計値 | Node exporter |
node_disk_read_bytes_total | readされたbyte数の合計値 | Node exporter |
node_disk_read_time_seconds_total | readに費やした秒数の合計値 | Node exporter |
node_disk_reads_completed_total | 正常に完了したreadの合計値 | Node exporter |
node_disk_reads_marged_total | マージされたread数の合計値 | Node exporter |
node_disk_write_time_seconds_total | writeに費やした秒数の合計値 | Node exporter |
node_disk_writes_completed_total | 正常に完了したwrite数の合計値 | Node exporter |
node_disk_writes_merged_total | マージされたwrite数の合計値 | Node exporter |
node_disk_written_bytes_total | writeされたbyte数の合計値 | Node exporter |
node_filefd_allocated | 割り当てられたファイルデスクリプタ数 | Node exporter |
node_filefd_maximum | ファイルディスクリプタの統計: 最大数 | Node exporter |
node_filesystem_avail_bytes | non-rootユーザが利用できるFileSystemの容量(バイト) | Node exporter |
node_filesystem_device_error | 特定のデバイスの統計を取得中にエラーが発生したか否か | Node exporter |
node_filesystem_files | FileSystemのファイルノードの合計 | Node exporter |
node_filesystem_files_free | FileSystemの空きファイルノードの合計 | Node exporter |
node_filesystem_free_bytes | FileSystemの空き容量(バイト) | Node exporter |
node_filesystem_readonly | FileSystemのRead Onlyのステータス | Node exporter |
node_filesystem_size_bytes | FileSystemの容量(バイト) | Node exporter |
node_nfs_packets_total | プロトコル毎(TCP,UDP)のNFSのパケット数の合計値 | Node exporter |
node_nfs_requests_total | 呼び出されたNFSプロシージャの合計値 | Node exporter |
node_nfs_rpc_authentication_refreshes_total | NFSで実行されたRPC認証の更新数の合計値 | Node exporter |
node_nfs_rpc_retransmissions_total | NFSで実行されたRPC送信の合計値 | Node exporter |
node_nfs_rpcs_total | NFSで実行されたRPCの合計値 | Node exporter |
※ storage_operation_XXX にはリソースを問わずストレージ操作のものが含まれます。つまりConfigmapやSecretといったリソースをPodにマウントするケースも含まれます。
感想
cAdvisor, kubelet, Node exporterにて取得できるストレージ関連のメトリクスをまとめました。一覧表をみてわかるように同じ意味のメトリクスが多々あります。キャパシティの観点でみると、外部ストレージ上のFileSystem(e.g.ext4
)がそのままNodeからPodまで多段にマウントされているだけで、容量が変わることはないと思います。一方、パフォーマンスの観点では、どのExporter/Serviceからメトリクスを取得しているかで差が出ることがあります。
Node単位でストレージの性能を監視しNodeの性能プランニングをしたいのか、Pod単位でストレージの性能を監視し、PodをどのNodeに配置するかも含めてプランニングしたいのか等々どのような目的で監視するかにより監視すべきメトリクスが変わってくるかと思います。適切なメトリクスを使って有益な監視を実現していきましょう。
なお、今回は外部ストレージのメトリクスは扱いませんでした。外部ストレージのメトリクスについては、各ストレージのドキュメントをご参照ください。