Pular para o conteúdo principal

Gestão de custos para AKS

O desperdício número um de custos no AKS são nodes superdimensionados. Times solicitam 4 CPU e 8 GB de memória para um pod que usa 0.3 CPU e 200 MB. Multiplique isso por 50 pods e você está pagando por 10 nodes quando precisa de 3. Dimensione agressivamente.

De onde vem o custo do AKS

ComponentePelo Que Você Paga% Típica do Total
VMs (node pools)Computação para seus pods60-75%
StorageVolumes persistentes, discos do SO10-20%
RedeLoad balancers, NAT gateway, IPs públicos5-15%
EgressDados saindo do Azure5-10%
Control planeGerenciamento do AKSGratuito (Standard tier) / $0.10/hr (Premium)

O control plane é gratuito no Standard tier. Seu custo real são as VMs por baixo. Todo o resto é otimização nas margens.

Habilitar o add-on de análise de custos do AKS

Isso é gratuito. Habilite. Ele fornece visibilidade de custos por namespace e por workload diretamente no portal do Azure.

az aks update \
--resource-group myRG \
--name myCluster \
--enable-cost-analysis
dica

Habilite o add-on de análise de custos do AKS em todo cluster. É gratuito e fornece visibilidade por namespace sem instalar ferramentas de terceiros. Adicione KubeCost apenas se você precisar de chargebacks ou relatórios de showback por time.

Ferramentas de visibilidade de custos

FerramentaCustoMelhor ParaLimitação
Add-on de Análise de Custos do AKSGratuitoCusto por namespace/workload no portalSem tendências históricas além de 60 dias
Azure Cost ManagementGratuitoNível de subscription/resource groupNão enxerga dentro do cluster
KubeCost (open source)GratuitoCusto detalhado por pod, chargebacksRoda no cluster, consome recursos
OpenCostGratuitoPadrão CNCF, leveUI menos polida que o KubeCost
informação

Azure Cost Management vê seu cluster como um custo de VM. Ele não consegue dizer qual namespace ou pod é responsável. Por isso você precisa do add-on do AKS ou do KubeCost para atribuição de custos dentro do cluster.

Estratégias-chave de custo

1. Dimensione suas VMs corretamente

Não escolha D16s_v5 porque "a gente pode precisar." Comece pequeno, monitore o uso real, e escale para cima apenas quando a utilização justificar.

# Check actual node utilization
kubectl top nodes

# Example output -- these nodes are oversized:
# NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
# node-pool-1 850m 5% 3200Mi 12%
# node-pool-2 920m 5% 2800Mi 11%

Se seus nodes consistentemente rodam abaixo de 40% de CPU e memória, você está pagando a mais. Reduza o SKU da VM ou diminua a contagem de nodes.

2. Instâncias Spot para workloads não-críticas

Use node pools Spot para jobs em lote, dev/test, runners de CI e qualquer workload que tolere interrupção. VMs Spot custam 60-90% menos que sob demanda.

az aks nodepool add \
--resource-group myRG \
--cluster-name myCluster \
--name spotnodes \
--priority Spot \
--eviction-policy Delete \
--spot-max-price -1 \
--node-count 3 \
--node-vm-size Standard_D4s_v5
aviso

Não rode workloads stateful de produção em nodes Spot. Eles podem ser despejados com 30 segundos de aviso. Use Spot para processamento em lote stateless, agentes de build e ambientes de desenvolvimento.

3. Instâncias reservadas para estado estacionário

Se você sabe que vai rodar 10 nodes D4s_v5 por 12 meses, compre Reserved Instances. Economia: 30-60% comparado a pay-as-you-go.

4. Reduza ambientes não-produção à noite

Um cluster de dev rodando 24/7 custa 3x o que custaria rodando apenas em horário comercial. Use o recurso de stop/start do AKS ou scaling de node pool.

# Stop a dev cluster at night (saves 100% compute cost)
az aks stop --resource-group myRG --name dev-cluster

# Or scale down to minimum
az aks nodepool scale \
--resource-group myRG \
--cluster-name dev-cluster \
--name default \
--node-count 1

5. Resource requests e limits: acerte nisso

Esta é a coisa mais impactante para eficiência de custos. O scheduler do Kubernetes usa requests para empacotar pods nos nodes. Se você solicita 2 CPU mas usa 0.1 CPU, o scheduler acha que aquele slot do node está cheio.

resources:
requests:
cpu: "100m" # What you actually use (check with kubectl top)
memory: "128Mi"
limits:
cpu: "500m" # Burst ceiling
memory: "256Mi" # OOMKill boundary
aviso

Definir requests muito altos desperdiça nodes (você paga por capacidade vazia). Defini-los muito baixos causa falhas de agendamento e evictions. Baseie os requests no uso real P95 dos seus dados de monitoramento, não em suposições.

Medindo uso real vs requests

# Compare requested vs actual for all pods in a namespace
kubectl top pods -n production --containers

# Use this KQL query in Container Insights to find over-provisioned pods
# Pods requesting >4x their actual CPU usage
Perf
| where ObjectName == "K8SContainer" and CounterName == "cpuUsageNanoCores"
| summarize AvgCPU=avg(CounterValue) by InstanceName
| join kind=inner (
KubePodInventory | distinct ContainerName, Namespace, PodName
) on $left.InstanceName == $right.ContainerName

Erros comuns

  1. Nunca olhar o custo -- Times fazem deploy e esquecem. Configure revisões mensais de custo por dono de namespace.
  2. Node pools uniformes -- Use múltiplos node pools com diferentes tamanhos de VM. Workloads GPU precisam de nodes GPU. Servidores web precisam de nodes general-purpose baratos. Não coloque tudo no mesmo SKU caro.
  3. Ignorar egress -- Tráfego entre regiões e egress para internet somam. Mantenha serviços na mesma região. Use private endpoints.
  4. Super-alocar PVCs -- Um SSD Premium de 1 TB custa dinheiro real mesmo se você usa 10 GB. Dimensione PVCs para a necessidade real e use Standard SSD onde os requisitos de IOPS permitirem.
  5. Rodar monitoramento em nodes caros -- Coloque workloads de observabilidade (Prometheus, agentes de logging) em seu próprio node pool custo-efetivo.

Checklist de revisão mensal de custos

  • Verificar utilização dos nodes (meta: 60-80% CPU, 60-80% memória)
  • Revisar breakdown de custos por namespace no add-on do AKS
  • Identificar pods com requests > 4x o uso real
  • Verificar se clusters não-prod estão reduzidos fora do horário comercial
  • Verificar PVCs órfãos (volumes persistentes sem pod vinculado)
  • Revisar custos de egress para picos inesperados

Recursos