コントロールプレーンの raw メトリクスを Prometheus 形式で取得する - Amazon EKS

コントロールプレーンの raw メトリクスを Prometheus 形式で取得する

Kubernetes コントロールプレーンは、Prometheus 形式で表される多数のメトリクスを公開します。これらのメトリクスは、モニタリングおよび分析に役立ちます。これらはメトリクスエンドポイントを通じて内部的に公開され、Prometheus を完全にデプロイしなくてもアクセスできます。ただし、Prometheus をデプロイすることで、時間の経過に伴うメトリクスの分析がより簡単になります。

生のメトリクス出力を表示するには、次のコマンドを実行します。

kubectl get --raw endpoint

このコマンドを使用すると、任意のエンドポイントパスを渡して未加工のレスポンスを返すことができます。出力にはさまざまなメトリクスが行ごとにリストされ、各行にはメトリクス名、タグ、および値が含まれます。

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

API サーバーからメトリクスを取得する

一般的な API サーバーエンドポイントは、Amazon EKS コントロールプレーンで公開されます。このエンドポイントは、主に特定のメトリクスを調べる際に役立ちます。

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 サーバーが公開する内容をそのまま返します。

metrics.eks.amazonaws.com を使用してコントロールプレーンのメトリクスを取得する

Kubernetes バージョン 1.28 以降の新しいクラスターの場合、Amazon EKS は API グループ metrics.eks.amazonaws.com のメトリクスも公開します。これらのメトリクスには、kube-schedulerkube-controller-manager などのコントロールプレーンコンポーネントが含まれます。これらのメトリクスは、次の表と同じか、またはそれ以降のプラットフォームバージョンを持つ既存のクラスターについても使用できます。

Kubernetes バージョン プラットフォームバージョン

1.31

eks.10

1.30

eks.18

1.29

eks.21

1.28

eks.27

kube-scheduler メトリクスを取得する

kube-scheduler メトリクスを取得するには、次のコマンドを使用します。

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/ksh/container/metrics"

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

# TYPE scheduler_pending_pods gauge scheduler_pending_pods{queue="active"} 0 scheduler_pending_pods{queue="backoff"} 0 scheduler_pending_pods{queue="gated"} 0 scheduler_pending_pods{queue="unschedulable"} 18 # HELP scheduler_pod_scheduling_attempts [STABLE] Number of attempts to successfully schedule a pod. # TYPE scheduler_pod_scheduling_attempts histogram scheduler_pod_scheduling_attempts_bucket{le="1"} 79 scheduler_pod_scheduling_attempts_bucket{le="2"} 79 scheduler_pod_scheduling_attempts_bucket{le="4"} 79 scheduler_pod_scheduling_attempts_bucket{le="8"} 79 scheduler_pod_scheduling_attempts_bucket{le="16"} 79 scheduler_pod_scheduling_attempts_bucket{le="+Inf"} 81 [...]

kube-controller-manager メトリクスを取得する

kube-controller-manager メトリクスを取得するには、次のコマンドを使用します。

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/kcm/container/metrics"

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

[...] workqueue_work_duration_seconds_sum{name="pvprotection"} 0 workqueue_work_duration_seconds_count{name="pvprotection"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 19 workqueue_work_duration_seconds_bucket{name="replicaset",le="0.001"} 109 workqueue_work_duration_seconds_bucket{name="replicaset",le="0.01"} 139 workqueue_work_duration_seconds_bucket{name="replicaset",le="0.1"} 181 workqueue_work_duration_seconds_bucket{name="replicaset",le="1"} 191 workqueue_work_duration_seconds_bucket{name="replicaset",le="10"} 191 workqueue_work_duration_seconds_bucket{name="replicaset",le="+Inf"} 191 workqueue_work_duration_seconds_sum{name="replicaset"} 4.265655885000002 [...]

スケジューラーとコントローラーマネージャーのメトリクスを理解する

Prometheus スタイルスクレイピングに使用できるスケジューラーとコントローラーマネージャーのメトリクスを次の表に示します。これらのメトリクスの詳細については、Kubernetes ドキュメントの「Kubernetes Metrics Reference」を参照してください。

メトリクス コントロールプレーンのコンポーネント 説明

scheduler_pending_pods

スケジューラ

実行のためにノードにスケジュールされるのを待っているポッドの数。

scheduler_schedule_attempts_total

スケジューラ

ポッドのスケジュールの試行回数。

scheduler_preemption_attempts_total

スケジューラ

優先度の低いポッドをエビクションさせて、優先度の高いポッドをスケジュールするためにスケジューラーによって実行された試行回数。

scheduler_preemption_victims

スケジューラ

優先順位の高いポッドのスペースを確保するためにエビクション対象として選択されたポッドの数。

scheduler_pod_scheduling_attempts

スケジューラ

ポッドの正常なスケジュールの試行回数。

scheduler_scheduling_attempt_duration_seconds

スケジューラ

リソースの可用性やスケジューリングルールなどのさまざまな要因に基づいて、スケジューラーがポッドを実行するのに適した場所をどの程度迅速に見つけることができるかを示します。

scheduler_pod_scheduling_sli_duration_seconds

スケジューラ

ポッドがスケジューリングキューに入る時点からの、スケジュールされているポッドのエンドツーエンドのレイテンシー。これには、複数のスケジューリング試行が含まれる場合があります。

kube_pod_resource_request

スケジューラ

クラスター上のワークロードによってリクエストされ、ポッド別に分類されたリソース。これは、スケジューラーと kubelet がリソースのポッドごとに想定するリソースの使用状況と、リソースの単位がある場合はそれを示します。

kube_pod_resource_limit

スケジューラ

ポッド別に分類された、クラスター上のワークロードのリソース制限。これは、スケジューラーと kubelet がリソースのポッドごとに想定するリソースの使用状況と、リソースの単位がある場合はそれを示します。

cronjob_controller_job_creation_skew_duration_seconds

コントローラーマネージャー

cronjob の実行がスケジュールされてから、対応するジョブが作成されるまでの時間。

workqueue_depth

コントローラーマネージャー

現在のキューの深さ。

workqueue_adds_total

コントローラーマネージャー

ワークキューが処理する合計追加数。

workqueue_queue_duration_seconds

コントローラーマネージャー

項目がリクエストされる前にワークキューに留まる時間 (秒)。

workqueue_work_duration_seconds

コントローラーマネージャー

ワークキューからの項目の処理にかかる時間 (秒)。

Prometheus スクレイパーをデプロイしてメトリクスを一貫してスクレイピングする

Prometheus スクレイパーをデプロイしてメトリクスを一貫してスクレイピングするには、次の設定を使用します:

--- apiVersion: v1 kind: ConfigMap metadata: name: prometheus-conf data: prometheus.yml: |- global: scrape_interval: 30s scrape_configs: # apiserver metrics - job_name: apiserver-metrics kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;https # Scheduler metrics - job_name: 'ksh-metrics' kubernetes_sd_configs: - role: endpoints metrics_path: /apis/metrics.eks.amazonaws.com/v1/ksh/container/metrics scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;https # Controller Manager metrics - job_name: 'kcm-metrics' kubernetes_sd_configs: - role: endpoints metrics_path: /apis/metrics.eks.amazonaws.com/v1/kcm/container/metrics scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;https --- apiVersion: v1 kind: Pod metadata: name: prom-pod spec: containers: - name: prom-container image: prom/prometheus ports: - containerPort: 9090 volumeMounts: - name: config-volume mountPath: /etc/prometheus/ volumes: - name: config-volume configMap: name: prometheus-conf

ポッドが新しいメトリクスエンドポイントにアクセスするには、次の許可が必要です。

{ "effect": "allow", "apiGroups": [ "metrics.eks.amazonaws.com" ], "resources": [ "kcm/metrics", "ksh/metrics" ], "verbs": [ "get" ] },

使用中のロールにパッチを適用するには、次のコマンドを使用できます。

kubectl patch clusterrole <role-name> --type=json -p='[ { "op": "add", "path": "/rules/-", "value": { "verbs": ["get"], "apiGroups": ["metrics.eks.amazonaws.com"], "resources": ["kcm/metrics", "ksh/metrics"] } } ]'

その後、Prometheus スクレイパーのポートをローカルポートにプロキシすることで、Prometheus ダッシュボードを表示できます。

kubectl port-forward pods/prom-pod 9090:9090

Amazon EKS クラスターの場合、コア Kubernetes コントロールプレーンメトリクスも AWS/EKS 名前空間の Amazon CloudWatch メトリクスに取り込まれます。これらを表示するには、CloudWatch コンソールを開き、左側のナビゲーションペインから [すべてのメトリクス] を選択します。[メトリクス] の選択ページで、クラスターの AWS/EKS 名前空間とメトリクスディメンションを選択します。