Prometheus のメトリクス - Amazon EKS

Prometheus のメトリクス

Prometheus は、エンドポイントをスクレイピングするモニタリングおよび時系列データベースです。収集したデータをクエリ、集計、保存することができます。また、アラートやアラートの集計にも使用できます。このトピックでは、Prometheus を、マネージドオプションまたはオープンソースオプションとして設定する方法について説明します。Amazon EKS コントロールプレーンメトリクスのモニタリングは一般的なユースケースです。

Amazon Managed Service for Prometheus は Prometheus 互換のモニタリングおよびアラートサービスであり、コンテナ化されたアプリケーションやインフラストラクチャを大規模に監視することが容易になります。これは、メトリクスの取り込み、ストレージ、クエリ、アラートを自動的にスケーリングするフルマネージド型サービスです。また、AWS セキュリティサービスと統合して、データへの高速かつ安全なアクセスを可能にします。オープンソースの PromQL クエリ言語を使用して、メトリクスをクエリし、それらに関するアラートを作成できます。

Prometheus メトリクスをオンにした後の使用方法のさらなる詳細については、「Amazon Managed Service for Prometheus ユーザーガイド」を参照してください。

クラスターを作成するときは、Prometheus メトリクスを有効にしてください。

重要

Amazon Managed Service for Prometheus リソースはクラスターのライフサイクル外にあるため、クラスターとは別途維持する必要があります。クラスターを削除するときは、対象コストを抑えるために、該当するスクレイパーも削除してください。詳細については、Amazon Managed Service for Prometheus ユーザーガイドの「スクレイパーの検出と作成」を参照してください。

新しいクラスターを作成すると、メトリクスを Prometheus に送信するオプションをオンにできます。AWS Management Console では、このオプションはクラスターの新規作成の [オブザーバビリティの設定] ステップにあります。詳細については、「Amazon EKS クラスターの作成」を参照してください。

Prometheus は、スクレイピングと呼ばれるプルベースのモデルを通じて、クラスターからメトリクスを検出して収集します。スクレイパーは、クラスターインフラストラクチャーとコンテナー化されたアプリケーションからデータを収集するように設定されています。

Prometheus メトリクスを送信するオプションをオンにすると、Amazon Managed Service for Prometheus は完全マネージド型のエージェントレススクレイパーを提供します。以下の [詳細設定] オプションを使用して、必要に応じてデフォルトのスクレイパーをカスタマイズします。

スクレイパーエイリアスの名前

(オプション) スクレイパーの一意のエイリアスの入力。

デスティネーション

Amazon Managed Service for Prometheus ワークスペースを選択します。ワークスペースは、Prometheus メトリックの保存とクエリ専用の論理スペースです。このワークスペースでは、そのワークスペースにアクセスできるアカウントの Prometheus メトリクスを表示できます。[新しいワークスペースを作成する] オプションでは、指定した [ワークスペースエイリアス] を使用してユーザーに代わってワークスペースを作成するよう Amazon EKS に指示します。[既存のワークスペースを選択] オプションでは、ドロップダウンリストから既存のワークスペースを選択できます。ワークスペースの詳細については、「Amazon Managed Service for Prometheus ユーザーガイド」の「ワークスペースの管理」を参照してください。

サービスアクセス

このセクションでは、Prometheus メトリクスを送信する際に付与する権限の概要を説明します。

  • Amazon Managed Service for Prometheus に、スクレイピングされた Amazon EKS クラスターを記述できるようにします

  • Amazon マネージド Prometheus ワークスペースへのリモート書き込みを許可する

AmazonManagedScraperRole がすでに存在する場合、スクレイパーはそれを使用します。AmazonManagedScraperRole リンクを選択すると、[アクセス許可の詳細] が表示されます。AmazonManagedScraperRole がまだ存在しない場合は、[許可を表示] リンクを選択すると、Prometheus メトリクスを送信して付与している特定の権限を確認できます。

サブネット

スクレイパーが継承するサブネットを表示します。変更する必要がある場合は、クラスターの作成でネットワークを指定する手順に戻ってください。

セキュリティグループ

スクレイパーが継承するセキュリティグループを表示します。変更する必要がある場合は、クラスターの作成でネットワークを指定する手順に戻ってください。

スクレイパー設定

必要に応じて YAML 形式でスクレイパー設定を変更します。これを行うには、フォームを使用するか、代替の YAML ファイルをアップロードします。詳細については、「Amazon Managed Service for Prometheus ユーザーガイド」の「スクレイパー設定」を参照してください。

Amazon Managed Service for Prometheus は、AWS マネージドコレクターとしてクラスターと一緒に作成されるエージェントレススクレイパーを指します。AWS マネージドコレクターの詳細については、「Amazon Managed Service for Prometheus ユーザーガイド」の「AWSマネージドコレクター」を参照してください。

重要

スクレイパーにクラスター内のアクセス権限を付与するように aws-auth ConfigMap を設定する必要があります。詳細については、「Amazon Managed Service for Prometheus ユーザーガイド」の「Amazon EKS クラスターの設定」を参照してください。

Prometheus スクレイパーの詳細を表示する

Prometheus メトリクスオプションをオンにしてクラスターを作成すると、Prometheus スクレイパーの詳細を表示できます。AWS Management Console でクラスターを表示するときは、[オブザーバビリティ] タブを選択します。表には、スクレイパー ID、エイリアス、ステータス、作成日などの情報を含む、クラスターのスクレイパーのリストが表示されます。

スクレイパーの詳細を表示するには、スクレイパー ID リンクを選択します。例えば、スクレイパー設定、Amazon リソースネーム (ARN)、リモート書き込み URL、およびネットワーク情報を表示できます。スクレイパー ID は、DescribeScraperDeleteScraper などの Amazon Managed Service for Prometheus API オペレーションへの入力として使用できます。API を使用して、さらにスクレイパーを作成することもできます。

Prometheus API の使用に関する詳細については、「Amazon Managed Service for Prometheus API リファレンス」を参照してください。

Helm を使用して Prometheus をデプロイする

または、Helm V3 を使用してクラスターに Prometheus をデプロイすることもできます。すでに Helm をインストールしている場合は、helm version コマンドでバージョンを確認できます。 Helm は Kubernetes クラスター用のパッケージマネージャーです。Helm の詳細およびインストール方法については、「Amazon EKS での Helm の使用」を参照してください。

Amazon EKS クラスター用に Helm を設定した後、次の手順で Prometheus をデプロイするために使用できます。

Helm を使用して Prometheus をデプロイするには
  1. Prometheus 名前空間を作成します。

    kubectl create namespace prometheus
  2. prometheus-community グラフリポジトリの追加

    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  3. Prometheus をデプロイします。

    helm upgrade -i prometheus prometheus-community/prometheus \ --namespace prometheus \ --set alertmanager.persistentVolume.storageClass="gp2",server.persistentVolume.storageClass="gp2"
    注記

    このコマンドの実行時に Error: failed to download "stable/prometheus" (hint: running `helm repo update` may help) エラーが発生した場合、helm repo update prometheus-community を実行し、ステップ 2 のコマンドをもう一度実行してみてください。

    Error: rendered manifests contain a resource that already exists エラーが発生した場合、helm uninstall your-release-name -n namespaceを実行し、ステップ 3 のコマンドをもう一度実行してみてください。

  4. prometheus 名前空間のすべての Pods が READY 状態になっていることを確認します。

    kubectl get pods -n prometheus

    出力例は次のとおりです。

    NAME READY STATUS RESTARTS AGE prometheus-alertmanager-59b4c8c744-r7bgp 1/2 Running 0 48s prometheus-kube-state-metrics-7cfd87cf99-jkz2f 1/1 Running 0 48s prometheus-node-exporter-jcjqz 1/1 Running 0 48s prometheus-node-exporter-jxv2h 1/1 Running 0 48s prometheus-node-exporter-vbdks 1/1 Running 0 48s prometheus-pushgateway-76c444b68c-82tnw 1/1 Running 0 48s prometheus-server-775957f748-mmht9 1/2 Running 0 48s
  5. kubectl を使用して Prometheus コンソールをローカルマシンにポート転送します。

    kubectl --namespace=prometheus port-forward deploy/prometheus-server 9090
  6. ウェブブラウザを http://localhost:9090 に指定して、Prometheus コンソールを表示します。

  7. [- カーソルの位置のメトリクスを挿入] メニューからメトリクスを選択し、[実行] を選択します。[グラフ] タブを選択して、一定期間のメトリクスを表示します。次の図では、一定期間の container_memory_usage_bytes を示します。

    Prometheus のメトリクス
  8. 上部のナビゲーションバーから、[ステータス][ターゲット] の順に選択します。

    Prometheus コンソール

    サービス検出を使用して Prometheus に接続されているすべての Kubernetes エンドポイントが表示されます。

コントロールプレーンにおける未加工メトリクスの表示

Kubernetes API サーバーは、Prometheus をデプロイする代わりに、Prometheus の形式で表される多数のメトリクスを公開します。これらのメトリクスは、モニタリングおよび分析に役立ちます。これらのメトリクスは、/metrics HTTP API を参照するメトリクスエンドポイントを介して内部的に公開されます。他のエンドポイントと同様に、このエンドポイントは Amazon EKS コントロールプレーンに公開されます。このエンドポイントは、主に特定のメトリクスを調べるのに役立ちます。メトリクスを時系列的に分析するには、Prometheus をデプロイすることをおすすめします。

未加工メトリクスの出力を表示するには、--raw フラグを付けて kubectl を使用します。このコマンドを使用すると、任意の HTTP パスを渡して未加工のレスポンスを返すことができます。

kubectl get --raw /metrics

出力例は次のとおりです。

[...]
# HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host.
# TYPE rest_client_requests_total counter
rest_client_requests_total{code="200",host="127.0.0.1:21362",method="POST"} 4994
rest_client_requests_total{code="200",host="127.0.0.1:443",method="DELETE"} 1
rest_client_requests_total{code="200",host="127.0.0.1:443",method="GET"} 1.326086e+06
rest_client_requests_total{code="200",host="127.0.0.1:443",method="PUT"} 862173
rest_client_requests_total{code="404",host="127.0.0.1:443",method="GET"} 2
rest_client_requests_total{code="409",host="127.0.0.1:443",method="POST"} 3
rest_client_requests_total{code="409",host="127.0.0.1:443",method="PUT"} 8
# HELP ssh_tunnel_open_count Counter of ssh tunnel total open attempts
# TYPE ssh_tunnel_open_count counter
ssh_tunnel_open_count 0
# HELP ssh_tunnel_open_fail_count Counter of ssh tunnel failed open attempts
# TYPE ssh_tunnel_open_fail_count counter
ssh_tunnel_open_fail_count 0

この未加工出力は、API サーバーが公開する内容をそのまま返します。さまざまなメトリクスが行ごとに一覧表示され、各行には指標名、タグ、値が含まれます。

metric_name{"tag"="value"[,...]}
            value