writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
optimize-cloud-costsKubecostを使用した可視化、ライトサイジング推奨、水平および垂直ポッドオートスケーリング、 スポット/プリエンプティブルインスタンス、リソースクォータなどのツールを活用した、 Kubernetesワークロードのクラウドコスト最適化戦略の実装。コスト配分、ショーバック レポート、継続的な最適化プラクティスを網羅する。クラウドコストがビジネス価値に比例せず 増大している時、リソースリクエストが実際の使用量と一致していない時、手動スケーリングが 過剰プロビジョニングにつながる時、または内部コスト説明責任のためにショーバックと チャージバックを実装する時に使用する。
Independent GitHub snapshot · Automated classification · Original documentation governs
クラウド支出を削減するためのKubernetesクラスターの包括的なコスト最適化戦略を実装する。
完全な設定ファイルとテンプレートについてはExtended Examplesを参照。
コストモニタリングと配分のためにKubecostまたはOpenCostをインストールする。
Kubecostのインストール:
# 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
クラウドプロバイダー統合の設定:
# 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"
}
クラウド統合を適用する:
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 .
期待結果: Kubecostポッドが正常に実行されている。ネームスペース、デプロイメント、ポッド別のコスト内訳を表示するUIにアクセスできる。クラウドプロバイダーコストがインポートされている(初回同期には24-48時間かかる場合がある)。APIがアロケーションデータを返している。
失敗時:
kubectl get svc -n monitoring prometheus-serverkubectl logs -n kubecost -l app=cost-analyzer -c cost-model過剰プロビジョニングされたリソースと最適化の機会を特定する。
リソース使用率を照会する:
# 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の推奨を使用する:
# 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)
使用率ダッシュボードを作成する:
# grafana-utilization-dashboard.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: utilization-dashboard
namespace: monitoring
# ... (see EXAMPLES.md for complete configuration)
期待結果: 現在のリソースリクエストと実際の使用量の明確なビュー。使用率30%未満のポッド(過剰プロビジョニング)の特定。推定節約額付きの最適化機会のリスト。時系列の使用率トレンドを表示するダッシュボード。
失敗時:
kubectl get deployment metrics-server -n kube-systemcurl http://prometheus:9090/api/v1/query?query=node_cpu_seconds_totalCPU、メモリ、またはカスタムメトリクスに基づく自動スケーリングを設定する。
CPUベースのスケーリング用HPAを作成する:
# hpa-cpu.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
namespace: production
# ... (see EXAMPLES.md for complete configuration)
HPAのデプロイと検証:
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
期待結果: HPAが作成され、現在/目標メトリクスを表示している。負荷時にポッドがスケールアップする。負荷が減少するとポッドがスケールダウンする(安定化ウィンドウ後)。スケーリングイベントがログに記録される。スラッシング(急速なスケールアップ/ダウンサイクル)がない。
失敗時:
kubectl get apiservice v1beta1.metrics.k8s.iokubectl describe hpa api-server-hpa -n productionkubectl logs -n kube-system -l app=kube-controller-manager | grep horizontal-pod-autoscaler実際の使用パターンに基づいてリソースリクエストを自動調整する。
VPAのインストール:
# 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ポリシーを作成する:
# vpa-policies.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: api-server-vpa
namespace: production
# ... (see EXAMPLES.md for complete configuration)
VPAのデプロイとモニタリング:
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
# Compare recommendations to current requests
kubectl get deployment api-server -n production -o json | \
jq '.spec.template.spec.containers[].resources.requests'
期待結果: VPAが推奨を提供するか、リソースリクエストを自動更新している。推奨がパーセンタイル使用パターン(通常P95)に基づいている。Auto/Recreateモードを使用している場合、ポッドが新しいリクエストで再起動される。HPAとVPAの間に競合がない(HPAはレプリカ用、VPAはポッドごとのリソース用に使用する)。
失敗時:
kubectl get pods -n kube-system | grep vpakubectl logs -n kube-system -l app=vpa-admission-controllerkubectl get mutatingwebhookconfigurations vpa-webhook-configコスト効率の高いスポットインスタンスでのワークロードスケジューリングを設定する。
スポットインスタンスでノードプールを作成する:
# For AWS (via Karpenter)
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: spot-provisioner
spec:
# ... (see EXAMPLES.md for complete configuration)
スポットインスタンス用にワークロードを設定する:
# spot-workload.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: batch-processor
namespace: production
# ... (see EXAMPLES.md for complete configuration)
スポット使用状況のデプロイとモニタリング:
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)
期待結果: ワークロードがスポットノードに正常にスケジュールされている。大幅なコスト削減(通常オンデマンドと比較して60-90%)。スポット中断のポッド再スケジューリングによる優雅な処理。モニタリングがスポット中断率と正常な復旧を示している。
失敗時:
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenterコスト制御のためのハードリミットとアラートを設定する。
リソースクォータを作成する:
# resource-quotas.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: production-quota
namespace: production
# ... (see EXAMPLES.md for complete configuration)
予算アラートを設定する:
# kubecost-budget-alerts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: budget-alerts
namespace: kubecost
# ... (see EXAMPLES.md for complete configuration)
適用とモニタリング:
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)
期待結果: リソースクォータがネームスペースごとの制限を強制している。クォータ超過時にポッド作成がブロックされる。閾値を超えた時に予算アラートが発火する。コストスパイク検出が機能している。ステークホルダーに定期的なレポートが送信される。
失敗時:
kubectl get resourcequota,limitrange -Akubectl get events -n production | grep quotakubectl logs -n kubecost -l app=cost-analyzer | grep alertcurl http://prometheus:9090/api/v1/query?query=kubecost_monthly_cost積極的すぎるライトサイジング: VPAの推奨をすぐに適用しない。「Off」モードで開始し、1週間推奨をレビューしてから徐々に適用する。急激な変更はOOMKillやCPUスロットリングを引き起こす可能性がある。
HPAとVPAの競合: 同じメトリクス(CPU/メモリ)でHPAとVPAを同時に使用しない。水平スケーリングにはHPAを、ポッドごとのリソースチューニングにはVPAを使用するか、カスタムメトリクスのHPA + リソースのVPAを使用する。
フォールトトレランスなしのスポット: フォールトトレラントでステートレスなワークロードのみをスポットで実行する。データベース、ステートフルサービス、または単一レプリカのクリティカルサービスは不可。常にPodDisruptionBudgetを使用する。
不十分なモニタリング期間: コスト最適化の決定には過去データが必要。変更前に少なくとも7日、VPA推奨には30日、トレンド分析には90日待つ。
バースト要件の無視: 平均使用量に基づいて制限を低く設定しすぎると、トラフィックスパイク時にスロットリングが発生する。キャパシティプランニングには平均ではなくP95またはP99パーセンタイルを使用する。
ネットワークエグレスコスト: Kubecostではコンピュートコストが可視化されるが、エグレス(データ転送)も大きくなる可能性がある。クロスAZトラフィックをモニタリングし、トポロジー対応ルーティングを使用し、アーキテクチャでデータ転送コストを考慮する。
ストレージの見落とし: PersistentVolumeコストが忘れられがち。未使用のPVCを監査し、ボリュームをライトサイジングし、過剰プロビジョニングの代わりにボリューム拡張を使用し、PVクリーンアップポリシーを実装する。
制限的すぎるクォータ: クォータを低く設定しすぎると正当な成長がブロックされる。クォータ使用量を月次でレビューし、実際のニーズに基づいて調整し、強制前にチームに制限を伝える。
間違ったメトリクスからの偽りの節約: CPU/メモリのみを最適化メトリクスとして使用すると、I/O、ネットワーク、ストレージコストを見逃す。コンピュートだけでなく、総所有コストを考慮する。
信頼前のチャージバック: チームがコストデータを理解し信頼する前にチャージバックを実装すると摩擦が生じる。ショーバック(情報提供)から始め、コスト意識の文化を構築してからチャージバックに移行する。
deploy-to-kubernetes — 適切なリソースリクエストを持つアプリケーションデプロイメントsetup-prometheus-monitoring — コストメトリクス用のモニタリングインフラストラクチャplan-capacity — コストとパフォーマンスに基づくキャパシティプランニングsetup-local-kubernetes — クラウドコストを回避するためのローカル開発write-helm-chart — リソースリクエストとリミットのテンプレート化implement-gitops-workflow — コスト最適化された設定のためのGitOps