コントロールプレーンの raw メトリクスを Prometheus 形式で取得する
Kubernetes コントロールプレーンは、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-scheduler
や kube-controller-manager
などのコントロールプレーンコンポーネントが含まれます。これらのメトリクスは、次の表と同じか、またはそれ以降のプラットフォームバージョンを持つ既存のクラスターについても使用できます。
Kubernetes バージョン | プラットフォームバージョン |
---|---|
|
|
|
|
|
|
|
|
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
名前空間とメトリクスディメンションを選択します。