|
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 のステータスを表示できます。 |