DUICUO

監視メトリックを収集するには、Prometheus の代わりに Vmagent を使用します。

vmagent を使用すると、さまざまなソースからメトリックを収集し、それらを VM またはリモート書き込みプロトコルをサポートするその他の Prometheus 互換ストレージ システムに保存できます。

特性

Prometheusと比較して、vmagentはメトリクスのスクレイピングにおいてより柔軟性があります。例えば、メトリクスのプルに加えてプッシュも可能で、その他にも多くの機能を備えています。

  • Prometheusのスクレイピングターゲットを置き換えることができます。
  • Kafka からのデータの読み取りと書き込みをサポートします。
  • Prometheus の再ラベル付けパターンに基づいてラベルの追加、削除、変更をサポートし、リモート ストレージに送信する前にデータをフィルタリングできます。
  • Influx ライン プロトコル、Graphite テキスト プロトコル、OpenTSDB プロトコル、Prometheus リモート書き込みプロトコル、JSON ライン プロトコル、CSV データなど、複数のデータ プロトコルをサポートしています。
  • 複数のリモート ストレージ システムへのデータの収集とレプリケーションをサポートします。
  • 信頼性の低いリモートストレージをサポートします。リモートストレージが利用できない場合、収集されたメトリックは -remoteWrite.tmpDataPath にバッファリングされます。リモートストレージへの接続が回復すると、バッファリングされたメトリックはリモートストレージに送信されます。バッファリングの最大ディスク使用量は、-remoteWrite.maxDiskUsagePerURL によって制限できます。
  • Prometheus と比較すると、メモリ、CPU、ディスク I/O、ネットワーク帯域幅の使用量が少なくなります。
  • 多数のターゲットをクロールする必要がある場合、クロールされたターゲットを複数の vmagent インスタンスに分散できます。
  • 高いカーディナリティと高いチャーンには、一意の時系列を取得してリモート ストレージ システムに送信する前に、その数を制限することで対処できます。
  • スクレイプ構成は複数のファイルから読み込むことができます。

展開する

次に、Kubernetes クラスターのメトリクスのキャプチャを例に、vmagent の使い方を説明します。ここでは、設定に自動検出を使用します。vmagent は Prometheus の kubernetes_sd_configs 設定と互換性があるため、こちらも使用できます。

vmagent が監視対象リソースオブジェクトを自動検出できるようにするには、APIServer にアクセスしてリソースオブジェクトを取得する必要があります。そのため、まず RBAC 権限を設定し、以下に示すようにリソースリストを作成する必要があります。

 # vmagent-rbac .yaml
apiバージョン: v1
種類: サービスアカウント
メタデータ
名前: vmagent
名前空間: kube-vm
---
apiバージョン: rbac .authorization .k8s .io / v1
種類: ClusterRole
メタデータ
名前: vmagent
ルール
- apiGroups : [ "" , "networking.k8s.io" , "拡張機能" ]
リソース
- ノード
- ノード/ メトリック
サービス
- エンドポイント
- エンドポイントスライス
- ポッド
- アプリ
- 入口
動詞:[ 「取得する」「リストする」「見る」 ]
- apiグループ: [ "" ]
リソース
- 名前空間
- 構成マップ
動詞:[ 「得る」 ]
- 非リソースURL : [ "/metrics" , "/metrics/resources" ]
動詞:[ 「得る」 ]
---
apiバージョン: rbac .authorization .k8s .io / v1
種類: ClusterRoleBinding
メタデータ
名前: vmagent
ロールリファレンス:
apiGroup : rbac .authorization .k8s .io
種類: ClusterRole
名前: vmagent
科目
- 種類: サービスアカウント
名前: vmagent
名前空間: kube-vm

次に、vmagent の設定を追加します。今回は、Kubernetes ノードを自動検出するタスクのみを設定します。以下の ConfigMap オブジェクトを作成します。

 # vmagent-config .yaml
apiバージョン: v1
種類: ConfigMap
メタデータ
名前: vmagent-config
名前空間: kube-vm
データ
scrape.yml : |
グローバル:
scrape_interval : 15秒
scrape_timeout : 15秒

scrape_configs :
- job_name : ノード
kubernetes_sd_configs :
- 役割: ノード
再ラベル設定:
- ソースラベル: [ __address__ ]
正規表現: "(.*):10250"
置換: "${1}:9111"
ターゲットラベル: __アドレス__
アクション: 置換
- アクション: ラベルマップ
正規表現: __meta_kubernetes_node_label_ (.+)

ここでは、Kubernetesノードを自動検出することでノード監視メトリクスを取得します。ノードロールの自動検出ではデフォルトでポート10250が取得されることに注意してください。これをrelabelを使用してポート9111に置き換える必要があります。

次に、以下に示すように、vmagent デプロイメント リソース マニフェストを追加します。

 # vmagent-deploy .yaml
apiバージョン: v1
種類: PersistentVolumeClaim
メタデータ
名前: vmagent-pvc
名前空間: kube-vm
仕様:
アクセスモード:
- 一度だけ読み書き可能
リソース
リクエスト:
ストレージ: 1Gi
ストレージクラス名: nfs-client
---
apiバージョン: アプリ/ v1
種類: デプロイメント
メタデータ
名前: vmagent
名前空間: kube-vm
ラベル:
アプリ: vmagent
仕様:
セレクター:
マッチラベル
アプリ: vmagent
テンプレート
メタデータ
ラベル:
アプリ: vmagent
仕様:
サービスアカウント名: vmagent
コンテナ
- 名前: エージェント
画像: "victoriametrics/vmagent:v1.77.0"
imagePullPolicy : IfNotPresent
引数:
- - promscrape.config = /config/scrape.yml
- - リモート書き込み.tmpDataPath =/ tmpData
--remoteWrite .url = http :// vminsert : 8480 / 挿入/ 0 / プロメテウス
--envflag.enable = true
--envflag.prefix = VM_
--loggerFormat = json
ポート:
- 名前: http
コンテナポート: 8429
ボリュームマウント:
- 名前: tmpdata
マウントパス: / tmpData
- 名前: 設定
マウントパス: / config
巻数:
- 名前: tmpdata
永続ボリュームクレーム:
クレーム名: vmagent-pvc
- 名前: 設定
構成マップ:
名前: vmagent-config

ConfigMap を介して、vmagent の設定をコンテナの /config/scrape.yml にマウントします。また、前述の vminsert サービスである `-remoteWrite.url=http://vminsert:8480/insert/0/prometheus` を使用して、リモート書き込みアドレスを指定します。もう 1 つのパラメータ `-remoteWrite.tmpDataPath` は、リモートストレージが利用できない場合に収集されたメトリックをキャッシュするために使用されます。リモートストレージが復旧すると、キャッシュされたメトリックは通常どおりリモート書き込みサーバーに送信されるので、このディレクトリを永続化しておくことをお勧めします。

クラスターモード

1 つの vmagent インスタンスで数万のターゲットをスクレイピングできますが、CPU、ネットワーク、メモリなどの制限により、この数では不十分な場合があります。このような場合、スクレイピング対象を複数の vmagent インスタンスに分割できます。クラスタ内の各 vmagent インスタンスは、異なる `-promscrape.config` 設定ファイルを使用する必要があります。`-promscrape.cluster.memberNum` 値は 0 ~ N-1 の範囲でなければなりません。ここで、N はクラスタ内の vmagent インスタンスの数です。クラスタ内の vmagent インスタンスの数は、`-promscrape.cluster.membersCount` コマンドラインフラグに渡す必要があります。例えば、次のコマンドは、2 つの vmagent インスタンスのクラスタ全体にスクレイピング対象を伝播できます。

 vmagent - promscrape .cluster .membersCount = 2 - promscrape .cluster .memberNum = 0 - promscrape .config =/ path /config.yml ...
vmagent - promscrape .cluster .membersCount = 2 - promscrape .cluster .memberNum = 1 - promscrape .config =/ path /config.yml ...

vmagent が Kubernetes で実行されている場合、-promscrape.cluster.memberNum に StatefulSet ポッド名を設定できます。ポッド名は、0 から promscrape.cluster.memberNum-1 の範囲の数字で終わる必要があります(例: -promscrape.cluster.memberNum=vmagent-0)。

デフォルトでは、各クロールターゲットはクラスタ内の1つのvmagentインスタンスによってのみクロールされます。複数のvmagentインスタンスにクロールターゲットを複製する必要がある場合は、`-promscrape.cluster.replicationFactor`パラメータを使用して必要なレプリカ数を設定できます。例えば、次のコマンドは3つのvmagentインスタンスを持つクラスタを起動し、各ターゲットは2つのvmagentインスタンスによってクロールされます。

 vmagent - promscrape .cluster .membersCount = 3 - promscrape .cluster .replicationFactor = 2 - promscrape .cluster .memberNum = 0 - promscrape .config =/ path / to /config.yml ...
vmagent - promscrape .cluster .membersCount = 3 - promscrape .cluster .replicationFactor = 2 - promscrape .cluster .memberNum = 1 - promscrape .config =/ path / to / config.yml ...
vmagent - promscrape .cluster .membersCount = 3 - promscrape .cluster .replicationFactor = 2 - promscrape .cluster .memberNum = 2 - promscrape .config =/ path / to /config.yml ...

各ターゲットが複数の vmagent インスタンスによってクロールされる場合、-remoteWrite.url が指すリモート ストレージで重複排除を有効にする必要があることに注意することが重要です。

したがって、監視対象が非常に大きい場合は、StatefulSet アプローチを使用して展開できる vmagent クラスター モードを使用することをお勧めします。

 # vmagent-sts .yaml
apiバージョン: v1
種類: サービス
メタデータ
名前: vmagent
名前空間: kube-vm
注釈:
prometheus.io/scrape : " true "
プロメテウス.io / ポート: "8429"
仕様:
セレクター:
アプリ: vmagent
クラスターIP : なし
ポート:
- 名前: http
ポート: 8429
ターゲットポート: http
---
apiバージョン: アプリ/ v1
種類: ステートフルセット
メタデータ
名前: vmagent
名前空間: kube-vm
ラベル:
アプリ: vmagent
仕様:
レプリカ2
サービス名: vmagent
セレクター:
マッチラベル
アプリ: vmagent
テンプレート
メタデータ
ラベル:
アプリ: vmagent
仕様:
サービスアカウント名: vmagent
コンテナ
- 名前: エージェント
画像: victoriametrics / vmagent : v1.77.0
imagePullPolicy : IfNotPresent
引数:
- - promscrape.config = /config/scrape.yml
- - リモート書き込み.tmpDataPath =/ tmpData
- - promscrape .cluster .membersCount = 2
# - - promscrape.cluster.replicationFactor = 2 # これにより、レプリカの数を構成します
- - promscrape .cluster .memberNum =$( POD_NAME )
--remoteWrite .url = http :// vminsert : 8480 / 挿入/ 0 / プロメテウス
--envflag.enable = true
--envflag.prefix = VM_
--loggerFormat = json
ポート:
- 名前: http
コンテナポート: 8429
環境:
- 名前: POD_NAME
値の開始値:
フィールド参照:
fieldPath : メタデータ.name
ボリュームマウント:
- 名前: tmpdata
マウントパス: / tmpData
- 名前: 設定
マウントパス: / config
巻数:
- 名前: 設定
構成マップ:
名前: vmagent-config
ボリュームクレームテンプレート
- メタデータ:
名前: tmpdata
仕様:
アクセスモード:
- 一度だけ読み書き可能
ストレージクラス名: nfs-client
リソース
リクエスト:
ストレージ: 1Gi

ここでは、StatefulSet を使用して vmagent を管理し、上記のリソースを直接適用できます。

 #まず、前の例のPrometheus を停止します ☸ ➜ kubectl scale deploy prometheus --replicas = 0 -n kube-vm
☸ ➜ kubectl apply -f vmagent -rbac .yaml
☸ ➜ kubectl apply -f vmagent -config .yaml
☸ ➜ kubectl apply -f vmagent -sts .yaml
☸ ➜ kubectl ポッドを取得- n kube-vm - l app = vmagent
名前準備完了ステータス再起動年齢
vmagent-0 1 / 1 実行中0 3分43秒
vmagent-1 1 / 1 実行中0 2分9秒

ここでは、監視メトリックをキャプチャするために 2 つの vmagent インスタンスをデプロイし、合計 3 つのノードを作成しました。

 ☸ ➜ kubectl ノードを取得する
名前ステータス役割年齢バージョン
master1 コントロールプレーン準備完了マスター44d v1 .22.8
node1 準備完了< なし> 44d v1 .22.8
node2 準備完了< なし> 44d v1 .22.8

したがって、2 つの vmagent インスタンスはそれぞれいくつかのメトリックを収集し、ログをチェックすることで確認できます。

 ☸ ➜ kubectl ログ-f vmagent -0 -n kube -vm
# ……
{ "ts" : "2022-05-10T04:44:44.004Z""level" : "info""caller" : "VictoriaMetrics/lib/promscrape/scraper.go:393""msg" : "static_configs: 追加されたターゲット: 1、削除されたターゲット: 0; 合計ターゲット: 1" }
{ "ts" : "2022-05-10T04:44:44.006Z""level" : "info""caller" : "VictoriaMetrics/lib/promscrape/scraper.go:393""msg" : "kubernetes_sd_configs: 追加されたターゲット: 2、削除されたターゲット: 0; 合計ターゲット: 2" }
☸ ➜ kubectl ログ-f vmagent -1 -n kube -vm
# ……
{ "ts" : "2022-05-10T04:46:17.893Z""level" : "info""caller" : "VictoriaMetrics/lib/promscrape/scraper.go:393""msg" : "kubernetes_sd_configs: 追加されたターゲット: 1、削除されたターゲット: 0; 合計ターゲット: 1" }

ログには、vmagent-0 インスタンスが 2 つのターゲットを見つけ、vmagent-1 インスタンスが 1 つのターゲットを見つけたことが示されており、これは予想どおりです。

次に、次の構成に示すように、API サーバーやコンテナなどの他のコンポーネントの監視を追加します。

 # vmagent-config2 .yaml
apiバージョン: v1
種類: ConfigMap
メタデータ
名前: vmagent-config
名前空間: kube-vm
データ
scrape.yml : |
グローバル:
scrape_interval : 15秒
scrape_timeout : 15秒

scrape_configs :

- job_name : ノード
kubernetes_sd_configs :
- 役割: ノード
再ラベル設定:
- ソースラベル: [ __address__ ]
正規表現: "(.*):10250"
置換: "${1}:9111"
ターゲットラベル: __アドレス__
アクション: 置換
- アクション: ラベルマップ
正規表現: __meta_kubernetes_node_label_ (.+)

- ジョブ名: apiserver
スキームhttps
ベアラートークンファイル: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config :
ca_file : /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
安全でないスキップ検証: true
kubernetes_sd_configs :
- 役割: エンドポイント
再ラベル設定:
- アクション維持
正規表現: デフォルト; kubernetes ; https
ソースラベル:
- __meta_kubernetes_namespace
- __meta_kubernetes_サービス名
- __meta_kubernetes_endpoint_port_name

- ジョブ名: cadvisor
ベアラートークンファイル: /var/run/secrets/kubernetes.io/serviceaccount/token
スキームhttps
tls_config :
ca_file : /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
安全でないスキップ検証: true
kubernetes_sd_configs :
- 役割: ノード
再ラベル設定:
- アクション: ラベルマップ
正規表現: __meta_kubernetes_node_label_ (.+)
- 置換: / metrics / cadvisor
ターゲットラベル: __metrics_path__

- job_name : エンドポイント
kubernetes_sd_configs :
- 役割: エンドポイント
再ラベル設定:
- アクションドロップ
正規表現: true
ソースラベル:
- __meta_kubernetes_pod_container_init
- アクション: keep_if_equal
ソースラベル:
- __meta_kubernetes_service_annotation_prometheus_io_port
- __meta_kubernetes_pod_container_port_number
- アクション維持
正規表現: true
ソースラベル:
- __meta_kubernetes_service_annotation_prometheus_io_scrape
- アクション: 置換
正規表現: ( https ?)
ソースラベル:
- __meta_kubernetes_service_annotation_prometheus_io_scheme
ターゲットラベル: __scheme__
- アクション: 置換
正規表現: (.+)
ソースラベル:
- __meta_kubernetes_service_annotation_prometheus_io_path
ターゲットラベル: __metrics_path__
- アクション: 置換
正規表現: ([^:]+)(?:: \d +)?;( \d +)
交換:$ 1 :$ 2
ソースラベル:
- __住所__
- __meta_kubernetes_service_annotation_prometheus_io_port
ターゲットラベル: __アドレス__
- アクション: ラベルマップ
正規表現: __meta_kubernetes_service_label_ (.+)
- ソースラベル:
- __meta_kubernetes_pod_name
ターゲットラベル: ポッド
- ソースラベル:
- __meta_kubernetes_namespace
target_label : 名前空間
- ソースラベル:
- __meta_kubernetes_サービス名
target_label : サービス
- 置換: $ {1}
ソースラベル:
- __meta_kubernetes_サービス名
target_label : ジョブ
- アクション: 置換
ソースラベル:
- __meta_kubernetes_pod_node_name
target_label : ノード

設定の大部分は、前のPrometheusの章で紹介されています。中核となるのは、relabel_configsを介してクロールタスクを制御することです。vmagentは従来のPrometheusの再ラベル付けルールと互換性がありますが、独自のアクションもいくつか備えています。例えば、上記の設定ではkeep_if_equalオペレーションを使用しています。これは、指定されたラベル値が等しい場合、データが保持されることを意味します。

メトリックに同じ値を持つラベルが2つ含まれている場合、そのメトリックを削除する必要があります。これは、vmagent がサポートする `drop_if_equal` オペレーションを使用して実行できます。例えば、次のラベル変更ルールで `real_port` と `required_port` に同じラベル値が含まれている場合、メトリックは削除されます。

 - アクション: drop_if_equal
ソースラベル: [ 実際のポート必要なポート]

このルールは、次のメトリックを削除します: foo{real_port="123",needed_port="123"}、次のメトリックは保持されます: foo{real_port="123",needed_port="456"}。

場合によっては、メトリクスのサブセットのみに再ラベル付けを適用する必要があることがあります。そのような場合は、`relabel_configs` ルールに `if` オプションを追加できます。例えば、次のルールは、シーケンスセレクター `metric{label=~"x|y"}` に一致するメトリクスにのみラベル `{foo="bar"}` を追加します。

 - if : 'metric{label=~"x|y"}'
ターゲットラベル: "foo"
置換「バー」

`if` オプションを使用すると、従来の `relabel_configs` ルールを簡素化できます。例えば、次のルールは `foo{bar="baz"}` シーケンスセレクタに一致するメトリクスを削除できます。

 - if : 'foo{bar="baz"}'
アクションドロップ

これは次の従来のルールと同等です。

 - アクションドロップ
ソースラベル: [ __name__ , bar ]
正規表現: "foo;baz"

ただし、Prometheus はまだ if オプションをサポートしておらず、現在は VictoriaMetrics のみをサポートしていることに注意してください。

次に、vmagent 構成を更新します。

 ☸ ➜ kubectl apply -f vmagent -config2 .yaml

構成を更新するには、次の 2 つの方法があります。

  • SUGHUP 信号を vmagent プロセスに送信します。
  • http://vmagent:8429/-/reload に HTTP リクエストを送信します。

リフレッシュ後、上記のメトリクスの収集を開始できます。同様に、http://vmselect/select/0/vmui/ から VMUI にアクセスできます。例えば、ポッドのメモリ使用量を照会するには、次のクエリを使用します。

 合計( container_memory_working_set_bytes { image ! = "" }) by ( namespace , pod ) / 合計( container_spec_memory_limit_bytes { image ! = "" }) by ( namespace , pod ) * 100 ! = + inf 

メトリクス収集に不可欠なコンポーネントであるvmagentの監視は不可欠です。vmagentはhttp://vmagent:8429/metricsを通じて、vmagent_remotewrite_conns(リモートストレージ接続)やvm_allowed_memory_bytes(使用可能なメモリサイズ)など、多くのメトリクスを公開しています。私たちはいくつかの重要なメトリクスを収集し、Grafanaを使用して可視化することで、vmagentの状態をより適切に分析しています。

https://grafana.com/grafana/dashboards/12683 を使用して、vmagent のステータスを表示できます。