获取 Prometheus 格式的控制面板原始指标 - Amazon EKS

获取 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

等待调度到节点上执行的容器组(pod)数量。

scheduler_schedule_attempts_total

scheduler

尝试调度容器组(pod)的次数。

scheduler_preemption_tapts_total

调度器

调度器尝试通过驱逐优先级较低的容器组(pod)来调度优先级较高的容器组(pod)的次数。

scheduler_preemption_victims

调度器

为容纳优先级更高的容器组(pod)腾出空间而被选中驱逐的容器组(pod)的数量。

scheduler_pod_scheduling_attempts

调度器

成功尝试调度容器组(pod)的次数。

scheduler_scheduling_attempt_duration_seconds

调度器

表示调度器能够根据可用资源和调度规则等各种因素找到容器组(pod)的合适运行位置的速度。

scheduler_pod_scheduling_sli_duration_seconds

调度器

从容器组(pod)进入调度队列之时起调度容器组(pod)的端到端延迟。这可能涉及多次尝试调度。

kube_pod_resource_request

调度器

集群上工作负载请求的资源,按容器组(pod)细分。显示调度器和 Kubelet 预计的各容器组(pod)资源使用量,以及资源的单位(如有)。

kube_pod_resource_limit

调度器

集群上工作负载的资源限制,按容器组(pod)细分。显示调度器和 Kubelet 预计的各容器组(pod)资源使用量,以及资源的单位(如有)。

cronjob_controller_job_creation_skew_duration_skeond

控制器管理器

从计划运行 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

容器组(pod)需要以下权限才能访问新的指标端点。

{ "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 命名空间和指标维度。