12.4. 仮想マシンのカスタムメトリクスの公開
OpenShift Container Platform には、コアプラットフォームコンポーネントのモニタリングを提供する事前に設定され、事前にインストールされた自己更新型のモニタリングスタックが含まれます。このモニタリングスタックは、Prometheus モニタリングシステムをベースにしています。Prometheus は Time Series を使用するデータベースであり、メトリクスのルール評価エンジンです。
OpenShift Container Platform モニタリングスタックの使用のほかに、CLI を使用してユーザー定義プロジェクトのモニタリングを有効にし、node-exporter
サービスで仮想マシン用に公開されるカスタムメトリックをクエリーできます。
12.4.1. ノードエクスポーターサービスの設定
node-exporter エージェントは、メトリクスを収集するクラスター内のすべての仮想マシンにデプロイされます。node-exporter エージェントをサービスとして設定し、仮想マシンに関連付けられた内部メトリクスおよびプロセスを公開します。
前提条件
-
OpenShift Container Platform CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてクラスターにログインしている。 -
cluster-monitoring-config
ConfigMap
オブジェクトをopenshift-monitoring
プロジェクトに作成する。 -
enableUserWorkload
をtrue
に設定して、user-workload-monitoring-config
ConfigMap
オブジェクトをopenshift-user-workload-monitoring
プロジェクトに設定する。
手順
Service
YAML ファイルを作成します。以下の例では、このファイルはnode-exporter-service.yaml
という名前です。kind: Service apiVersion: v1 metadata: name: node-exporter-service 1 namespace: dynamation 2 labels: servicetype: metrics 3 spec: ports: - name: exmet 4 protocol: TCP port: 9100 5 targetPort: 9100 6 type: ClusterIP selector: monitor: metrics 7
- 1
- 仮想マシンからメトリクスを公開する node-exporter サービス。
- 2
- サービスが作成される namespace。
- 3
- サービスのラベル。
ServiceMonitor
はこのラベルを使用してこのサービスを照会します。 - 4
ClusterIP
サービスのポート 9100 でメトリクスを公開するポートに指定された名前。- 5
- リクエストをリッスンするために
node-exporter-service
によって使用されるターゲットポート。 - 6
monitor
ラベルが設定された仮想マシンの TCP ポート番号。- 7
- 仮想マシンの Pod を照会するために使用されるラベル。この例では、ラベル
monitor
のある仮想マシンの Pod と、metrics
の値がマッチします。
node-exporter サービスを作成します。
$ oc create -f node-exporter-service.yaml
12.4.2. ノードエクスポーターサービスが設定された仮想マシンの設定
node-exporter
ファイルを仮想マシンにダウンロードします。次に、仮想マシンの起動時に node-exporter サービスを実行する systemd
サービスを作成します。
前提条件
-
コンポーネントの Pod は
openshift-user-workload-monitoring
プロジェクトで実行されます。 -
このユーザー定義プロジェクトをモニターする必要のあるユーザーに
monitoring-edit
ロールを付与します。
手順
- 仮想マシンにログインします。
node-exporter
ファイルのバージョンに適用されるディレクトリーパスを使用して、node-exporter
ファイルを仮想マシンにダウンロードします。$ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
実行ファイルを展開して、
/usr/bin
ディレクトリーに配置します。$ sudo tar xvf node_exporter-1.3.1.linux-amd64.tar.gz \ --directory /usr/bin --strip 1 "*/node_exporter"
ディレクトリーのパス
/etc/systemd/system
にnode_exporter.service
ファイルを作成します。このsystemd
サービスファイルは、仮想マシンの再起動時に node-exporter サービスを実行します。[Unit] Description=Prometheus Metrics Exporter After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root ExecStart=/usr/bin/node_exporter [Install] WantedBy=multi-user.target
systemd
サービスを有効にし、起動します。$ sudo systemctl enable node_exporter.service $ sudo systemctl start node_exporter.service
検証
node-exporter エージェントが仮想マシンからのメトリクスを報告していることを確認します。
$ curl http://localhost:9100/metrics
出力例
go_gc_duration_seconds{quantile="0"} 1.5244e-05 go_gc_duration_seconds{quantile="0.25"} 3.0449e-05 go_gc_duration_seconds{quantile="0.5"} 3.7913e-05
12.4.3. 仮想マシンのカスタムモニタリングラベルの作成
単一サービスから複数の仮想マシンに対するクエリーを有効にするには、仮想マシンの YAML ファイルにカスタムラベルを追加します。
前提条件
-
OpenShift Container Platform CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 - 仮想マシンを停止および再起動するための Web コンソールへのアクセス権限がある。
手順
仮想マシン設定ファイルの
template
spec を編集します。この例では、ラベルmonitor
の値がmetrics
になります。spec: template: metadata: labels: monitor: metrics
-
仮想マシンを停止して再起動し、
monitor
ラベルに指定されたラベル名を持つ新しい Pod を作成します。
12.4.3.1. メトリクスを取得するための node-exporter サービスのクエリー
仮想マシンのメトリクスは、/metrics
の正規名の下に HTTP サービスエンドポイント経由で公開されます。メトリクスのクエリー時に、Prometheus は仮想マシンによって公開されるメトリクスエンドポイントからメトリクスを直接収集し、これらのメトリクスを確認用に表示します。
前提条件
-
cluster-admin
権限を持つユーザーまたはmonitoring-edit
ロールを持つユーザーとしてクラスターにアクセスできる。 - node-exporter サービスを設定して、ユーザー定義プロジェクトのモニタリングを有効にしている。
手順
サービスの namespace を指定して、HTTP サービスエンドポイントを取得します。
$ oc get service -n <namespace> <node-exporter-service>
node-exporter サービスの利用可能なすべてのメトリクスを一覧表示するには、
metrics
リソースをクエリーします。$ curl http://<172.30.226.162:9100>/metrics | grep -vE "^#|^$"
出力例
node_arp_entries{device="eth0"} 1 node_boot_time_seconds 1.643153218e+09 node_context_switches_total 4.4938158e+07 node_cooling_device_cur_state{name="0",type="Processor"} 0 node_cooling_device_max_state{name="0",type="Processor"} 0 node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0 node_cpu_guest_seconds_total{cpu="0",mode="user"} 0 node_cpu_seconds_total{cpu="0",mode="idle"} 1.10586485e+06 node_cpu_seconds_total{cpu="0",mode="iowait"} 37.61 node_cpu_seconds_total{cpu="0",mode="irq"} 233.91 node_cpu_seconds_total{cpu="0",mode="nice"} 551.47 node_cpu_seconds_total{cpu="0",mode="softirq"} 87.3 node_cpu_seconds_total{cpu="0",mode="steal"} 86.12 node_cpu_seconds_total{cpu="0",mode="system"} 464.15 node_cpu_seconds_total{cpu="0",mode="user"} 1075.2 node_disk_discard_time_seconds_total{device="vda"} 0 node_disk_discard_time_seconds_total{device="vdb"} 0 node_disk_discarded_sectors_total{device="vda"} 0 node_disk_discarded_sectors_total{device="vdb"} 0 node_disk_discards_completed_total{device="vda"} 0 node_disk_discards_completed_total{device="vdb"} 0 node_disk_discards_merged_total{device="vda"} 0 node_disk_discards_merged_total{device="vdb"} 0 node_disk_info{device="vda",major="252",minor="0"} 1 node_disk_info{device="vdb",major="252",minor="16"} 1 node_disk_io_now{device="vda"} 0 node_disk_io_now{device="vdb"} 0 node_disk_io_time_seconds_total{device="vda"} 174 node_disk_io_time_seconds_total{device="vdb"} 0.054 node_disk_io_time_weighted_seconds_total{device="vda"} 259.79200000000003 node_disk_io_time_weighted_seconds_total{device="vdb"} 0.039 node_disk_read_bytes_total{device="vda"} 3.71867136e+08 node_disk_read_bytes_total{device="vdb"} 366592 node_disk_read_time_seconds_total{device="vda"} 19.128 node_disk_read_time_seconds_total{device="vdb"} 0.039 node_disk_reads_completed_total{device="vda"} 5619 node_disk_reads_completed_total{device="vdb"} 96 node_disk_reads_merged_total{device="vda"} 5 node_disk_reads_merged_total{device="vdb"} 0 node_disk_write_time_seconds_total{device="vda"} 240.66400000000002 node_disk_write_time_seconds_total{device="vdb"} 0 node_disk_writes_completed_total{device="vda"} 71584 node_disk_writes_completed_total{device="vdb"} 0 node_disk_writes_merged_total{device="vda"} 19761 node_disk_writes_merged_total{device="vdb"} 0 node_disk_written_bytes_total{device="vda"} 2.007924224e+09 node_disk_written_bytes_total{device="vdb"} 0
12.4.4. ノードエクスポーターサービスの ServiceMonitor リソースの作成
Prometheus クライアントライブラリーを使用し、/metrics
エンドポイントからメトリクスを収集して、node-exporter サービスが公開するメトリクスにアクセスし、表示できます。ServiceMonitor
カスタムリソース定義 (CRD) を使用して、ノードエクスポーターサービスをモニターします。
前提条件
-
cluster-admin
権限を持つユーザーまたはmonitoring-edit
ロールを持つユーザーとしてクラスターにアクセスできる。 - node-exporter サービスを設定して、ユーザー定義プロジェクトのモニタリングを有効にしている。
手順
ServiceMonitor
リソース設定の YAML ファイルを作成します。この例では、サービスモニターはラベルmetrics
が指定されたサービスとマッチし、30 秒ごとにexmet
ポートをクエリーします。apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: k8s-app: node-exporter-metrics-monitor name: node-exporter-metrics-monitor 1 namespace: dynamation 2 spec: endpoints: - interval: 30s 3 port: exmet 4 scheme: http selector: matchLabels: servicetype: metrics
node-exporter サービスの
ServiceMonitor
設定を作成します。$ oc create -f node-exporter-metrics-monitor.yaml
12.4.4.1. クラスター外のノードエクスポーターサービスへのアクセス
クラスター外の node-exporter サービスにアクセスし、公開されるメトリクスを表示できます。
前提条件
-
cluster-admin
権限を持つユーザーまたはmonitoring-edit
ロールを持つユーザーとしてクラスターにアクセスできる。 - node-exporter サービスを設定して、ユーザー定義プロジェクトのモニタリングを有効にしている。
手順
node-exporter サービスを公開します。
$ oc expose service -n <namespace> <node_exporter_service_name>
ルートの FQDN(完全修飾ドメイン名) を取得します。
$ oc get route -o=custom-columns=NAME:.metadata.name,DNS:.spec.host
出力例
NAME DNS node-exporter-service node-exporter-service-dynamation.apps.cluster.example.org
curl
コマンドを使用して、node-exporter サービスのメトリクスを表示します。$ curl -s http://node-exporter-service-dynamation.apps.cluster.example.org/metrics
出力例
go_gc_duration_seconds{quantile="0"} 1.5382e-05 go_gc_duration_seconds{quantile="0.25"} 3.1163e-05 go_gc_duration_seconds{quantile="0.5"} 3.8546e-05 go_gc_duration_seconds{quantile="0.75"} 4.9139e-05 go_gc_duration_seconds{quantile="1"} 0.000189423