この記事は、デプロイおよび保守されたKubernetesクラスターでPrometheusオペレーターの制御下でPrometheusがどのように機能するかを説明するDevOpsエンジニア向けの内部ドキュメントに基づいています。

一見、
プロメテウスはかなり複雑な製品のように見えますが、よく設計されたシステムのように、明示的な機能コンポーネントで構成され、本質的に3つのことのみを行います。時系列データ。 この記事は、Prometheus自体ではなく、このシステムをKubernetesと統合する方法について説明します。Kubernetesでは、
Prometheus Operatorというヘルパーツールを積極的に使用しています。 しかし、あなたはまだプロメテウス自体から始める必要があります...
プロメテウス:彼は何をしていますか?
したがって、プロメテウスの最初の2つの機能について詳しく説明すると、次のように機能します。
- 各監視ターゲット(target) 、各
scrape_interval
について、このターゲットに対してHTTP要求が作成されます。 応答として、メトリックは独自の形式で取得され、データベースに保存されます。 - 各
evaluation_interval
は、以下に基づいてルールを処理します。- またはアラートが送信され、
- または、新しいメトリックが(データベース内の自分自身に)書き込まれます(ルールの結果)。
プロメテウス:どのように構成されていますか?
Prometheusサーバーには、構成
ファイルと
ルールファイルがあります 。
configには次のセクションがあります。
プロメテウス:目標リストはどこから来たのですか?
プロメテウスの一般的なアルゴリズムは次のとおりです。

- Prometheusは、
scrape_configs
セクションを読み取り、それに応じて内部サービス検出メカニズムを構成します。 - Service DiscoveryメカニズムはKubernetes APIと対話します(主にエンドポイントを受信するため)。
- Kubernetesからのデータに基づいて、 Service Discoveryメカニズムはターゲット ( 目標のリスト)を更新します。
scrape_configs
は、
scrape_configs
(これはPrometheusの内部概念です)をリストします。それぞれは次のように定義されます:
scrape_configs: # - job_name: kube-prometheus/custom/0 # scrape job' # Service Discovery scrape_interval: 30s # scrape_timeout: 10s # metrics_path: /metrics # path, scheme: http # http https # Service Discovery kubernetes_sd_configs: # , targets Kubernetes - api_server: null # API- # ( ) role: endpoints # targets endpoints namespaces: names: # endpoints namespaces - foo - baz # "" ( enpoints , — ) "" # ( — ) relabel_configs: # prometheus_custom_target, # service, endpoint - source_labels: [__meta_kubernetes_service_label_prometheus_custom_target] regex: .+ # action: keep # - source_labels: [__meta_kubernetes_endpoint_port_name] regex: http-metrics # , http-metrics action: keep # job, prometheus_custom_target # service, "custom-" # # job — Prometheus. , # target targets, # , targets ( # rules dashboards) - source_labels: [__meta_kubernetes_service_label_prometheus_custom_target] regex: (.*) target_label: job replacement: custom-$1 action: replace # namespace - source_labels: [__meta_kubernetes_namespace] regex: (.*) target_label: namespace replacement: $1 action: replace # service - source_labels: [__meta_kubernetes_service_name] regex: (.*) target_label: service replacement: $1 action: replace # instance ( ) - source_labels: [__meta_kubernetes_pod_name] regex: (.*) target_label: instance replacement: $1 action: replace
したがって、プロメテウス自体は以下を追跡します。
- 囲炉裏の追加と削除( 囲炉裏を追加/削除すると、Kubernetesはエンドポイントを変更し、Prometheusはこれを確認して目標を追加/削除します);
- 指定された名前空間でサービス (より正確にはエンドポイント)を追加および削除します 。
次の場合、構成の
変更が必要です。
- 新しいスクレイプ構成を追加する必要があります(通常、これは監視が必要な新しい種類のサービスです)。
- 名前空間リストを変更する必要があります。
Prometheusの基本を取り扱ったので、クラスタリアリティでのPrometheusの展開と操作を簡素化するKubernetesの特別な補助コンポーネントである「演算子」に進みましょう。
プロメテウス演算子:それは何をしているのですか?
悪名高い「単純化」のために、まず、CRD(
カスタムリソース定義 )メカニズムを使用するプロメテウスオペレーターで、3つのリソースが定義されています。
prometheus
-Prometheusのインストール(クラスター)を定義します。servicemonitor
サービスのセットを監視する方法を定義します(つまり、メトリックを収集します)。alertmanager
- alertmanager
クラスターを定義します(SlackやTelegramとの統合など、さまざまなソースからデータを受信、集計、ランク付けする通知システムにメトリックを直接送信するため、アラートマネージャーのクラスターは使用しません)。
第二に、オペレーターは
prometheus
リソースを監視し、それぞれに対して生成します:
- StatefulSet (Prometheus自体を使用);
prometheus.yaml
(Prometheusの構成)およびconfigmaps.json
( prometheus-config-reloader
configmaps.json
)による秘密 。
最後に、オペレーターはルールを
使用して
servicemonitor
リソースと
ConfigMapsも監視し、それに基づいて
prometheus.yaml
および
configmaps.json
更新します(これらは秘密にされます)。
プロメテウスの最新情報
潜水艦は2つのコンテナで構成されています:
prometheus
-プロメテウス自体;prometheus-config-reloader
- prometheus.yaml
への変更を監視し、必要に応じてPrometheus構成のリロードを引き起こすバインディング (特別なHTTPリクエスト-詳細は以下を参照)、およびConfigMapsを規則で監視するバインディング ( configmaps.jsonで指定されconfigmaps.json
-参照)以下で詳細を確認してください)、必要に応じてそれらをダウンロードし、Prometheusを再起動します。

サブは3つの
ボリュームを使用します:
config
マウントされたシークレット(2つのファイル: prometheus.yaml
およびconfigmaps.json
)。 両方のコンテナに接続。rules
emptyDir
prometheus-config-reloader
emptyDir
を読み込み、 prometheus-config-reloader
emptyDir
両方のコンテナに接続されていますが、 prometheus
-読み取り専用モードで。- data-プロメテウスデータ。
prometheus
のみ装着されています。
Service Monitorはどのように処理されますか?

- プロメテウスオペレーターは、 サービスモニターを読み取ります (また、追加/削除/変更も監視します)。
prometheus
リソースprometheus
指定されているService Monitor (詳細については、 ドキュメントを参照)。 - 各Service Monitorについて、名前空間の特定のリストを指定しない場合(つまり、
any: true
指定されている場合)、Prometheus Operatorは(Kubernetes APIを使用して) Service Monitorで指定されたラベルに一致するサービスを含む名前空間のリストを計算します。 - 読み込まれた
servicemonitor
リソース( ドキュメントを参照)および計算された名前空間に基づいて、Prometheus Operatorは構成の一部( scrape_configs
セクション)を生成し、対応するシークレットに構成を保存します。 - Kubernetes自体の通常の手段により、シークレットからのデータがサブに
prometheus.yaml
ます( prometheus.yaml
ファイルprometheus.yaml
更新されます)。 - ファイルを変更すると、
prometheus-config-reloader
通知されます。これは、リブートするHTTP要求をPrometheusに送信します。 - Prometheusは設定を再読み込みし、
scrape_configs
の変更を確認します。操作のロジックに従って処理します(上記の詳細を参照)。
ConfigMapはルールでどのように処理されますか?

- Prometheusオペレーターは、
prometheus
リソースで指定されたruleSelectorに一致するruleSelector
モニターします。 - 新しい(または既存の) ConfigMapが表示された場合、Prometheusオペレーターは
prometheus.yaml
更新し、その後、 Service Monitorsの処理(上記を参照)に正確に対応するロジックがトリガーされます。 - ConfigMapを追加/削除する場合 、およびConfigMapの内容を変更する場合と同様に 、Prometheus Operatorは
configmaps.json
ファイルを更新します( ConfigMapとそのチェックサムをリストします)。 - Kubernetes自体の通常の手段により、シークレットからのデータがサブに
configmaps.json
ます( configmaps.json
ファイルconfigmaps.json
更新されます)。 - ファイルを変更すると、
prometheus-config-reloader
reloaderがemptyDir
ます。これは、変更されたConfigMapをrules
ディレクトリ(これはemptyDir
)にダウンロードします。 - 同じ
prometheus-config-reloader
はHTTP要求をPrometheusに送信して再起動します。 - プロメテウスは設定を再読み込みし、変更されたルールを確認します。
以上です!
KubernetesでのモニタリングにPrometheus(だけでなく)を使用する方法の詳細については、
RootConf 2018カンファレンスで5月28日と29日にモスクワで開催される
予定をお話しする予定です。
PS
ブログもご覧ください。