2.9 Cloud Cost Optimization: Оптимизация расходов в облаке

2.9 Cloud Cost Optimization: Оптимизация расходов в облаке #

🎯 Что такое Cloud Cost Optimization простыми словами #

Cloud Cost Optimization — это процесс минимизации расходов на облачную инфраструктуру при сохранении необходимой производительности и надежности. Это не просто “урезание бюджета”, а умное управление ресурсами.

💰 Аналогия с домашним бюджетом #

Аналогия с домашним бюджетом:

Плохой подход - “тратим без контроля”:

  • Покупаем в интернет-магазине все подряд
  • Получаем огромный счет в конце месяца

Хороший подход - “планируем и оптимизируем”:

  • Планируем покупки заранее
  • Сравниваем цены и качество
  • Используем скидки и акции
  • Экономим деньги разумно

📊 Основные принципы cost optimization #

1. Visibility - Видимость расходов #

Команда AWS Cost Explorer для анализа расходов:

Параметры команды:

  • –time-period: период с 1 по 31 января 2025
  • –granularity MONTHLY: группировка по месяцам
  • –metrics BlendedCost: метрика общей стоимости
  • –group-by Type=DIMENSION,Key=SERVICE: группировка по сервисам AWS

2. Right-sizing - Правильный размер ресурсов #

Пример Right-sizing - правильного размера ресурсов:

Неправильно (Oversized instance):

  • CPU: 2000m (запрошено, но используется только 200m)
  • Memory: 8Gi (запрошено, но используется только 1Gi)
  • Проблема: переплата за неиспользуемые ресурсы

Правильно (Right-sized instance):

  • CPU: 500m (учитываем пики нагрузки + малый запас)
  • Memory: 2Gi (достаточно для текущей нагрузки + запас на рост)
  • Преимущество: оптимальное соотношение стоимости и производительности

3. Automation - Автоматизация управления #

# Автоматическое масштабирование
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: webapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: webapp
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

💡 AWS Cost Optimization стратегии #

🟢 EC2 Optimization #

Spot Instances для non-critical workloads #

# Kubernetes Node Group со Spot instances
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: cost-optimized-cluster
nodeGroups:
  - name: spot-workers
    instancesDistribution:
      instanceTypes: 
        - t3.medium
        - t3a.medium
        - t2.medium
      onDemandBaseCapacity: 1
      onDemandPercentageAboveBaseCapacity: 0
      spotInstancePools: 3
    minSize: 1
    maxSize: 10
    desiredCapacity: 3

Reserved Instances для стабильных workloads #

Команды для управления Reserved Instances:

Анализ покрытия RI:

  • Период анализа: январь 2025
  • Группировка: по сервисам AWS
  • Результат: показывает процент покрытия резервированиями

Покупка Reserved Instance:

  • Идентификатор предложения: уникальный ID для конкретного RI
  • Количество инстансов: 2 штуки
  • Результат: оформляет резервирование на год или больше

Savings Plans #

// Анализ Savings Plans рекомендаций
{
  "SavingsPlansType": "COMPUTE_SP",
  "PaymentOption": "NO_UPFRONT", 
  "PlanType": "1_YEAR",
  "HourlyCommitment": "10.50",
  "EstimatedMonthlySavings": "150.00"
}

🟡 Storage Optimization #

S3 Intelligent Tiering #

# Terraform конфигурация для S3 lifecycle
resource "aws_s3_bucket_lifecycle_configuration" "intelligent_tiering" {
  bucket = aws_s3_bucket.data_bucket.id

  rule {
    id     = "intelligent_tiering"
    status = "Enabled"

    transition {
      days          = 0
      storage_class = "INTELLIGENT_TIERING"
    }
    
    transition {
      days          = 90
      storage_class = "GLACIER"
    }
    
    transition {
      days          = 365
      storage_class = "DEEP_ARCHIVE"
    }
    
    expiration {
      days = 2555  # 7 лет
    }
  }
}

EBS Volume Optimization #

Команды для оптимизации EBS Volume:

Поиск неиспользуемых томов:

  • Фильтр: статус “available” (не прикреплен к инстансам)
  • Вывод: ID тома, размер, тип, время создания
  • Формат: таблица для удобного просмотра

Оптимизация типа тома:

  • Идентификатор: vol-12345678 (конкретный том)
  • Новый тип: gp3 (более экономичный чем gp2)
  • Размер: 100 GB
  • Преимущество: снижение стоимости хранения

🟠 Database Optimization #

RDS Right-sizing #

Запрос для анализа использования CPU в CloudWatch:

Параметры запроса:

  • Метрики: среднее и максимальное значение CPU
  • Источник: CloudWatch метрики CPUUtilization
  • Цель: база данных ‘prod-db’
  • Период: последние 30 дней

Назначение:

  • Определение реальной нагрузки на базу данных
  • Принятие решения о right-sizing инстанса
# Terraform конфигурация с параметрами оптимизации
resource "aws_db_instance" "optimized" {
  identifier = "prod-db-optimized"
  
  # Right-sized instance
  instance_class = "db.t3.medium"  # Вместо db.r5.xlarge
  
  # Storage optimization
  storage_type          = "gp3"
  allocated_storage     = 100
  max_allocated_storage = 1000  # Auto-scaling storage
  
  # Backup optimization
  backup_retention_period = 7    # Не 35 дней
  backup_window          = "03:00-04:00"
  
  # Multi-AZ только для production
  multi_az = var.environment == "production" ? true : false
}

🔵 Azure Cost Optimization #

Azure Reserved VM Instances #

Команды Azure для управления Reserved VM Instances:

Анализ рекомендаций:

  • Подписка: указание конкретной Azure подписки
  • Результат: список рекомендаций по резервированию
  • Предложения: оптимальные варианты для экономии

Покупка резервирования:

  • Тип ресурса: VirtualMachines
  • SKU: Standard_D2s_v3 (конкретный тип ВМ)
  • Расположение: westus2 (West US 2 region)
  • Количество: 2 инстанса
  • Срок: P1Y (1 год)

Azure Cost Management + Billing #

// Budget с алертами
{
  "properties": {
    "displayName": "DevOps Monthly Budget",
    "amount": 1000,
    "timeGrain": "Monthly",
    "timePeriod": {
      "startDate": "2025-01-01",
      "endDate": "2025-12-31"
    },
    "notifications": {
      "Actual_GreaterThan_80_Percent": {
        "enabled": true,
        "operator": "GreaterThan",
        "threshold": 80,
        "contactEmails": ["devops@company.com"]
      }
    }
  }
}

Azure Spot VMs для Kubernetes #

# AKS node pool со Spot VMs
apiVersion: containerservice.azure.com/v1
kind: AgentPool
metadata:
  name: spot-pool
spec:
  mode: User
  vmSize: Standard_D2s_v3
  scaleSetPriority: Spot        # Spot instances
  scaleSetEvictionPolicy: Delete
  spotMaxPrice: 0.05            # Максимальная цена за час
  nodeCount: 3
  enableAutoScaling: true
  minCount: 1
  maxCount: 10

🟢 Google Cloud Cost Optimization #

Committed Use Discounts #

# Анализ рекомендаций по CUD
gcloud compute commitment-types list

# Создание commitment
gcloud compute commitments create my-commitment \
  --plan=12-month \
  --resources=type=memory,amount=100 \
  --resources=type=vcpu,amount=50 \
  --region=us-central1

Preemptible VMs в GKE #

# GKE node pool с preemptible instances
apiVersion: v1
kind: NodePool
metadata:
  name: preemptible-pool
spec:
  initialNodeCount: 3
  config:
    preemptible: true          # Preemptible instances
    machineType: n1-standard-2
    diskSizeGb: 50
    diskType: pd-ssd
  autoscaling:
    enabled: true
    minNodeCount: 1
    maxNodeCount: 10

Cloud Storage Lifecycle Management #

{
  "rule": [
    {
      "action": {
        "type": "SetStorageClass",
        "storageClass": "NEARLINE"
      },
      "condition": {
        "age": 30,
        "matchesStorageClass": ["STANDARD"]
      }
    },
    {
      "action": {
        "type": "SetStorageClass", 
        "storageClass": "COLDLINE"
      },
      "condition": {
        "age": 90,
        "matchesStorageClass": ["NEARLINE"]
      }
    },
    {
      "action": {
        "type": "Delete"
      },
      "condition": {
        "age": 365
      }
    }
  ]
}

🛠️ Cost Optimization Tools #

🔍 Monitoring и Alerting #

CloudWatch для AWS #

{
  "MetricName": "EstimatedCharges",
  "Namespace": "AWS/Billing",
  "Statistic": "Maximum",
  "Dimensions": [
    {
      "Name": "Currency",
      "Value": "USD"
    }
  ],
  "AlarmActions": [
    "arn:aws:sns:us-east-1:123456789012:billing-alarm"
  ],
  "ComparisonOperator": "GreaterThanThreshold",
  "Threshold": 1000
}

Grafana Dashboard для cost tracking #

# Prometheus query для Kubernetes costs
sum(
  rate(container_cpu_usage_seconds_total[5m]) * on(node) group_left(instance_type, region)
  (
    kube_node_labels{label_beta_kubernetes_io_instance_type!=""}
  )
) by (instance_type, region)

📊 Third-party Cost Management Tools #

Kubecost для Kubernetes #

# Установка 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"

# Port forwarding для UI
kubectl port-forward -n kubecost service/kubecost-cost-analyzer 9090:9090

Infracost для Terraform #

# Установка infracost
curl -fsSL https://raw.githubusercontent.com/infracost/infracost/master/scripts/install.sh | sh

# Анализ cost impact изменений
infracost breakdown --path=.
infracost diff --path=. --sync-usage-file --usage-file infracost-usage.yml

# Интеграция с CI/CD
infracost comment github --path=infracost.json \
  --repo=myorg/myrepo \
  --github-token=$GITHUB_TOKEN \
  --pull-request=123

⚡ Automated Cost Optimization #

🤖 Auto-scaling configurations #

Cluster Autoscaler #

# Cluster Autoscaler deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cluster-autoscaler
  namespace: kube-system
spec:
  template:
    spec:
      containers:
      - image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.21.0
        name: cluster-autoscaler
        command:
        - ./cluster-autoscaler
        - --v=4
        - --stderrthreshold=info
        - --cloud-provider=aws
        - --skip-nodes-with-local-storage=false
        - --expander=least-waste
        - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/eks-cluster
        - --balance-similar-node-groups
        - --scale-down-enabled=true
        - --scale-down-delay-after-add=10m
        - --scale-down-unneeded-time=10m

Vertical Pod Autoscaler #

# VPA для автоматического right-sizing
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: webapp-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: webapp
  updatePolicy:
    updateMode: "Auto"  # Автоматически применять рекомендации
  resourcePolicy:
    containerPolicies:
    - containerName: webapp
      maxAllowed:
        cpu: 2
        memory: 4Gi
      minAllowed:
        cpu: 100m
        memory: 128Mi

📅 Scheduled Operations #

Lambda для автоматической остановки resources #

Функция AWS Lambda для автоматической остановки dev/test окружений:

Функция выполняет следующие действия:

  1. Подключается к AWS EC2 и RDS сервисам через boto3
  2. Находит все запущенные EC2 инстансы с тегами Environment=dev или Environment=test
  3. Останавливает найденные EC2 инстансы для экономии средств
  4. Проверяет все активные RDS базы данных и останавливает те, которые помечены тегами dev или test
  5. Возвращает статус успешного выполнения операции

Эта автоматизация позволяет значительно сократить расходы на непроизводственные окружения в нерабочее время.

EventBridge rule для расписания #

{
  "Rules": [
    {
      "Name": "stop-dev-resources",
      "ScheduleExpression": "cron(0 18 ? * MON-FRI *)",
      "State": "ENABLED",
      "Targets": [
        {
          "Id": "1",
          "Arn": "arn:aws:lambda:us-east-1:123456789012:function:stop-dev-resources"
        }
      ]
    }
  ]
}

🎯 Cost Optimization Metrics и KPIs #

Основные метрики #

{
  "cost_metrics": {
    "cost_per_environment": {
      "production": 5000,
      "staging": 800,
      "development": 200
    },
    "cost_per_service": {
      "web_frontend": 1200,
      "api_backend": 2000,
      "database": 1500,
      "monitoring": 300
    },
    "utilization_metrics": {
      "cpu_utilization": 65,
      "memory_utilization": 70,
      "storage_utilization": 45
    },
    "optimization_savings": {
      "spot_instances": 800,
      "reserved_instances": 1200,
      "right_sizing": 400
    }
  }
}

Cost Governance Dashboard #

# Grafana dashboard конфигурация
dashboard:
  title: "Cloud Cost Optimization"
  panels:
    - title: "Monthly Spend Trend"
      type: "graph"
      targets:
        - expr: 'aws_billing_estimated_charges_total'
    
    - title: "Cost by Service"
      type: "piechart"
      targets:
        - expr: 'sum by (service) (aws_billing_estimated_charges_total)'
    
    - title: "Resource Utilization"
      type: "stat"
      targets:
        - expr: 'avg(rate(cpu_usage_total[5m])) * 100'
    
    - title: "Savings from Optimization"
      type: "bargraph"  
      targets:
        - expr: 'savings_spot_instances + savings_reserved_instances'

🏆 Лучшие практики Cost Optimization #

1. Continuous Monitoring #

✅ DO:
- Настроить alerting на превышение бюджета
- Регулярно анализировать cost reports
- Отслеживать utilization metrics
- Создать cost ownership по командам

❌ DON'T:
- Проверять costs только в конце месяца
- Игнорировать unused resources
- Отсутствие tagging strategy
- No cost governance процессов

2. Resource Lifecycle Management #

✅ DO:
- Автоматически останавливать dev/test ресурсы
- Использовать lifecycle policies для storage
- Regular cleanup неиспользуемых resources
- Implement resource expiration tags

❌ DON'T:
- Забывать удалять temporary ресурсы
- Хранить backup'ы вечно
- Использовать production-size в dev
- Ignore storage costs (они накапливаются!)

3. Right-sizing Strategy #

✅ DO:
- Начинать с smaller instances и scale up
- Использовать monitoring для sizing decisions
- Regular review resource utilization
- Test performance impact от downsizing

❌ DON'T:
- Over-provision "на всякий случай"
- Игнорировать VPA/HPA рекомендации
- Размер instances без monitoring
- Assume bigger = better performance

🚨 Cost Optimization Antipatterns #

❌ Антипаттерн 1: “Penny wise, pound foolish” #

Проблема: Экономия на мелочах в ущерб большому

Пример:
- Используем t2.micro для базы данных (экономим $10/месяц)
- Но production падает каждую неделю (теряем $10,000/инцидент)

Решение:
- Focus на high-impact optimization
- Don't compromise reliability ради minimal savings

❌ Антипаттерн 2: “Set and forget” #

Проблема: Купили Reserved Instances и забыли

Пример:
- Купили 3-year RI для конкретного instance type
- Архитектура изменилась, instance type не нужен
- Платим за unused reservations

Решение:
- Regular review всех commitments
- Use convertible reservations где возможно
- Monitor reservation utilization

❌ Антипаттерн 3: “Cost optimization by downsizing everything” #

Проблема: Тупо уменьшили все instance'ы

Пример:
- Уменьшили все с xlarge на medium
- Performance упала в 3 раза
- User experience пострадал

Решение:
- Data-driven decisions based on utilization
- Test performance impact
- Gradual optimization с мониторингом

🎯 Практические задания #

🟢 Задание 1: Cost Visibility #

  1. Настроить AWS/Azure/GCP billing alerts
  2. Создать cost dashboard в Grafana
  3. Внедрить tagging strategy
  4. Настроить cost allocation по проектам

🟡 Задание 2: Automated Optimization #

  1. Настроить Cluster Autoscaler
  2. Внедрить VPA для right-sizing
  3. Создать Lambda для остановки dev resources
  4. Настроить storage lifecycle policies

🟠 Задание 3: Reserved Capacity Planning #

  1. Проанализировать workload patterns
  2. Купить Reserved Instances/Savings Plans
  3. Настроить Spot instances для batch workloads
  4. Monitor utilization и ROI

🔴 Задание 4: Cost Governance #

  1. Создать cost center structure
  2. Внедрить approval workflow для больших расходов
  3. Настроить showback/chargeback reporting
  4. Создать cost optimization playbook

🔗 Полезные ресурсы #

Документация #

Инструменты #

Калькуляторы #

🎯 Заключение #

Cloud Cost Optimization — это continuous process, а не одноразовая акция. Основные принципы:

Visibility First — нельзя оптимизировать то, что не видишь
Automate Everything — ручная оптимизация не масштабируется
Right-size Continuously — потребности меняются со временем
Balance Cost vs Performance — не экономить в ущерб reliability
Culture of Cost Awareness — каждый должен понимать cost impact

Помните: 30% экономии при сохранении performance — реалистичная цель для большинства организаций. Начните с easy wins (unused resources), потом переходите к более сложным оптимизациям.


Следующий раздел: Глава 3: Soft Skills для DevOps