Skip to content

コスト管理と最適化

対応バージョン: EKS 1.29+, EKS Auto Mode GA 最終更新: July 11, 2026

このガイドでは、EKS Auto Mode のコスト最適化戦略について説明します。コスト分析、Spot 節約額の測定、リソースの適正化、Savings Plans との統合を含みます。

2026 年 7 月更新: GPU 管理料金を最大 60% 削減

2026 年 7 月 1 日より、GPU および高速化インスタンスタイプに対する EKS Auto Mode の管理料金が削減されました。

  • G-series: 管理料金を 35% 削減
  • P-series and AWS Trainium: 管理料金を 60% 削減

この削減は、EKS Auto Mode が利用可能なすべての AWS Region のすべての Auto Mode クラスターに自動的に適用されます。対応は不要です。Auto Mode には、高速化ワークロード向けに構築された機能が含まれています。たとえば、ローカル NVMe ストレージを備えた GPU インスタンスでのイメージの並列プルと展開(大きなコンテナイメージやモデルイメージをより速く起動するため)、GPU ハードウェア障害を検出して異常なノードを自動的に置き換える、アクセラレータを認識したノード修復などです。更新後の料金表については、Amazon EKS pricing を参照してください。(発表)


コスト最適化のベストプラクティス

yaml
# cost-optimization-best-practices.yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: cost-optimized
spec:
  template:
    spec:
      requirements:
        # 1. Allow various instance families
        - key: karpenter.k8s.aws/instance-category
          operator: In
          values: ["m", "c", "r", "i", "d"]

        # 2. Include Graviton (ARM) instances (20% cheaper)
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64", "arm64"]

        # 3. Prioritize Spot instances
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot", "on-demand"]

      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default

  # 4. Aggressive Consolidation
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 1m
---
# Pod settings for cost optimization
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cost-efficient-app
spec:
  replicas: 5
  template:
    spec:
      # Prefer Spot
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              preference:
                matchExpressions:
                  - key: karpenter.sh/capacity-type
                    operator: In
                    values: ["spot"]

      # Appropriate resource requests (prevent overprovisioning)
      containers:
        - name: app
          resources:
            requests:
              cpu: 250m      # Based on actual usage
              memory: 256Mi
            limits:
              cpu: 500m
              memory: 512Mi

コスト分析ダッシュボード

CloudWatch コストメトリクス

Auto Mode のコストを追跡するために CloudWatch ダッシュボードを設定します。

json
{
  "widgets": [
    {
      "type": "metric",
      "properties": {
        "title": "Node Hours by Capacity Type",
        "metrics": [
          ["Karpenter", "karpenter_nodes_total", "capacity_type", "spot"],
          ["Karpenter", "karpenter_nodes_total", "capacity_type", "on-demand"]
        ],
        "period": 3600,
        "stat": "Average"
      }
    },
    {
      "type": "metric",
      "properties": {
        "title": "Node Provisioning Rate",
        "metrics": [
          ["Karpenter", "karpenter_nodeclaims_created"],
          ["Karpenter", "karpenter_nodeclaims_terminated"]
        ],
        "period": 3600,
        "stat": "Sum"
      }
    }
  ]
}

Kubecost 統合

詳細なコスト配分には、Kubecost を統合します。

bash
# Install Kubecost
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost \
  --create-namespace \
  --set kubecostToken="<your-token>"

Auto Mode における主要な Kubecost メトリクス:

メトリクス説明ユースケース
クラスターコスト合計コンピュート支出予算追跡
Namespace コストNamespace ごとのコストチャージバック
Pod コストワークロードごとのコスト最適化対象
アイドルコスト未使用リソース適正化の機会
Spot 節約額Spot と On-Demand の差分Spot 戦略の検証

Spot Instance の節約額を測定する

実際の Spot 節約額を計算する

bash
# Get current node distribution
kubectl get nodes -L karpenter.sh/capacity-type -L node.kubernetes.io/instance-type | \
  awk 'NR>1 {print $6, $7}' | sort | uniq -c

Spot 節約額分析スクリプト

bash
#!/bin/bash
# spot-savings-analysis.sh

# Get Spot and On-Demand node counts
SPOT_NODES=$(kubectl get nodes -l karpenter.sh/capacity-type=spot --no-headers | wc -l)
OD_NODES=$(kubectl get nodes -l karpenter.sh/capacity-type=on-demand --no-headers | wc -l)

echo "Current Node Distribution:"
echo "  Spot nodes: $SPOT_NODES"
echo "  On-Demand nodes: $OD_NODES"
echo "  Spot percentage: $(echo "scale=2; $SPOT_NODES * 100 / ($SPOT_NODES + $OD_NODES)" | bc)%"

# Estimate savings (assuming average 70% Spot discount)
echo ""
echo "Estimated Monthly Savings:"
echo "  If all were On-Demand: \$X,XXX"
echo "  With current Spot mix: \$X,XXX"
echo "  Monthly savings: \$X,XXX (XX%)"

AWS Cost Explorer クエリ

Cost Explorer を使用して Auto Mode のコストを分析します。

  1. タグでフィルター: eks:cluster-name = your-cluster
  2. グループ化: Instance Type または Purchase Option
  3. 期間: 過去 30 日間
  4. 比較: Spot と On-Demand の支出

リソース適正化分析

VPA の推奨事項

適正化の推奨事項を得るために Vertical Pod Autoscaler をインストールします。

bash
# Install VPA
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vpa-v1-crd-gen.yaml
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vpa-rbac.yaml
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/recommender-deployment.yaml

推奨モードで VPA を設定します。

yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Off"  # Recommendation only
  resourcePolicy:
    containerPolicies:
      - containerName: '*'
        minAllowed:
          cpu: 100m
          memory: 128Mi
        maxAllowed:
          cpu: 4
          memory: 8Gi

使用パターンの分析

bash
# Get VPA recommendations
kubectl get vpa my-app-vpa -o jsonpath='{.status.recommendation.containerRecommendations[0]}' | jq

# Compare with current requests
kubectl get deployment my-app -o jsonpath='{.spec.template.spec.containers[0].resources}'

適正化の判断マトリックス

現在値と推奨値の比較アクション期待される節約
Request > 使用量の 2 倍Request を削減20-50%
Request が 2 倍以内最適-
Request < 使用量Request を増加OOM を回避
Limit >> RequestLimit を削減より良い bin-packing

Savings Plans と Reserved Instances の戦略

Savings Plans と Auto Mode の相互作用

EKS Auto Mode と Savings Plans:

シナリオSavings Plans の適用推奨事項
On-Demand ノードはいCompute Savings Plans を購入
Spot ノードいいえ(すでに割引済み)カバレッジに含めない
Graviton インスタンスはい(別料金)ARM Savings Plans を検討
混在ワークロード一部On-Demand ベースラインを計算

Savings Plans のサイズ設定

Recommended Savings Plans Coverage =
    Baseline On-Demand Hours *
    (1 - Expected Spot Percentage) *
    Average Instance Cost

Where:
- Baseline = Minimum sustained usage
- Expected Spot = Target Spot percentage (e.g., 60%)
- Don't over-commit (leave room for Spot)

Savings Plans のベストプラクティス

プラクティス理由
On-Demand ベースラインの 60-70% をカバーSpot 最適化の余地を残す
Compute Savings Plans を使用インスタンスタイプ全体での柔軟性
四半期ごとにレビューワークロードの変化に合わせて調整
GPU インスタンスを除外GPU 固有のプランを分離

Reserved Instances と Savings Plans の比較

要素Reserved InstancesSavings Plans
柔軟性インスタンス固有任意のインスタンス
Auto Mode との適合性低い(インスタンスが変動)良い
コミットメント1 年または 3 年1 年または 3 年
推奨事項推奨しない推奨

コスト最適化チェックリスト

すぐに得られる効果

アクション推定節約額工数
Spot インスタンスを有効化Spot ノードで 60-90%
ARM/Graviton サポートを追加ARM インスタンスで 20%
Request を適正化10-30%
統合を有効化10-20%

中期的な最適化

アクション推定節約額工数
VPA を実装15-30%
Savings Plans を購入On-Demand で 20-40%
Multi-AZ 最適化5-10%
ワークロードスケジューリング10-20%

コスト監視アラート

コスト異常のアラートを設定します。

yaml
# CloudWatch Alarm for unexpected node growth
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  NodeCountAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: EKS-Auto-Mode-Node-Count-High
      MetricName: karpenter_nodes_total
      Namespace: Karpenter
      Statistic: Average
      Period: 300
      EvaluationPeriods: 3
      Threshold: 100  # Adjust based on expected max
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Ref AlertSNSTopic

コスト配分

コスト配分のためのタグ付け戦略

yaml
# NodeClass with cost allocation tags
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  name: tagged-nodeclass
spec:
  tags:
    Environment: production
    Team: platform
    CostCenter: "12345"
    Application: my-app
    ManagedBy: eks-auto-mode

Namespace レベルのコスト追跡

yaml
# Namespace with cost labels
apiVersion: v1
kind: Namespace
metadata:
  name: team-a
  labels:
    cost-center: "team-a"
    environment: production

< 前へ: Operations | 目次 | 次へ: Node Lifecycle >