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 |
|
|
Métricas de todos os nós virtuais nesse IP |
|
|
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
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
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