optimize-cloud-costs
정보
이 스킬은 Kubecost와 같은 도구를 활용해 오토스케일링, 적정 사이징, 스팟 인스턴스 등의 전략을 구현함으로써 개발자가 Kubernetes 클라우드 비용을 최적화하도록 돕습니다. 내부 책임 소재를 위해 비용 가시성, 배분, 쇼백 보고 기능을 제공합니다. 클라우드 비용이 불균형하게 증가하거나, 리소스 사용이 비효율적일 때, 또는 비용 청구 관행을 도입해야 할 때 사용하세요.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/optimize-cloud-costsClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
name: optimize-cloud-costs description: > Cloud-Kostenoptimierungsstrategien fuer Kubernetes-Workloads implementieren mit Tools wie Kubecost fuer Sichtbarkeit, Right-Sizing-Empfehlungen, horizontalem und vertikalem Pod-Autoscaling, Spot-/Preemptible-Instanzen und Ressourcenkontingenten. Behandelt Kostenzuordnung, Showback-Reporting und kontinuierliche Optimierungspraktiken. Einsatz wenn Cloud-Kosten ohne proportionalen Geschaeftswert steigen, Ressourcenanforderungen nicht mit der tatsaechlichen Nutzung uebereinstimmen, manuelle Skalierung zu Ueberbereitstellung fuehrt oder Showback und Chargeback fuer interne Kostenverantwortlichkeit implementiert werden sollen. locale: de source_locale: en source_commit: 6f65f316 translator: claude-sonnet-4-6 translation_date: 2026-03-16 license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: devops complexity: intermediate language: multi tags: cost-optimization, kubecost, hpa, vpa, spot-instances, resource-management, kubernetes
Cloud-Kosten optimieren
Umfassende Kostenoptimierungsstrategien fuer Kubernetes-Cluster implementieren, um Cloud-Ausgaben zu reduzieren.
Wann verwenden
- Cloud-Infrastrukturkosten steigen ohne entsprechende Geschaeftswertszunahme
- Sichtbarkeit in Kostenzuordnung nach Team, Anwendung oder Umgebung benoetigt
- Ressourcenanforderungen/-limits nicht mit tatsaechlichen Nutzungsmustern abgestimmt
- Manuelle Skalierung fuehrt zu Ueberbereitstellung und Verschwendung
- Spot-/Preemptible-Instanzen fuer nicht-kritische Workloads nutzen
- Showback oder Chargeback fuer interne Kostenzuordnung implementieren
- FinOps-Kultur mit Kostenbewusstsein und Verantwortlichkeit aufbauen
Eingaben
- Erforderlich: Kubernetes-Cluster mit laufenden Workloads
- Erforderlich: Cloud-Provider-Billing-API-Zugriff
- Erforderlich: Metrics-Server oder Prometheus fuer Ressourcenmetriken
- Optional: Historische Nutzungsdaten fuer Trendanalyse
- Optional: Kostenzuordnungsanforderungen (nach Namespace, Label, Team)
- Optional: Service-Level-Objectives (SLOs) fuer Leistungseinschraenkungen
- Optional: Budgetlimits oder Kostensenkungsziele
Vorgehensweise
Siehe Erweiterte Beispiele fuer vollstaendige Konfigurationsdateien und Vorlagen.
Schritt 1: Kostenanalyse-Tools deployen
Kubecost oder OpenCost fuer Kostenmonitoring und -zuordnung installieren.
Kubecost installieren:
# Add Kubecost Helm repository
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update
# Install Kubecost with Prometheus integration
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost \
--create-namespace \
--set kubecostToken="your-token-here" \
--set prometheus.server.global.external_labels.cluster_id="production-cluster" \
--set prometheus.nodeExporter.enabled=true \
--set prometheus.serviceAccounts.nodeExporter.create=true
# For existing Prometheus, configure Kubecost to use it
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost \
--create-namespace \
--set prometheus.enabled=false \
--set global.prometheus.fqdn="http://prometheus-server.monitoring.svc.cluster.local" \
--set global.prometheus.enabled=true
# Verify installation
kubectl get pods -n kubecost
kubectl get svc -n kubecost
# Access Kubecost UI
kubectl port-forward -n kubecost svc/kubecost-cost-analyzer 9090:9090
# Open http://localhost:9090
Cloud-Provider-Integration konfigurieren:
# kubecost-cloud-integration.yaml
apiVersion: v1
kind: Secret
metadata:
name: cloud-integration
namespace: kubecost
type: Opaque
stringData:
# For AWS
cloud-integration.json: |
{
"aws": [
{
"serviceKeyName": "AWS_ACCESS_KEY_ID",
"serviceKeySecret": "AWS_SECRET_ACCESS_KEY",
"athenaProjectID": "cur-query-results",
"athenaBucketName": "s3://your-cur-bucket",
"athenaRegion": "us-east-1",
"athenaDatabase": "athenacurcfn_my_cur",
"athenaTable": "my_cur"
}
]
}
---
# For GCP
apiVersion: v1
kind: Secret
metadata:
name: gcp-key
namespace: kubecost
type: Opaque
data:
key.json: <base64-encoded-service-account-key>
---
# For Azure
apiVersion: v1
kind: ConfigMap
metadata:
name: azure-config
namespace: kubecost
data:
azure.json: |
{
"azureSubscriptionID": "your-subscription-id",
"azureClientID": "your-client-id",
"azureClientSecret": "your-client-secret",
"azureTenantID": "your-tenant-id",
"azureOfferDurableID": "MS-AZR-0003P"
}
Cloud-Integration anwenden:
kubectl apply -f kubecost-cloud-integration.yaml
# Verify cloud costs are being imported
kubectl logs -n kubecost -l app=cost-analyzer -c cost-model --tail=100 | grep -i "cloud"
# Check Kubecost API for cost data
kubectl port-forward -n kubecost svc/kubecost-cost-analyzer 9090:9090 &
curl http://localhost:9090/model/allocation\?window\=7d | jq .
Erwartet: Kubecost-Pods laufen erfolgreich. UI zeigt Kostenaufteilung nach Namespace, Deployment, Pod. Cloud-Provider-Kosten werden importiert (kann 24-48 Stunden fuer initiale Synchronisation dauern). API liefert Zuordnungsdaten zurueck.
Bei Fehler:
- Pruefen, ob Prometheus laeuft und erreichbar ist:
kubectl get svc -n monitoring prometheus-server - Pruefen, ob Cloud-Credentials Billing-API-Zugriff haben
- Cost-Model-Logs pruefen:
kubectl logs -n kubecost -l app=cost-analyzer -c cost-model - Sicherstellen, dass Metrics-Server oder Prometheus Node-Exporter Ressourcenmetriken sammelt
Schritt 2: Aktuelle Ressourcenauslastung analysieren
Ueberbereitgestellte Ressourcen und Optimierungsmoeglichkeiten identifizieren.
Ressourcenauslastung abfragen:
# Get resource requests vs usage for all pods
kubectl top pods --all-namespaces --containers | \
awk 'NR>1 {print $1,$2,$3,$4,$5}' > current-usage.txt
# Compare requests to actual usage
cat <<'EOF' > analyze-utilization.sh
#!/bin/bash
echo "Pod,Namespace,CPU-Request,CPU-Usage,Memory-Request,Memory-Usage"
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
kubectl get pods -n $ns -o json | jq -r '
.items[] |
select(.status.phase == "Running") |
{
name: .metadata.name,
namespace: .metadata.namespace,
containers: [
.spec.containers[] |
{
name: .name,
cpuReq: .resources.requests.cpu,
memReq: .resources.requests.memory
}
]
} |
"\(.name),\(.namespace),\(.containers[].cpuReq // "none"),\(.containers[].memReq // "none")"
' 2>/dev/null
done
EOF
chmod +x analyze-utilization.sh
./analyze-utilization.sh > resource-requests.csv
# Get actual usage from metrics server
kubectl top pods --all-namespaces --containers > actual-usage.txt
Kubecost-Empfehlungen nutzen:
# Get right-sizing recommendations via API
curl "http://localhost:9090/model/savings/requestSizing?window=7d" | jq . > recommendations.json
# Extract top wasteful resources
jq '.data[] | select(.totalRecommendedSavings > 10) | {
cluster: .clusterID,
# ... (see EXAMPLES.md for complete configuration)
Erwartet: Klare Uebersicht ueber aktuelle Ressourcenanforderungen vs tatsaechliche Nutzung. Identifikation von Pods mit <30% Auslastung (ueberbereitgestellt). Liste von Optimierungsmoeglichkeiten mit geschaetzten Einsparungen.
Bei Fehler:
- Sicherstellen, dass Metrics-Server laeuft:
kubectl get deployment metrics-server -n kube-system - Pruefen, ob Prometheus Node-Exporter-Metriken hat:
curl http://prometheus:9090/api/v1/query?query=node_cpu_seconds_total - Pruefen, ob Pods lange genug gelaufen sind fuer aussagekraeftige Daten (mindestens 24 Stunden)
Schritt 3: Horizontales Pod-Autoscaling (HPA) implementieren
Automatische Skalierung basierend auf CPU, Speicher oder benutzerdefinierten Metriken konfigurieren.
HPA fuer CPU-basierte Skalierung erstellen:
# hpa-cpu.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
namespace: production
# ... (see EXAMPLES.md for complete configuration)
HPA deployen und pruefen:
kubectl apply -f hpa-cpu.yaml
# Check HPA status
kubectl get hpa -n production
kubectl describe hpa api-server-hpa -n production
# Monitor scaling events
kubectl get events -n production --field-selector involvedObject.kind=HorizontalPodAutoscaler --watch
# Generate load to test autoscaling
kubectl run load-generator --rm -it --image=busybox -- /bin/sh -c \
"while true; do wget -q -O- http://api-server.production.svc.cluster.local; done"
# Watch replicas scale
watch kubectl get hpa,deployment -n production
Erwartet: HPA erstellt und zeigt aktuelle/Ziel-Metriken. Pods skalieren unter Last hoch. Pods skalieren herunter, wenn Last nachlasst (nach Stabilisierungsfenster). Skalierungsereignisse protokolliert. Kein Thrashing (schnelle Auf-/Ab-Skalierungszyklen).
Bei Fehler:
- Pruefen, ob Metrics-Server laeuft:
kubectl get apiservice v1beta1.metrics.k8s.io - Pruefen, ob Deployment Ressourcenanforderungen gesetzt hat (HPA erfordert dies)
- HPA-Ereignisse pruefen:
kubectl describe hpa api-server-hpa -n production - Sicherstellen, dass Ziel-Deployment nicht bei maximalen Replikas ist
Schritt 4: Vertikales Pod-Autoscaling (VPA) konfigurieren
Ressourcenanforderungen basierend auf tatsaechlichen Nutzungsmustern automatisch anpassen.
VPA installieren:
# Clone VPA repository
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler
# Install VPA
./hack/vpa-up.sh
# Verify installation
kubectl get pods -n kube-system | grep vpa
# Check VPA CRDs
kubectl get crd | grep verticalpodautoscaler
VPA-Richtlinien erstellen:
# vpa-policies.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: api-server-vpa
namespace: production
# ... (see EXAMPLES.md for complete configuration)
VPA deployen und ueberwachen:
kubectl apply -f vpa-policies.yaml
# Check VPA recommendations
kubectl get vpa -n production
kubectl describe vpa api-server-vpa -n production
# View detailed recommendations
kubectl get vpa api-server-vpa -n production -o jsonpath='{.status.recommendation}' | jq .
# Monitor VPA-initiated pod updates
kubectl get events -n production --field-selector involvedObject.kind=VerticalPodAutoscaler --watch
Erwartet: VPA liefert Empfehlungen oder aktualisiert Ressourcenanforderungen automatisch. Empfehlungen basieren auf Perzentil-Nutzungsmustern (typischerweise P95). Pods werden mit neuen Anforderungen neu gestartet bei Verwendung von Auto/Recreate-Modus. Keine Konflikte zwischen HPA und VPA (HPA fuer Replikas, VPA fuer Ressourcen pro Pod verwenden).
Bei Fehler:
- Sicherstellen, dass Metrics-Server ausreichend Daten hat (VPA benoetigt mehrere Tage fuer genaue Empfehlungen)
- VPA-Komponenten laufend pruefen:
kubectl get pods -n kube-system | grep vpa - VPA nicht und HPA auf demselben Metrik (CPU/Speicher) verwenden - verursacht Konflikte
Schritt 5: Spot-/Preemptible-Instanzen nutzen
Workload-Planung auf kostenguenstigen Spot-Instanzen konfigurieren.
Node-Pools mit Spot-Instanzen erstellen:
# For AWS (via Karpenter)
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: spot-provisioner
spec:
# ... (see EXAMPLES.md for complete configuration)
Workloads fuer Spot-Instanzen konfigurieren:
# spot-workload.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: batch-processor
namespace: production
# ... (see EXAMPLES.md for complete configuration)
Deployen und Spot-Nutzung ueberwachen:
kubectl apply -f spot-workload.yaml
# Monitor spot node allocation
kubectl get nodes -l node-type=spot
# Check workload distribution
# ... (see EXAMPLES.md for complete configuration)
Erwartet: Workloads werden erfolgreich auf Spot-Nodes geplant. Erhebliche Kosteneinsparung (typischerweise 60-90% vs On-Demand). Elegante Behandlung von Spot-Unterbrechungen mit Pod-Neuplanung. Monitoring zeigt Spot-Unterbrechungsrate und erfolgreiche Wiederherstellung.
Bei Fehler:
- Spot-Instanz-Verfuegbarkeit in Region/Zonen pruefen
- Node-Labels und -Taints mit Workload-Tolerations abgleichen
- Karpenter-Logs pruefen:
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter - Sicherstellen, dass Workloads zustandslos sind oder ordentliches Zustandsmanagement fuer Unterbrechungen haben
Schritt 6: Ressourcenkontingente und Budget-Alerts implementieren
Harte Limits und Alarmierung fuer Kostenkontrolle einrichten.
Ressourcenkontingente erstellen:
# resource-quotas.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
# ... (see EXAMPLES.md for complete configuration)
Budget-Alerts konfigurieren:
# kubecost-budget-alerts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: budget-alerts
namespace: kubecost
# ... (see EXAMPLES.md for complete configuration)
Anwenden und ueberwachen:
kubectl apply -f resource-quotas.yaml
kubectl apply -f kubecost-budget-alerts.yaml
# Check quota usage
kubectl get resourcequota -n production
kubectl describe resourcequota production-quota -n production
# ... (see EXAMPLES.md for complete configuration)
Erwartet: Ressourcenkontingente setzen Limits pro Namespace durch. Pod-Erstellung wird blockiert, wenn Kontingent ueberschritten. Budget-Alerts loesen aus, wenn Schwellenwerte ueberschritten werden. Kostenspitzen-Erkennung funktioniert. Regelmaessige Berichte an Stakeholder gesendet.
Bei Fehler:
- Pruefen, ob ResourceQuota und LimitRange korrekt angewendet:
kubectl get resourcequota,limitrange -A - Auf Pods pruefen, die wegen Kontingent fehlschlagen:
kubectl get events -n production | grep quota - Kubecost-Alert-Konfiguration pruefen:
kubectl logs -n kubecost -l app=cost-analyzer | grep alert
Validierung
- Kubecost oder OpenCost deployed und zeigt genaue Kostendaten
- Cloud-Provider-Billing-Integration funktioniert (Kosten stimmen mit tatsaechlichen Rechnungen ueberein)
- Ressourcenauslastungsanalyse identifiziert ueberbereitgestellte Workloads
- HPA skaliert Pods basierend auf Last (mit Lasttest verifiziert)
- VPA liefert Empfehlungen oder passt Ressourcenanforderungen automatisch an
- Spot-Instanzen behandeln Unterbrechungen elegant
- Ressourcenkontingente setzen Limits pro Namespace durch
- Budget-Alerts loesen aus, wenn Schwellenwerte ueberschritten werden
- Monatliche Kosten sinken oder bleiben im Budget
- Showback-Berichte fuer Teams/Projekte generiert
- Keine Leistungsverschlechterung durch Kostenoptimierungen
- Dokumentation mit Optimierungspraktiken aktualisiert
Haeufige Stolperfallen
-
Aggressives Right-Sizing: VPA-Empfehlungen nicht sofort anwenden. Mit "Off"-Modus beginnen, Vorschlaege eine Woche pruefen, dann schrittweise anwenden. Ploetzliche Aenderungen koennen OOMKills oder CPU-Drosselung verursachen.
-
HPA + VPA Konflikt: HPA und VPA nie auf demselben Metrik (CPU/Speicher) verwenden. HPA fuer horizontale Skalierung, VPA fuer Pod-Ressourcen-Feinabstimmung, oder HPA auf benutzerdefinierten Metriken + VPA auf Ressourcen verwenden.
-
Spot ohne Fehlertoleranz: Nur fehlertolerante, zustandslose Workloads auf Spot laufen lassen. Nie Datenbanken, zustandsbehaftete Services oder Single-Replica-kritische Services. Immer PodDisruptionBudgets verwenden.
-
Ungenuegender Monitoring-Zeitraum: Kostenoptimierungsentscheidungen benoetigen historische Daten. Mindestens 7 Tage vor Aenderungen warten, 30 Tage fuer VPA-Empfehlungen, 90 Tage fuer Trendanalyse.
-
Burst-Anforderungen ignorieren: Limits zu niedrig basierend auf Durchschnittsnutzung setzen verursacht Drosselung bei Traffic-Spitzen. P95 oder P99 Perzentile fuer Kapazitaetsplanung verwenden, nicht Durchschnitt.
-
Netzwerk-Egress-Kosten: Compute-Kosten in Kubecost sichtbar, aber Egress (Datentransfer) kann erheblich sein. Cross-AZ-Traffic ueberwachen, topologiebewusstes Routing verwenden.
-
Speicher uebersehen: PersistentVolume-Kosten oft vergessen. Ungenutzte PVCs auditieren, Volumes richtig groessen, Volume-Erweiterung statt Ueberbereitstellung verwenden.
-
Kontingent zu restriktiv: Kontingente zu niedrig setzen blockiert legitimes Wachstum. Kontingentnutzung monatlich pruefen, basierend auf tatsaechlichem Bedarf anpassen.
-
Falsche Einsparungen durch falsche Metriken: CPU/Speicher als einzigen Optimierungsmetrik verwenden, verfehlt E/A-, Netzwerk-, Speicherkosten. Gesamtbetriebskosten beruecksichtigen, nicht nur Compute.
-
Chargeback vor Vertrauen: Chargeback implementieren, bevor Teams Kostendaten verstehen und ihnen vertrauen, verursacht Reibung. Mit Showback (informativ) beginnen, Kostenbewusstseinskultur aufbauen, dann zu Chargeback wechseln.
Verwandte Skills
deploy-to-kubernetes- Anwendungs-Deployment mit geeigneten Ressourcenanforderungensetup-prometheus-monitoring- Monitoring-Infrastruktur fuer Kostenmetrikenplan-capacity- Kapazitaetsplanung basierend auf Kosten und Leistungsetup-local-kubernetes- Lokale Entwicklung zur Vermeidung von Cloud-Kostenwrite-helm-chart- Templating von Ressourcenanforderungen und -limitsimplement-gitops-workflow- GitOps fuer kostenoptimierte Konfigurationen
GitHub 저장소
연관 스킬
executing-plans
디자인executing-plans 스킬은 검토 체크포인트가 포함된 통제된 배치로 실행할 완전한 구현 계획이 있을 때 사용합니다. 이 스킬은 계획을 불러와 비판적으로 검토한 후, 소규모 배치(기본값 3개 작업)로 작업을 실행하면서 각 배치 사이에 진행 상황을 아키텍트 검토를 위해 보고합니다. 이를 통해 내재된 품질 관리 체크포인트를 갖춘 체계적인 구현이 보장됩니다.
requesting-code-review
디자인이 스킬은 코드 변경 사항을 요구 사항에 따라 분석하기 위해 코드 리뷰어 하위 에이전트를 호출합니다. 작업 완료 후, 주요 기능 구현 후, 또는 메인 브랜치에 병합하기 전에 사용해야 합니다. 이 리뷰는 현재 구현체와 원래 계획을 비교하여 문제를 조기에 발견하는 데 도움이 됩니다.
connect-mcp-server
디자인이 스킬은 개발자들이 HTTP, stdio 또는 SSE 전송 방식을 통해 MCP 서버를 Claude Code에 연결하는 포괄적인 가이드를 제공합니다. GitHub, Notion 및 사용자 정의 API와 같은 외부 서비스를 통합하기 위한 설치, 구성, 인증 및 보안을 다룹니다. MCP 통합 설정, 외부 도구 구성 또는 Claude의 모델 컨텍스트 프로토콜 작업 시 활용하세요.
web-cli-teleport
디자인이 스킬은 작업 분석을 기반으로 개발자가 Claude Code 웹 인터페이스와 CLI 인터페이스 중 선택할 수 있도록 돕고, 두 환경 간 원활한 세션 텔레포트를 가능하게 합니다. 웹, CLI 또는 모바일 환경 전환 시 세션 상태와 컨텍스트를 관리하여 워크플로를 최적화합니다. 다양한 단계에서 서로 다른 도구가 필요한 복잡한 프로젝트에 사용하세요.
