Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Coletar métricas de um nó virtual específico

Última atualização: Sep 15, 2026

Quando vários nós virtuais compartilham o mesmo endereço IP, o Prometheus coleta métricas do cAdvisor desse IP por meio do service do kubelet. Cada coleta retorna dados de todos os nós virtuais, causando duplicação de métricas. Para evitar isso, o ACK oferece um endpoint com escopo de nó que permite ao Prometheus direcionar a coleta para um único nó virtual pelo nome.

Pré-requisitos

Antes de começar, verifique se você tem:

  • O add-on ACK Virtual Node instalado, versão v2.11.0 ou posterior. Para mais informações, consulte ACK Virtual Node.

Como funciona

O ACK mantém o endpoint original do cAdvisor no kubelet e adiciona um segundo endpoint com escopo de nó:

Endpoint

Retorno

<nodeIP>:10250/metrics/cadvisor

Métricas de todos os nós virtuais nesse IP

<nodeIP>:10250/metrics/cadvisor?nodeName=<nodeName>

Métricas apenas dos pods gerenciados pelo nó virtual especificado

Adicionar o parâmetro de consulta nodeName restringe a resposta a um único nó virtual.

Configure o Prometheus

O ACK suporta três configurações do Prometheus: Alibaba Cloud Managed Service for Prometheus, Prometheus Operator da comunidade e Prometheus open-source. Selecione a aba correspondente à sua implantação.

Alibaba Cloud Managed Service for Prometheus

Não é necessário alterar a configuração. O endpoint com escopo de nó tem suporte por padrão.

Community edition Prometheus Operator

Se você utiliza o Prometheus Operator da comunidade com ack-prometheus-operator do App Marketplace, adicione o seguinte recurso personalizado (CR) ServiceMonitor.

Esta configuração mantém apenas os endpoints cujo nome do alvo começa com virtual-kubelet e adiciona nodeName como parâmetro de consulta para coletar cada nó virtual individualmente.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: virtual-kubelet
  namespace: monitoring
  labels:
    k8s-app: kubelet
    # Required label for automatic management by Prometheus Operator.
    release: prometheus-operator
spec:
  jobLabel: k8s-app
  selector:
    matchLabels:
      k8s-app: kubelet
  namespaceSelector:
    matchNames:
    - kube-system
  endpoints:
  - port: https-metrics
    interval: 15s
    scheme: https
    path: /metrics/cadvisor
    bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    tlsConfig:
      caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      insecureSkipVerify: true
    relabelings:
    # Keep only virtual node endpoints (names starting with "virtual-kubelet").
    - sourceLabels: [__meta_kubernetes_endpoint_address_target_name]
      regex: (^virtual-kubelet.*)
      action: keep
    # Set the nodeName query parameter to the virtual node's name.
    - sourceLabels: [__meta_kubernetes_endpoint_address_target_name]
      regex: (^virtual-kubelet.*)
      targetLabel: __param_nodeName
      replacement: ${1}
      action: replace
Importante

Caso o cluster já utilize descoberta de serviços baseada em kubelet para coletar métricas do cAdvisor, adicione a seguinte regra de exclusão (drop) ao ServiceMonitor do kubelet existente. Isso remove a configuração de coleta para <virtual node IP>:10250/metrics/cadvisor e evita dados duplicados.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
...
spec:
  endpoints:
  - path: /metrics/cadvisor
    port: https-metrics
    ...
    relabelings:
    # Drop endpoints whose target name starts with "virtual-kubelet".
    # This prevents duplicate collection from <virtual node IP>:10250/metrics/cadvisor.
    - action: drop
      regex: (^virtual-kubelet.*)
      sourceLabels:
      - __meta_kubernetes_endpoint_address_target_name

Open-source Prometheus

Localize seu arquivo de configuração do Prometheus (geralmente /etc/prometheus/prometheus.yml ou no diretório de configuração personalizado) e adicione o seguinte job de coleta.

As regras de rotulagem (relabeling) dividem-se em dois grupos. O primeiro corresponde à configuração padrão de coleta do kubelet. As duas últimas regras são específicas para nós virtuais, mantendo apenas os endpoints desses nós e injetando o parâmetro de consulta nodeName.

scrape_configs:

  # ... other job configurations ...

  - job_name: monitoring/virtual-kubelet/0
    honor_timestamps: true
    scrape_interval: 15s
    scrape_timeout: 10s
    metrics_path: /metrics/cadvisor
    scheme: https
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      insecure_skip_verify: true
    relabel_configs:
    # --- Standard kubelet service discovery rules ---
    - source_labels: [__meta_kubernetes_service_label_k8s_app]
      separator: ;
      regex: kubelet
      replacement: $1
      action: keep
    - source_labels: [__meta_kubernetes_endpoint_port_name]
      separator: ;
      regex: https-metrics
      replacement: $1
      action: keep
    - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
      separator: ;
      regex: Node;(.*)
      target_label: node
      replacement: ${1}
      action: replace
    - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
      separator: ;
      regex: Pod;(.*)
      target_label: pod
      replacement: ${1}
      action: replace
    - source_labels: [__meta_kubernetes_namespace]
      separator: ;
      regex: (.*)
      target_label: namespace
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_service_name]
      separator: ;
      regex: (.*)
      target_label: service
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_pod_name]
      separator: ;
      regex: (.*)
      target_label: pod
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_pod_container_name]
      separator: ;
      regex: (.*)
      target_label: container
      replacement: $1
      action: replace
    - source_labels: [__meta_kubernetes_service_name]
      separator: ;
      regex: (.*)
      target_label: job
      replacement: ${1}
      action: replace
    - source_labels: [__meta_kubernetes_service_label_k8s_app]
      separator: ;
      regex: (.+)
      target_label: job
      replacement: ${1}
      action: replace
    - separator: ;
      regex: (.*)
      target_label: endpoint
      replacement: https-metrics
      action: replace
    # --- Virtual-node-specific rules ---
    # Keep only endpoints whose target name starts with "virtual-kubelet".
    - source_labels: [__meta_kubernetes_endpoint_address_target_name]
      separator: ;
      regex: (^virtual-kubelet.*)
      replacement: $1
      action: keep
    # Set the nodeName query parameter to the virtual node's name.
    - source_labels: [__meta_kubernetes_endpoint_address_target_name]
      separator: ;
      regex: (^virtual-kubelet.*)
      target_label: __param_nodeName
      replacement: ${1}
      action: replace
    kubernetes_sd_configs:
    - role: endpoints
      namespaces:
        names:
        - kube-system
Importante

Se o cluster já usa descoberta de serviços baseada em kubelet para coletar métricas do cAdvisor, adicione a seguinte regra de exclusão (drop) ao job de coleta existente (nome do job: monitoring/ack-prometheus-operator-kubelet/0). Isso impede que o Prometheus também colete dados de <virtual node IP>:10250/metrics/cadvisor, evitando métricas duplicadas.

scrape_configs:

  # ... other job configurations ...

  - job_name: monitoring/ack-prometheus-operator-kubelet/0
    honor_labels: true
    honor_timestamps: true
    ...
    relabel_configs:
    ...
    # Drop virtual node endpoints to prevent duplicate collection of /metrics/cadvisor.
    - source_labels: [__meta_kubernetes_endpoint_address_target_name]
      separator: ;
      regex: (^virtual-kubelet.*)
      replacement: $1
      action: drop