Comandos como kubectl top nodes ou kubectl top pods não funcionam por padrão em um cluster Kubernetes recém-criado — e o autoscaler horizontal (HPA), usado para escalar aplicações automaticamente com base em CPU, também depende de uma fonte de métricas para funcionar. O componente responsável por fornecer esses dados é o Metrics Server.
Neste artigo, mostro como instalar o Metrics Server e, principalmente, como resolver o problema mais comum ao instalá-lo em clusters on-premise: a falta de certificados TLS válidos entre os nós.
Instalando o Metrics Server
A instalação padrão é feita aplicando o manifesto oficial do projeto diretamente no cluster:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Isso cria um Deployment na namespace kube-system, responsável por coletar periodicamente métricas de uso de CPU e memória de todos os nós e pods do cluster.
Verificando se está funcionando
Primeiro, confirme que o pod do Metrics Server subiu corretamente:
kubectl get pods --all-namespaces
Procure por um pod com nome parecido com metrics-server-xxxxxxxxxx-xxxxx e confira se o status está Running.
Depois, teste os comandos que dependem dele:
kubectl top nodes
Ou:
kubectl top pods --all-namespaces
Se ambos retornarem dados de uso de CPU e memória, está tudo funcionando.
Quando não funciona: o problema do TLS em clusters on-premise
Em clusters gerenciados na nuvem, os nós geralmente têm certificados válidos reconhecidos pelo Metrics Server. Mas em ambientes on-premise, é comum o Metrics Server não conseguir se comunicar com o kubelet de cada nó, ficando preso em erro (o pod fica Running, mas os comandos top retornam erro ou "não encontrado").
Isso acontece porque, por padrão, o Metrics Server tenta validar o certificado TLS do kubelet — e, sem uma cadeia de certificação configurada corretamente entre os nós, essa validação falha.
Corrigindo manualmente o manifesto
Para contornar isso, baixe o manifesto localmente em vez de aplicá-lo direto pela URL:
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Edite o arquivo:
vim components.yaml
E ajuste os argumentos do container metrics-server, adicionando a flag --kubelet-insecure-tls (que desativa a validação estrita do certificado do kubelet) e outras flags de compatibilidade:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: registry.k8s.io/metrics-server/metrics-server:v0.7.2
imagePullPolicy: IfNotPresent
⚠️ A flag
--kubelet-insecure-tlsdesativa a verificação do certificado do kubelet — uma solução aceitável para ambientes internos e de laboratório, mas que reduz a segurança da comunicação. Para produção, o ideal é configurar corretamente a cadeia de certificados do cluster em vez de contornar a validação.
Depois de editar, aplique o manifesto atualizado:
kubectl apply -f components.yaml
E teste novamente:
kubectl top nodes
kubectl top pods --all-namespaces
Por que isso importa
Além de facilitar o diagnóstico manual do cluster (ver rapidamente quais nós ou pods estão consumindo mais recursos), o Metrics Server é um pré-requisito para o funcionamento do Horizontal Pod Autoscaler (HPA) — recurso que permite escalar automaticamente o número de réplicas de uma aplicação com base no uso de CPU, como vimos ao configurar o autoscale de um Deployment em artigos anteriores desta jornada com Kubernetes. Sem o Metrics Server funcionando, o comando kubectl get hpa mostra o uso de recursos como <unknown>, e o autoscaler simplesmente não escala nada.
Top comments (0)