

 **Ajudar a melhorar esta página** 

Para contribuir com este guia de usuário, escolha o link **Editar esta página no GitHub**, disponível no painel direito de cada página.

# Obter as métricas brutas do ambiente de gerenciamento no formato do Prometheus
<a name="view-raw-metrics"></a>

O ambiente de gerenciamento do Kubernetes expõe várias métricas que são representadas em um [formato do Prometheus](https://github.com/prometheus/docs/blob/master/content/docs/instrumenting/exposition_formats.md). Essas métricas são úteis para monitoramento e análise. Elas são expostas internamente por meio de endpoints de métricas e podem ser acessadas sem a implantação completa do Prometheus. No entanto, a implantação do Prometheus permite com mais facilidade a análise de métricas ao longo do tempo.

Para visualizar a saída de métricas brutas, substitua o `endpoint` e execute o comando a seguir.

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

Esse comando permite passar qualquer caminho de endpoint e retorna a resposta bruta. A saída lista diferentes métricas linha por linha, com cada linha incluindo um nome de métrica, tags e um valor.

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

## Obter métricas do servidor de API
<a name="fetch-metrics"></a>

O endpoint do servidor de API geral é exposto no ambiente de gerenciamento do Amazon EKS. Esse endpoint é útil principalmente para observar uma métrica específica.

```
kubectl get --raw /metrics
```

Veja abaixo um exemplo de saída.

```
[...]
# 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
```

Essa saída bruta retorna textualmente o que o servidor de API expõe.

## Obter métricas do ambiente de gerenciamento com `metrics.eks.amazonaws.com`
<a name="fetch-metrics-prometheus"></a>

Para os clusters com a versão `1.28` do Kubernetes ou mais recente, o Amazon EKS também disponibiliza métricas no grupo de API `metrics.eks.amazonaws.com`. Essas métricas incluem componentes do ambiente de gerenciamento, como `kube-scheduler` e `kube-controller-manager`.

**nota**  
Se você tiver uma configuração de webhook que possa bloquear a criação do novo recurso de `APIService` `v1.metrics.eks.amazonaws.com` no cluster, o recurso de endpoint de métricas talvez não esteja disponível. Você pode verificar isso no log `kube-apiserver` de auditoria pesquisando pela palavra-chave `v1.metrics.eks.amazonaws.com`.

### Obter métricas do `kube-scheduler`
<a name="fetch-metrics-scheduler"></a>

Para recuperar métricas do `kube-scheduler`, use o comando a seguir.

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

Veja abaixo um exemplo de saída.

```
# 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
[...]
```

Devido ao grande volume potencial de dados retornados, existe um endpoint adicional de métricas do `kube-scheduler` para recuperar as métricas `kube_pod_resource_request` e `kube_pod_resource_limit`. Para recuperar essas métricas, use o comando a seguir.

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

Veja abaixo um exemplo de saída.

```
# 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
[...]
```

### Obter métricas do `kube-controller-manager`
<a name="fetch-metrics-controller"></a>

Para recuperar métricas do `kube-controller-manager`, use o comando a seguir.

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

Veja abaixo um exemplo de saída.

```
[...]
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
[...]
```

### Noções básicas sobre as métricas do gerenciador do controlador e do programador
<a name="scheduler-controller-metrics"></a>

A tabela a seguir descreve as métricas do gerenciador do controlador e do agendador que são disponibilizadas para extração do estilo do Prometheus. Para obter mais informações sobre essas métricas, consulte [Kubernetes Metrics Reference](https://kubernetes.io/docs/reference/instrumentation/metrics/) na documentação do Kubernetes.


| Métrica | Componente do ambiente de gerenciamento | Descrição | 
| --- | --- | --- | 
| scheduler\_pending\_pods | scheduler (programador) | O número de pods que estão aguardando para serem programados em um nó para execução. | 
| scheduler\_schedule\_attempts\_total | scheduler (programador) | O número de tentativas para programar pods. | 
| scheduler\_preemption\_attempts\_total | scheduler (programador) | O número de tentativas feitas pelo programador para programar pods de maior prioridade removendo os de menor prioridade. | 
| scheduler\_preemption\_victims | scheduler (programador) | O número de pods que foram selecionados para remoção para abrir espaço para pods de maior prioridade. | 
| scheduler\_pod\_scheduling\_attempts | scheduler (programador) | O número de tentativas para programar com êxito um pod. | 
| scheduler\_scheduling\_attempt\_duration\_seconds | scheduler (programador) | Indica com que rapidez ou lentidão o programador consegue encontrar um local adequado para a execução de um pod com base em vários fatores, como disponibilidade de recursos e regras de programação. | 
| scheduler\_pod\_scheduling\_sli\_duration\_seconds | scheduler (programador) | A latência de ponta a ponta de um pod que está sendo programado, a partir do momento em que o pod entra na fila de programação. Isso pode envolver várias tentativas de programação. | 
| kube\_pod\_resource\_limit | scheduler (programador) | Os limites de recursos para workloads no cluster, detalhados por pod. Isso mostra o uso de recursos que o agendador e o kubelet esperam por pod para recursos, juntamente com a unidade do recurso, se houver. | 
| kube\_pod\_resource\_request | scheduler (programador) | Os recursos solicitados pelas workloads no cluster, detalhados por pod. Isso mostra o uso de recursos que o agendador e o kubelet esperam por pod para recursos, juntamente com a unidade do recurso, se houver. | 
| cronjob\_controller\_job\_creation\_skew\_duration\_seconds | gerenciador do controlador | O tempo entre o momento em que um cronjob está programado para ser executado e o momento em que o trabalho correspondente é criado. | 
| workqueue\_depth | gerenciador do controlador | A profundidade atual da fila. | 
| workqueue\_adds\_total | gerenciador do controlador | O número total de adições tratadas pela fila de trabalho. | 
| workqueue\_queue\_duration\_seconds | gerenciador do controlador | O tempo em segundos em que um item permanece na fila de trabalho antes de ser solicitado. | 
| workqueue\_work\_duration\_seconds | gerenciador do controlador | O tempo em segundos que o processamento de um item da fila de trabalho leva. | 

## Implantar um extrator do Prometheus para extrair métricas de forma consistente
<a name="deploy-prometheus-scraper"></a>

Para implantar um extrator do Prometheus para extrair métricas de forma consistente, use a seguinte configuração:

```
---
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
```

A permissão a seguir é necessária para que o pod acesse o novo endpoint de métricas.

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

Para aplicar patch no perfil em uso, use o comando a seguir.

```
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"]
    }
  }
]'
```

Você pode então visualizar o painel do Prometheus fazendo proxy da porta do extrator do Prometheus para a sua porta local.

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

Para seu cluster do Amazon EKS, as métricas principais do ambiente de gerenciamento do Kubernetes também são ingeridas no Amazon CloudWatch Metrics sob o namespace `AWS/EKS`. Para visualizá-las, abra o [console do CloudWatch](https://console.aws.amazon.com/cloudwatch/home#logs:prefix=/aws/eks) e selecione **Todas as métricas** no painel de navegação esquerdo. Na página de seleção de **Métricas**, escolha o namespace `AWS/EKS` e uma dimensão de métricas para seu cluster.