Kubernetes için FinOps: Doğru Boyutlandırma, Spot Bulut Sunucuları ve Maliyet Azaltma
Üretimde Kubernetes kullanan kuruluşların %68'i %20-40 daha fazla harcıyor gereğinden fazla (CNCF Maliyet Araştırması 2026). Kubernetes'in verimsiz olmasından değil, cömert ve kolay tedarik ve doğru boyutlandırma operasyonel disiplin gerektirir. ortalama CPU kullanımı %15-20 ve bellek %30-40 olan sonuç ve küme: ödenen kaynaklar ama kullanmayın.
Kubernetes için FinOps ve ölçme, optimize etme ve yönetme uygulaması küme harcaması. Bu yazıda nasıl kullanılacağını göreceğiz Kubecost için ad alanları için maliyetlerin görünürlüğü VPA doğru boyutlandırmaya yardımcı olur otomatik istekler, nasıl Marangoz düğüm kutusu paketlemeyi optimize eder spot örneklerle ve maliyetleri korumak için organizasyon düzeyinde hangi politikaların uygulanacağıyla ilgili bilgiler zamanla kontrol altına alınır.
Ne Öğreneceksiniz
- Ad alanı/ekip maliyeti görünürlüğü için Kubecost'u yükleyin ve yapılandırın
- Kapalı modunda VPA: kesinti olmadan otomatik doğru boyutlandırma önerileri
- Karpenter: Düğümlerin optimum şekilde paketlenmesi için konsolidasyon
- Karpenter ve kesinti yönetimi ile AWS/GCP/Azure'da bulut sunucularını tespit edin
- Ekip bütçeleme aracı olarak ResourceQuota
- İsraf ve maliyet anormallikleri konusunda Prometheus'u uyarın
- Ekipler için ters ibraz sistemi nasıl oluşturulur?
- Karşılaştırma noktası: Her teknikle gerçek tasarruf elde edilebilir
Kubernetes Neden Aşırı Tedarik Edilme Eğilimindedir?
Optimize etmeden önce sorunun nedenlerini anlamanız gerekir:
- Muhafazakar Talepler: Ekipler "güvenli olmak için" istekleri yüksek ayarlar (örneğin, 0.1 kullanan bir uygulama için 1 CPU). İstekler ihtiyaç duyulan düğüm sayısını belirler
- Sınırlar = istekler: Birçok CI/CD şablonu, sınırları isteklere eşit olarak belirleyerek sistematik aşırı provizyon oluşturur
- Boş ad alanları: 7/24 açık olan "Merhaba Dünya" Kapsülleriyle geliştirme ad alanı
- Büyük boyutlu düğümler: Verimsiz kutu paketlemeye sahip büyük bulut örnekleri (32 vCPU düğümünde 2 vCPU Kapsülü)
- Takımlar için görünürlük yok: Ekipler maliyetlerini göremezse optimizasyon yapma teşvikleri kalmaz
Kubecost: Ad Alanı Maliyetlerinin Görünürlüğü
Kubecost Kubernetes ekosisteminde en çok kullanılan FinOps aracıdır. Prometheus'tan ölçümler toplar, bulut örneği fiyatlarını alır (AWS, GCP, Azure) ve ad alanı, dağıtım, hizmet hesabı ve etiket için ayrılan maliyeti hesaplayın.
Kubecost kurulumu
# Installa Kubecost con Helm
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost \
--create-namespace \
--set kubecostToken="your-token-here" \
--set prometheus.enabled=true \
--set grafana.enabled=true \
--set global.prometheus.enabled=false \
--set global.prometheus.fqdn="http://prometheus.monitoring.svc:9090"
# Port-forward per accedere alla UI
kubectl port-forward svc/kubecost-cost-analyzer 9090:9090 -n kubecost &
# Apri: http://localhost:9090
# Alternativa open-source senza token: OpenCost
helm install opencost opencost/opencost \
--namespace opencost \
--create-namespace
Ekipler için Ters İbrazı Yapılandırma
# Kubecost usa i label Kubernetes per il cost allocation
# Configura label standard per tutti i workload:
# Nel values.yaml di ogni applicazione (Helm):
podLabels:
team: "team-alpha"
cost-center: "CC-2024-ENG"
environment: "production"
product: "checkout-service"
# Kubecost mostra automaticamente i costi aggregati per questi label.
# Es: costo totale team-alpha nel mese = CPU + Memoria + Storage + GPU + Networking
# API Kubecost per report automatici (da inviare via email settimanale):
curl "http://kubecost:9090/model/allocation?window=7d&aggregate=label:team&accumulate=true" \
| jq '.data[0] | to_entries[] | {team: .key, cost: .value.totalCost}'
Otomatik Doğru Boyutlandırma için VPA
Il Dikey Pod Otomatik Ölçekleyici (VPA) geçmiş CPU tüketimini analiz eder ve
Pod belleği ve optimum istekleri hesaplar. Modunda Off (tavsiye
otomatik uygulama olmadan) doğru boyutlandırma için en güvenli araçtır: sağlar
kesinti riski olmadan kesin sayılar.
# Installa VPA
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler
./hack/vpa-up.sh
# Oppure con Helm
helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm install vpa fairwinds-stable/vpa \
--namespace vpa \
--create-namespace
---
# vpa-recommendation.yaml - modalita Off: solo raccomandazioni
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: api-service-vpa
namespace: team-alpha
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: api-service
updatePolicy:
updateMode: "Off" # non applica automaticamente, solo raccomanda
resourcePolicy:
containerPolicies:
- containerName: api
minAllowed:
cpu: 50m
memory: 64Mi
maxAllowed:
cpu: "4"
memory: 8Gi
# Leggi le raccomandazioni dopo 24-48 ore:
kubectl describe vpa api-service-vpa -n team-alpha
# Output:
# Container Recommendations:
# Container Name: api
# Lower Bound:
# Cpu: 120m
# Memory: 256Mi
# Target: <-- usa questi valori nelle requests
# Cpu: 250m
# Memory: 512Mi
# Upper Bound:
# Cpu: 800m
# Memory: 1500Mi
# Uncapped Target:
# Cpu: 230m
# Memory: 480Mi
Toplu Olarak Doğru Boyutlandırma Analizi Komut Dosyası
# Trova tutti i Deployment con requests > 2x il consumo reale
kubectl get vpa -A -o json | jq -r '
.items[] |
.metadata.namespace + "/" + .metadata.name + ": " +
(.status.recommendation.containerRecommendations[]? |
"target CPU=" + .target.cpu + " Mem=" + .target.memory)
'
# Script bash per generare report di rightsizing
#!/bin/bash
echo "=== Rightsizing Recommendations ==="
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
echo "--- Namespace: $ns ---"
kubectl get vpa -n "$ns" -o custom-columns=\
"NAME:.metadata.name,\
TARGET-CPU:.status.recommendation.containerRecommendations[0].target.cpu,\
TARGET-MEM:.status.recommendation.containerRecommendations[0].target.memory" \
2>/dev/null
done
Karpenter: Konsolidasyon ve Spot Bulut Sunucuları
Karpenter maliyetleri iki açıdan optimize ediyor: kullanım örnekleri tespit edin için Düğüm başına maliyeti %60-70 oranında azaltmak, e düğümleri birleştir silmek yeterince kullanılmayanlar (kutu paketleme).
Spot + Konsolidasyonlu NodePool
# karpenter-cost-optimized.yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: cost-optimized
spec:
template:
spec:
nodeClassRef:
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
name: default
requirements:
# Tipi di istanza ottimali per bin-packing (diverse size)
- key: node.kubernetes.io/instance-type
operator: In
values:
- m7i.xlarge # 4 vCPU, 16GB ~$0.20/h on-demand, ~$0.05/h spot
- m7i.2xlarge # 8 vCPU, 32GB
- m7i.4xlarge # 16 vCPU, 64GB
- m7i.8xlarge # 32 vCPU, 128GB
- c7i.2xlarge # CPU-optimized per workload compute-intensive
- r7i.2xlarge # Memory-optimized per carichi con alta RAM
# Mix spot e on-demand con peso
- key: karpenter.sh/capacity-type
operator: In
values:
- spot # priorita spot (economico)
- on-demand # fallback on-demand
disruption:
consolidationPolicy: WhenUnderutilized
consolidateAfter: 1m # consolida subito i nodi sottoutilizzati
limits:
cpu: "1000" # max 1000 vCPU totali
memory: "4000Gi" # max 4TB RAM totale
---
# Configurazione spot interruption handler
# Necessario per gestire le interruzioni spot (AWS invia 2 min di preavviso)
helm install aws-node-termination-handler \
eks/aws-node-termination-handler \
--namespace kube-system \
--set enableSqsTerminationDraining=true \
--set queueURL=https://sqs.eu-west-1.amazonaws.com/123456789/NodeTerminationHandler
Karpenter ile Tasarruf Analizi
# Verifica quale percentuale dei nodi sono spot
kubectl get nodes -o json | jq '
[.items[] |
{type: .metadata.labels["karpenter.sh/capacity-type"],
instance: .metadata.labels["node.kubernetes.io/instance-type"]}
] |
group_by(.type) |
map({type: .[0].type, count: length})'
# Output esempio:
# [{"type": "on-demand", "count": 3}, {"type": "spot", "count": 12}]
# 80% dei nodi sono spot -> risparmio medio 65% = -$2400/mese
# Kubecost: visualizza costo spot vs on-demand storicamente
# Vai in Cost Allocation > Filter by node type
Ad Alanı Bütçesi: Bir FinOps Aracı Olarak ResourceQuota
KaynakKotaları yalnızca teknik izolasyon için değildir; aynı zamanda bir araçtır mali yönetim. Bütçelere göre kotalar atayarak bir sistem oluşturursunuz. Ekipleri optimizasyona iten teşvikler:
# budget-quota-team.yaml
# Calcola le quote basandoti sul budget mensile del team
# Budget: 500 EUR/mese (circa 1500 CPU-hours a 0.033 EUR/CPU-hour)
# Assumendo utilizzo medio 50%: requests max = 2000 CPU-hours / 720 ore = 2.8 vCPU mean
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-alpha-budget-quota
namespace: team-alpha
annotations:
finops/monthly-budget-eur: "500"
finops/last-reviewed: "2026-01-15"
finops/owner: "alice@company.com"
spec:
hard:
# Basato su budget EUR/mese
requests.cpu: "6" # ~500 EUR/mese a tasso medio spot
requests.memory: "12Gi" # proporzionale
requests.storage: "200Gi"
---
# Alert quando il team si avvicina al budget
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: finops-budget-alerts
namespace: monitoring
spec:
groups:
- name: finops
rules:
- alert: TeamBudgetUsageHigh
expr: |
kubecost_namespace_allocation_cpu_cost_hourly * 24 * 30 +
kubecost_namespace_allocation_memory_cost_hourly * 24 * 30 > 400
for: 1h
labels:
severity: warning
annotations:
summary: "Team {{ $labels.namespace }}: costo mensile proiettato > 400 EUR"
Farklı İş Yükleri İçin Tasarruf Stratejileri
| İş yükü türü | Strateji | Beklenen Tasarruflar |
|---|---|---|
| Web API'si (durum bilgisi olmayan) | Spot + HPA + doğru boyutlandırma VPA | %50-65 |
| Makine öğrenimi toplu işleri | Nokta + denetim noktası + sıfıra ölçeklendirme | %60-70 |
| Veritabanları (durum bilgisi olan) | İsteğe bağlı ayrılmış + doğru boyutlandırma | %20-30 |
| CI/CD koşucuları | Nokta + sıfıra ölçeklendirme (KEDA) | %70-80 |
| Kritik hizmetler 7/24 | Ayrılmış örnekler + doğru boyutlandırma | %30-40 |
KEDA + Spot ile CI/CD İş Optimizasyonu
# Runners CI/CD sono idle la maggior parte del tempo:
# scala a 0 quando non ci sono job, usa spot
# KEDA ScaledJob per runner GitHub Actions
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: github-actions-runner
namespace: actions-runners
spec:
jobTargetRef:
template:
spec:
containers:
- name: runner
image: summerwind/actions-runner:latest
resources:
limits:
cpu: "2"
memory: "4Gi"
nodeSelector:
karpenter.sh/capacity-type: spot # usa spot per runners
tolerations:
- key: "spot"
operator: "Exists"
effect: "NoSchedule"
pollingInterval: 30
minReplicaCount: 0 # scala a 0 quando nessun job
maxReplicaCount: 20 # massimo 20 runner paralleli
triggers:
- type: github-runner
metadata:
owner: "myorg"
repos: "myrepo"
targetWorkflowQueueLength: "1"
Grafana ile FinOps Kontrol Paneli
# PromQL queries per dashboard FinOps Kubernetes
# Costo orario totale del cluster
sum(
kube_pod_container_resource_requests{resource="cpu"} * 0.033 +
kube_pod_container_resource_requests{resource="memory"} / 1073741824 * 0.004
) by (namespace)
# Efficienza CPU per namespace (utilizzo reale / requested)
sum(rate(container_cpu_usage_seconds_total[5m])) by (namespace) /
sum(kube_pod_container_resource_requests{resource="cpu"}) by (namespace) * 100
# Pod con requests molto piu alte del consumo reale (spreco > 70%)
(
kube_pod_container_resource_requests{resource="cpu"} -
rate(container_cpu_usage_seconds_total[24h])
) / kube_pod_container_resource_requests{resource="cpu"} > 0.7
# Importa il dashboard Grafana Kubecost: ID 11270
Kubernetes için FinOps En İyi Uygulamaları
Aylık FinOps Kontrol Listesi
- VPA önerilerini inceleyin: VPA önerilerini analiz edin ve İlk 10 israfa doğru boyutlandırma uygulayın
- Boş düğümleri kontrol edin: 24 saat boyunca CPU ve bellek kullanımı %10'un altında olan düğümler sonlandırılmalıdır (Karpenter bunu otomatik olarak yapar)
- Spot kapsamını kontrol edin: Hedef, spot örneklerdeki durum bilgisi olmayan düğümlerin %70-80'ini oluşturmaktır
- Ters ibraz raporları: Ekip başına aylık maliyet raporunu Kubecost API → e-posta veya Slack aracılığıyla gönderin
- Kaynak Kotasını İnceleyin: Kotaları varsayılan olarak değil, yalnızca iş gerekçesi ile artırın
- Geliştirme ortamları için sıfıra ölçeklendirme: Geliştirme ortamları iş saatleri dışında kapatılmalıdır (maliyette %65 azalma)
Sonuçlar ve Sonraki Adımlar
Kubernetes için FinOps tek seferlik bir optimizasyon değildir; devam eden bir süreçtir. görünürlük (Kubecost), akıllı öneriler (VPA), verimli provizyon gerektirir (Ticari olarak Karpenter) ve organizasyonel yönetişim (bütçe olarak KaynakKotası). Uygulama tüm bu tekniklerin bir araya getirilmesiyle kuruluşlar genellikle İlk 3-6 ayda Kubernetes bulut faturanızda %35-55.
Bir sonraki adım FinOps Kubernetes'i geliştirme döngüsüne entegre etmektir: geliştiriciler üretime geçmeden önce dağıtımlarının tahmini maliyetini görmeleri gerekir — maliyetlere uygulanan "sola kaydırma" yaklaşımı.







