Obter as métricas brutas do ambiente de gerenciamento no formato Prometheus - Amazon EKS

Obter as métricas brutas do ambiente de gerenciamento no formato Prometheus

O ambiente de gerenciamento do Kubernetes expõe várias métricas que são representadas em um formato do Prometheus. 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 de 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, 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

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 um exemplo de saída abaixo.

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

Para novos clusters que sejam Kubernetes versão 1.28 e posteriores, o Amazon EKS também expõe 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. Essas métricas também estão disponíveis para clusters existentes cuja versão da plataforma seja igual ou posterior em comparação com a tabela a seguir.

Versão do Kubernetes Versão da plataforma

1.31

eks.10

1.30

eks.18

1.29

eks.21

1.28

eks.27

Obter métricas do kube-scheduler

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 um exemplo de saída abaixo.

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

Obter métricas do kube-controller-manager

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 um exemplo de saída abaixo.

[...] 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 tabela a seguir descreve as métricas do gerenciador do controlador e do programador que são disponibilizadas para extração no estilo do Prometheus. Para obter mais informações sobre essas métricas, consulte a Referência de métricas do Kubernetes 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_request

scheduler (programador)

Os recursos solicitados pelas workloads no cluster, detalhados por pod. Isso mostra o uso de recursos que o programador e o kubelet esperam por pod para recursos junto com a unidade do recurso, se houver.

kube_pod_resource_limit

scheduler (programador)

Os recursos limitados para workloads no cluster, detalhados por pod. Isso mostra o uso de recursos que o programador e o kubelet esperam por pod para recursos junto 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.

Implante um extrator do Prometheus para extrair métricas de forma consistente

Para implantar um extrator do Prometheus para coletar consistentemente as métricas, use a configuração a seguir:

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

Em seguida, é possível 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 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 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.