Configure um Prometheus autogerenciado para coletar métricas do plano de controle do ACK Pro, defina regras de alerta e verifique a configuração.
Para evitar o gerenciamento manual de configurações de coleta, use o Alibaba Cloud Managed Service for Prometheus. Esse serviço coleta métricas automaticamente, fornece painéis Grafana em tempo real e envia alertas por e-mail, SMS e DingTalk.
Pré-requisitos
Antes de começar, certifique-se de ter:
Uma instância de Prometheus autogerenciada com acesso ao API Server do cluster ACK Pro.
Permissão de leitura no caminho
/metricsdo API Server.A instância do Prometheus implantada dentro ou fora do cluster.
Clusters gerenciados ACK Pro expõem métricas dos seguintes componentes do plano de controle:
|
Componente |
Referência de métricas |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Etapa 1: Adicionar jobs de coleta do Prometheus
Adicione um job de coleta ao arquivo prometheus.yaml para cada componente do plano de controle. O intervalo global padrão é 15s, mas cada job de componente usa 30s para reduzir a carga no API Server.
A documentação de configuração do Prometheus descreve a sintaxe completa do prometheus.yaml.
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: ack-api-server
......
- job_name: ack-etcd
......
- job_name: ack-scheduler
......
As seções a seguir apresentam a configuração de coleta e as regras de alerta para cada componente. Se você implantar o Prometheus usando o padrão Prometheus Operator, consulte a documentação do add-on ack-prometheus-operator no ACK App Marketplace e a documentação da comunidade Prometheus Operator para obter detalhes sobre configurações personalizadas de coleta.
Etapa 2: Configure o monitoramento dentro do cluster
Se o Prometheus autogerenciado estiver em execução dentro do cluster, direcione cada job de coleta pelo API Server como proxy.
Identificar a arquitetura de rede do cluster
Determine se o cluster usa conexão direta via ENI (Elastic Network Interface) ou encaminhamento via CLB (Classic Load Balancer):
kubectl get endpoints kubernetes
Conexão direta ENI: A saída lista dois ou mais endereços IP, como
10.0.0.1:6443, 10.0.0.2:6443. O Prometheus conecta-se diretamente a cada réplica do API Server.Encaminhamento CLB: A saída exibe um único endereço IP (o IP interno do CLB). Todo o tráfego passa pelo balanceador de carga.
Use o endpoint correto com base nesse resultado ao configurar cada job de coleta abaixo.
kube-apiserver
O API Server é o ponto de entrada para todas as métricas do plano de controle. Jobs de outros componentes passam por ele como proxy.
Configuração de coleta:
- job_name: ack-api-server
scrape_interval: 30s
scrape_timeout: 30s
metrics_path: /metrics
scheme: https
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_service_label_provider]
action: keep
regex: kubernetes
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
Regras de alerta recomendadas:
- alert: AckApiServerWarning
expr: (absent(up{job="ack-api-server",pod!=""}) or (count(up{job="ack-api-server",pod!=""}) <= 1)) == 1
for: 5m
labels:
severity: critical
annotations:
message: "APIServer is not available. Please check the Prometheus job and target status."
O filtro pod!="" direciona a consulta aos pods reais do plano de controle e exclui o endpoint no nível de serviço. O limiar <= 1 dispara quando apenas uma ou nenhuma réplica do API Server está íntegra, o que indica degradação na alta disponibilidade. A cláusula for: 5m evita alarmes falsos causados por reinicializações breves.
etcd
Colete métricas do etcd por meio do proxy do API Server. A configuração honor_labels: true preserva os rótulos originais do componente provenientes do proxy.
Configuração de coleta:
- job_name: ack-etcd
scrape_interval: 30s
scrape_timeout: 30s
metrics_path: /metrics
scheme: https
honor_labels: true
params:
hosting: ["true"]
job: ["etcd"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
insecure_skip_verify: false
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_service_label_provider]
action: keep
regex: kubernetes
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
- source_labels: [__meta_kubernetes_service_label_component]
action: replace
target_label: job
replacement: ${1}
Regras de alerta recomendadas:
- alert: AckETCDLeaderMissing
expr: sum_over_time(etcd_server_has_leader[5m]) == 0
for: 5m
labels:
severity: critical
annotations:
message: "Etcd cluster has no leader in the last 5 minutes. Check if the cluster is overloaded."
- alert: AckETCDDown
expr: (absent(up{job="ack-etcd",pod!=""}) or (count(up{job="ack-etcd",pod!=""}) <= 2)) == 1
for: 5m
labels:
severity: critical
annotations:
message: "Etcd is unavailable. Check the Prometheus job and target status."
O alerta AckETCDLeaderMissing dispara quando nenhum líder etcd é eleito durante uma janela de 5 minutos, indicando split-brain ou sobrecarga no cluster. O AckETCDDown usa o limiar <= 2 em vez de <= 0 porque o etcd exige quórum de pelo menos três membros; com dois ou menos, não há consenso possível.
kube-scheduler
Monitore a integridade do agendador e a latência de agendamento.
Configuração de coleta:
- job_name: ack-scheduler
scrape_interval: 30s
scheme: https
params:
hosting: ["true"]
job: ["ack-scheduler"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
insecure_skip_verify: false
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
- source_labels: [__meta_kubernetes_service_label_component]
action: replace
target_label: job
replacement: ${1}
Regras de alerta recomendadas:
- alert: AckSchedulerWarning
expr: (absent(up{job="ack-scheduler",pod!=""}) or (count(up{job="ack-scheduler",pod!=""}) <= 0)) == 1
for: 3m
labels:
severity: critical
annotations:
message: "Scheduler is unavailable. Check the Prometheus job and target status."
A duração for: 3m é menor que a dos alertas do API Server e do etcd, pois a indisponibilidade do agendador bloqueia diretamente a criação de novos pods e exige detecção mais rápida.
kube-controller-manager (KCM)
Monitore os controladores responsáveis por objetos essenciais do Kubernetes, como nós, namespaces e deployments.
Configuração de coleta:
- job_name: ack-kcm
scrape_interval: 30s
scheme: https
params:
hosting: ["true"]
job: ["ack-kube-controller-manager"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
- source_labels: [__meta_kubernetes_service_label_component]
action: replace
target_label: job
replacement: ${1}
Regras de alerta recomendadas:
- alert: AckKCMWarning
expr: (absent(up{job="ack-kcm",pod!=""}) or (count(up{job="ack-kcm",pod!=""}) <= 0)) == 1
for: 3m
labels:
severity: critical
annotations:
message: "KCM is unavailable. Check the Prometheus job and target status."
cloud-controller-manager (CCM)
Monitore o CCM, responsável pela integração do cluster com a infraestrutura da Alibaba Cloud. Este job usa bearer_token_file para autenticação, diferentemente do authorization.credentials_file usado pelos demais componentes.
Configuração de coleta:
- job_name: ack-cloud-controller-manager
scrape_interval: 30s
scheme: https
params:
hosting: ["true"]
job: ["ack-cloud-controller-manager"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
Regras de alerta recomendadas:
- alert: AckCCMWarning
expr: (absent(up{job="ack-cloud-controller-manager",pod!=""}) or (count(up{job="ack-cloud-controller-manager",pod!=""}) <= 0)) == 1
for: 3m
labels:
severity: critical
annotations:
message: "CCM is unavailable. Check the Prometheus job and target status."
O filtro pod!="" garante que o alerta seja acionado apenas para pods válidos do plano de controle e evita alarmes falsos durante interrupções momentâneas de rede ou reinicializações graduais.
Etapa 3: Configure regras de alerta do Prometheus
A documentação de regras de alerta do Prometheus detalha a sintaxe e opções avançadas, incluindo as cláusulas for e keep_firing_for.
Verificar a configuração
Confirme se o Prometheus coleta dados de todos os componentes com sucesso. Se o Prometheus estiver fora do cluster alvo, configure um job de coleta externo usando kubernetes_sd_configs com o endpoint api_server, um bearer_token e tls_config para autenticar no API Server do cluster. Para mais detalhes, consulte a documentação da comunidade Prometheus.
Faça login no console do Prometheus e acesse a página Graph.
Execute a consulta
up. Verifique seup{job="ack-api-server"}e os jobs dos demais componentes retornam1.Execute uma consulta específica de componente, como
apiserver_request_total, para confirmar se os dados das séries temporais estão preenchidos corretamente.