

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 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-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\$1pending\$1pods  |  调度器  |  等待调度到节点上执行的容器组（pod）数量。  | 
|  scheduler\$1schedule\$1attempts\$1total  |  调度器  |  尝试调度容器组（pod）的次数。  | 
|  scheduler\$1preemption\$1tapts\$1total  |  调度器  |  调度器尝试通过驱逐优先级较低的容器组（pod）来调度优先级较高的容器组（pod）的次数。  | 
|  scheduler\$1preemption\$1victims  |  调度器  |  为容纳优先级更高的容器组（pod）腾出空间而被选中驱逐的容器组（pod）的数量。  | 
|  scheduler\$1pod\$1scheduling\$1attempts  |  调度器  |  成功尝试调度容器组（pod）的次数。  | 
|  scheduler\$1scheduling\$1attempt\$1duration\$1seconds  |  调度器  |  表示调度器能够根据可用资源和调度规则等各种因素找到容器组（pod）的合适运行位置的速度。  | 
|  scheduler\$1pod\$1scheduling\$1sli\$1duration\$1seconds  |  调度器  |  从容器组（pod）进入调度队列之时起调度容器组（pod）的端到端延迟。这可能涉及多次尝试调度。  | 
|  cronjob\$1controller\$1job\$1creation\$1skew\$1duration\$1skeond  |  控制器管理器  |  从计划运行 cronjob 到创建相应作业的时间。  | 
|  workqueue\$1depth  |  控制器管理器  |  当前工作队列的深度。  | 
|  workqueue\$1adds\$1total  |  控制器管理器  |  工作队列处理的添加总数。  | 
|  workqueue\$1queue\$1duration\$1seconds  |  控制器管理器  |  显示项目在被请求之前在工作队列中停留的时长（以秒为单位）。  | 
|  workqueue\$1work\$1duration\$1seconds  |  控制器管理器  |  工作队列中项目的处理时长（以秒为单位）。  | 

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