

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 获取 Prometheus 格式的控制面板原始指标
<a name="view-raw-metrics"></a>

Kubernetes 控制面板公开了许多以 [Prometheus 格式](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md)表示的指标。这些指标对于监控和分析非常有用。这些指标通过指标端点在内部公开，无需完全部署 Prometheus 即可访问。但是，随着时间的推移，部署 Prometheus 更加容易，即可实现指标分析。

要查看原始指标输出，请替代 `endpoint` 并运行以下命令。

```
kubectl get --raw endpoint
```

此命令允许您传递任何端点路径，并返回原始响应。输出结果逐行列出了不同指标，每行都包含指标名称、标签和值。

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

## 从 API 服务器获取指标
<a name="fetch-metrics"></a>

常规 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` 获取控制面板指标
<a name="fetch-metrics-prometheus"></a>

对于 Kubernetes 版本 `1.28` 及以上版本的集群，Amazon EKS 还会在 API 组 `metrics.eks.amazonaws.com` 下公开指标。这些指标包括控制面板组件，例如 `kube-scheduler` 和 `kube-controller-manager`。

**注意**  
如果有可能会阻止在集群上新建 `APIService` 资源 `v1.metrics.eks.amazonaws.com` 的 Webhook 配置，则指标端点功能可能不可用。您可以通过在 `kube-apiserver` 审计日志中搜索 `v1.metrics.eks.amazonaws.com` 关键词进行验证。

### 获取 `kube-scheduler` 指标
<a name="fetch-metrics-scheduler"></a>

使用以下命令来检索 `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-scheduler` 指标端点可用于检索 `kube_pod_resource_request` 和 `kube_pod_resource_limit` 指标。使用以下命令来检索这些指标。

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

示例输出如下。

```
# HELP kube_pod_resource_limit [STABLE] Resources limit for workloads on the cluster, broken down by pod. This shows the resource usage the scheduler and kubelet expect per pod for resources along with the unit for the resource if any.
# TYPE kube_pod_resource_limit gauge
kube_pod_resource_limit{namespace="kube-system",node="ip-192-168-87-3.us-west-2.compute.internal",pod="coredns-7bf648ff5d-dj4ss",priority="2000000000",resource="memory",scheduler="default-scheduler",unit="bytes"} 1.7825792e+08
# HELP kube_pod_resource_request [STABLE] Resources requested by workloads on the cluster, broken down by pod. This shows the resource usage the scheduler and kubelet expect per pod for resources along with the unit for the resource if any.
# TYPE kube_pod_resource_request gauge
kube_pod_resource_request{namespace="kube-system",node="ip-192-168-87-3.us-west-2.compute.internal",pod="aws-node-x7znh",priority="2000001000",resource="cpu",scheduler="default-scheduler",unit="cores"} 0.05
kube_pod_resource_request{namespace="kube-system",node="ip-192-168-87-3.us-west-2.compute.internal",pod="coredns-7bf648ff5d-dj4ss",priority="2000000000",resource="cpu",scheduler="default-scheduler",unit="cores"} 0.1
[...]
```

### 获取 `kube-controller-manager` 指标
<a name="fetch-metrics-controller"></a>

使用以下命令来检索 `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
[...]
```

### 了解调度器和控制器管理器指标
<a name="scheduler-controller-metrics"></a>

下表描述了可用于 Prometheus 样式获取的调度器和控制器管理器指标。有关这些指标的更多信息，请参阅 Kubernetes 文档中的 [Kubernetes Metrics Reference](https://kubernetes.io/docs/reference/instrumentation/metrics/)。


| 指标 | 控制面板组件 | 说明 | 
| --- | --- | --- | 
| scheduler\_pending\_pods | 调度器 | 等待调度到节点上执行的容器组（pod）数量。 | 
| scheduler\_schedule\_attempts\_total | 调度器 | 尝试调度容器组（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\_limit | 调度器 | 集群上工作负载的资源限制，按容器组（pod）细分。显示调度器和 Kubelet 预计的各容器组（pod）资源使用量，以及资源的单位（如有）。 | 
| kube\_pod\_resource\_request | 调度器 | 集群上工作负载请求的资源，按容器组（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 抓取工具持续抓取指标
<a name="deploy-prometheus-scraper"></a>

要部署 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 控制台](https://console.amazonaws.cn/cloudwatch/home#logs:prefix=/aws/eks)，然后从左侧导航窗格中选择**所有指标**。在**指标**选择页面上，为您的集群选择 `AWS/EKS` 命名空间和指标维度。