Спот инстанции в AWS, Azure и GCP: Как да спестите до 90% от облачните разходи

Практическо ръководство за спот инстанции в AWS, Azure и GCP с Terraform примери, Kubernetes конфигурации за EKS/AKS/GKE и стратегии за управление на прекъсванията. Спестете до 90% от облачните разходи.

Какво представляват спот инстанциите и защо толкова много екипи ги залагат в бюджета си

Спот инстанциите (Spot Instances) са виртуални машини от облачните доставчици, които идват на драстично намалени цени — до 90% по-евтини от стандартните on-demand тарифи. Как е възможно? Те просто използват свободен изчислителен капацитет, който иначе би стоял неизползван в центровете за данни. В замяна на тези отстъпки обаче, доставчикът може да прекрати инстанцията ви с кратко предупреждение, когато капацитетът му потрябва за клиенти с по-висок приоритет.

Честно казано, цифрите говорят сами за себе си. През 2026 г. глобалните разходи за облачни услуги надхвърлиха 1 трилион долара, а средно 32% от облачния бюджет се разхищава. В този контекст спот инстанциите са един от най-мощните инструменти за оптимизация — особено ако работите с AI/ML натоварвания, batch обработка или Kubernetes клъстери.

В тази статия ще ви преведем през всичко практически — от основите на спот инстанциите при трите големи облачни доставчика до напреднали Kubernetes стратегии, с работещи Terraform примери и конфигурации, готови за production.

Сравнение на спот инстанциите: AWS vs Azure vs GCP

Всяка платформа предлага спот капацитет, но под различно име и с различни условия. Хайде да разгледаме разликите, защото те са ключови за правилната стратегия.

AWS Spot Instances

AWS има най-зрялата и гъвкава спот екосистема. Spot инстанциите използват свободен EC2 капацитет и могат да ви спестят до 90% спрямо on-demand цените. Ето основните характеристики:

  • Предупреждение за прекъсване: 2 минути, чрез EC2 metadata и EventBridge събития
  • Ценообразуване: Динамично — зависи от търсенето и предлагането в момента
  • Средна честота на прекъсване: Под 5% за повечето типове инстанции (по данни от AWS Spot Instance Advisor)
  • Allocation стратегии: capacity-optimized, lowest-price, diversified, price-capacity-optimized
  • Ново за 2026: EC2 Capacity Manager вече включва метрики за Spot прекъсвания — Spot Total Count, Spot Total Interruptions и Spot Interruption Rate — достъпни безплатно във всички комерсиални AWS региони

Azure Spot VMs

Azure Spot Virtual Machines дават достъп до неизползвания Azure капацитет с отстъпки до 90%. Няколко важни неща, които трябва да знаете:

  • Предупреждение за прекъсване: 30 секунди, чрез Azure Metadata Service
  • Политики за евикция: Stop/Deallocate или Delete
  • Ценообразуване: Задавате максимална цена или използвате -1 (текуща пазарна цена)
  • Ограничение: Без SLA за наличност; Spot node pools не могат да бъдат default pool в AKS
  • Предимство: Може да ги комбинирате с Azure Hybrid Benefit за допълнителни спестявания

GCP Spot VMs (бивши Preemptible VMs)

Google Cloud преименува Preemptible VMs на Spot VMs и (за щастие) премахна ограничението за 24-часово максимално време на работа. Основни характеристики:

  • Предупреждение за прекъсване: 30 секунди, чрез metadata server
  • Отстъпки: До 60-91% спрямо on-demand цените
  • Предимство: Автоматични Sustained Use Discounts (SUDs) за натоварвания, които не отговарят на CUD условия
  • Гъвкавост: Ангажиментите са на ниво vCPU и памет, а не за конкретен тип инстанция

Сравнителна таблица

ХарактеристикаAWS SpotAzure SpotGCP Spot
Максимална отстъпкаДо 90%До 90%До 91%
Предупреждение2 минути30 секунди30 секунди
Автоматични отстъпкиНеНеДа (SUDs)
Макс. време на работаБез лимитБез лимитБез лимит (от 2024)
Таксуване при прекъсванеНе за непълен часПо секунда до прекъсванетоПо секунда до прекъсването

Кои натоварвания са подходящи за спот инстанции

Не всяко натоварване е подходящо за спот. Ключовият въпрос е прост: може ли приложението ви да оцелее при прекъсване без загуба на данни или значителен downtime?

Идеални натоварвания

  • CI/CD пайплайни: Паралелно изпълнение на тестове, build процеси и деплойменти — при прекъсване задачата просто се рестартира
  • Batch обработка: Финансово моделиране, научни симулации, медийно кодиране — данните се четат от и записват в устойчиво хранилище
  • AI/ML тренировъчни задачи: GPU-базираните спот инстанции могат да свалят разходите за тренировка със 70-80%; стига да използвате checkpointing за запазване на прогреса
  • Big Data и аналитика: Apache Spark, Hadoop и EMR клъстери — разпределените фреймуърци понасят загуба на възли
  • Stateless микросервизи: Реплицирани web услуги зад load balancer, които лесно се преразпределят
  • Event-driven обработка: Lambda-подобни функции и queue consumers

Натоварвания, които НЕ са подходящи

Тук нещата са категорични — не правете компромис:

  • Бази данни: Singleton инстанции на PostgreSQL, MySQL, MongoDB — използвайте Reserved Instances или on-demand
  • Message brokers: Kafka, RabbitMQ — загубата на брокер може да причини загуба на съобщения
  • Stateful приложения: Всичко, което съхранява състояние само в паметта без external persistence
  • Latency-критични услуги: Приложения, при които дори кратък downtime е неприемлив

Стратегии за управление на прекъсванията

Успешното използване на спот инстанции изисква архитектура, проектирана за устойчивост. От личен опит мога да кажа, че екипите, които инвестират в тези пет стратегии предварително, спят доста по-спокойно.

1. Диверсификация на типовете инстанции

Вероятността за прекъсване намалява драстично, когато разпределите натоварването между множество типове инстанции и зони на наличност. AWS данните показват, че спот инстанциите обикновено се прекратяват в групи — ако m5.large в AZ1 бъде прекратена, вероятно цялата група m5.large в AZ1 ще бъде засегната.

Ето Terraform конфигурация с attribute-based instance type selection (ABS) за максимална диверсификация:

# AWS: Използвайте attribute-based instance type selection (ABS)
# за максимална диверсификация

resource "aws_autoscaling_group" "spot_asg" {
  name                = "spot-workload-asg"
  desired_capacity    = 10
  max_size            = 20
  min_size            = 5
  vpc_zone_identifier = [
    aws_subnet.az1.id,
    aws_subnet.az2.id,
    aws_subnet.az3.id
  ]

  mixed_instances_policy {
    instances_distribution {
      on_demand_base_capacity                  = 2
      on_demand_percentage_above_base_capacity = 20
      spot_allocation_strategy                 = "price-capacity-optimized"
    }

    launch_template {
      launch_template_specification {
        launch_template_id = aws_launch_template.app.id
        version            = "$Latest"
      }

      override {
        instance_requirements {
          memory_mib {
            min = 8192
            max = 16384
          }
          vcpu_count {
            min = 4
            max = 8
          }
          instance_generations = ["current"]
          burstable_performance = "excluded"
        }
      }
    }
  }

  tag {
    key                 = "Environment"
    value               = "production"
    propagate_at_launch = true
  }
}

2. Checkpoint pattern за дълготрайни задачи

За AI/ML тренировки и batch обработка трябва да записвате прогреса на регулярни интервали в устойчиво хранилище (S3, GCS, Azure Blob). При прекъсване задачата може да се рестартира от последния checkpoint, вместо да започвате от нулата.

Ето един Python клас, който илюстрира подхода:

import boto3
import signal
import json
from datetime import datetime

class SpotCheckpointManager:
    """Управлява checkpointing за ML тренировки на спот инстанции."""

    def __init__(self, bucket, prefix, checkpoint_interval=300):
        self.s3 = boto3.client("s3")
        self.bucket = bucket
        self.prefix = prefix
        self.checkpoint_interval = checkpoint_interval
        self.last_checkpoint = datetime.now()
        # Регистрация на SIGTERM handler за спот прекъсвания
        signal.signal(signal.SIGTERM, self._handle_interruption)

    def _handle_interruption(self, signum, frame):
        print("Получено спот прекъсване! Записване на checkpoint...")
        self.save_checkpoint(self.current_state, emergency=True)

    def save_checkpoint(self, state, emergency=False):
        checkpoint_key = f"{self.prefix}/checkpoint_latest.json"
        self.s3.put_object(
            Bucket=self.bucket,
            Key=checkpoint_key,
            Body=json.dumps({
                "state": state,
                "timestamp": datetime.now().isoformat(),
                "emergency": emergency
            })
        )
        self.last_checkpoint = datetime.now()
        print(f"Checkpoint записан: {checkpoint_key}")

    def load_checkpoint(self):
        try:
            response = self.s3.get_object(
                Bucket=self.bucket,
                Key=f"{self.prefix}/checkpoint_latest.json"
            )
            data = json.loads(response["Body"].read())
            print(f"Checkpoint зареден от {data['timestamp']}")
            return data["state"]
        except self.s3.exceptions.NoSuchKey:
            print("Няма наличен checkpoint. Започване от начало.")
            return None

    def should_checkpoint(self):
        elapsed = (datetime.now() - self.last_checkpoint).total_seconds()
        return elapsed >= self.checkpoint_interval


# Използване при ML тренировка
manager = SpotCheckpointManager(
    bucket="ml-training-checkpoints",
    prefix="model-v2/run-42",
    checkpoint_interval=600  # На всеки 10 минути
)

initial_state = manager.load_checkpoint()
epoch_start = initial_state["epoch"] if initial_state else 0

for epoch in range(epoch_start, total_epochs):
    manager.current_state = {"epoch": epoch, "loss": current_loss}
    train_one_epoch(model, data_loader)
    if manager.should_checkpoint():
        manager.save_checkpoint({"epoch": epoch + 1, "loss": current_loss})

3. Гаранция за минимална наличност с on-demand baseline

Тук подходът е хибриден: 20-40% on-demand инстанции като стабилна основа и 60-80% спот за мащабируемост. Така гарантирате, че критичното минимално натоварване винаги работи — дори при масово спот прекъсване. Простичко, но ефективно.

4. Pod Disruption Budgets (PDB) в Kubernetes

Задължително настройте PDB за всяко deployment на спот възли. Те контролират колко pod-а могат да бъдат прекъснати едновременно:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-app-pdb
spec:
  minAvailable: "60%"
  selector:
    matchLabels:
      app: web-app
---
# За batch задачи — ограничаване на едновременните прекъсвания
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: batch-worker-pdb
spec:
  maxUnavailable: 2
  selector:
    matchLabels:
      app: batch-worker

5. Chaos Engineering за валидация

Не чакайте реално прекъсване, за да разберете дали системата ви издържа. Сериозно — използвайте AWS Fault Injection Simulator (FIS), Chaos Mesh или LitmusChaos, за да симулирате спот прекъсвания в staging среда. По-добре е да откриете проблемите по ваш график, отколкото в 3 сутринта.

Конфигуриране на спот node pools в Kubernetes: EKS, AKS и GKE

Kubernetes е естествената среда за спот инстанции — оркестраторът автоматично преразпределя pod-ове при загуба на възел. Нека видим как се конфигурират спот node pools на трите основни платформи.

Amazon EKS с Karpenter

Karpenter е препоръчителният автоскалер за EKS от 2025 г. насам и на практика замени Cluster Autoscaler за повечето случаи. Той е по-бърз и значително по-гъвкав при избора на инстанции:

# Karpenter NodePool за спот инстанции в EKS
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: spot-workloads
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot"]
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
        - key: node.kubernetes.io/instance-type
          operator: In
          values:
            - m6i.xlarge
            - m6i.2xlarge
            - m7i.xlarge
            - m7i.2xlarge
            - c6i.xlarge
            - c6i.2xlarge
            - r6i.xlarge
        - key: topology.kubernetes.io/zone
          operator: In
          values:
            - eu-west-1a
            - eu-west-1b
            - eu-west-1c
      nodeClassRef:
        group: karpenter.k8s.aws
        kind: EC2NodeClass
        name: default
      taints:
        - key: spot-instance
          value: "true"
          effect: NoSchedule
  limits:
    cpu: "200"
    memory: 400Gi
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 60s
---
# On-demand NodePool за критична инфраструктура
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: on-demand-critical
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand"]
        - key: node.kubernetes.io/instance-type
          operator: In
          values:
            - m6i.xlarge
            - m6i.2xlarge
      nodeClassRef:
        group: karpenter.k8s.aws
        kind: EC2NodeClass
        name: default
  limits:
    cpu: "50"
    memory: 100Gi

Azure AKS Spot Node Pool

При AKS конфигурацията е сравнително директна — създавате клъстера с on-demand system pool и после добавяте спот node pool:

# Създаване на AKS клъстер с on-demand system pool
az aks create \
  --resource-group myResourceGroup \
  --name myAKSCluster \
  --node-count 3 \
  --node-vm-size Standard_D4s_v5 \
  --generate-ssh-keys

# Добавяне на спот node pool
az aks nodepool add \
  --resource-group myResourceGroup \
  --cluster-name myAKSCluster \
  --name spotnodepool \
  --priority Spot \
  --eviction-policy Delete \
  --spot-max-price -1 \
  --node-count 5 \
  --node-vm-size Standard_D4s_v5 \
  --min-count 2 \
  --max-count 15 \
  --enable-cluster-autoscaler \
  --labels "kubernetes.azure.com/scalesetpriority=spot" \
  --node-taints "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"

Важно: В AKS спот node pool не може да бъде default pool. Винаги създавайте on-demand system pool за критичните системни компоненти (CoreDNS, kube-proxy и подобни).

Google GKE Spot Node Pool

# Terraform конфигурация за GKE спот node pool
resource "google_container_node_pool" "spot_pool" {
  name       = "spot-workloads"
  cluster    = google_container_cluster.primary.name
  location   = "europe-west1"

  autoscaling {
    min_node_count = 2
    max_node_count = 20
  }

  node_config {
    spot         = true
    machine_type = "n2-standard-4"
    disk_size_gb = 50
    disk_type    = "pd-ssd"

    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]

    labels = {
      "cloud.google.com/gke-spot" = "true"
    }

    taint {
      key    = "cloud.google.com/gke-spot"
      value  = "true"
      effect = "NO_SCHEDULE"
    }

    metadata = {
      disable-legacy-endpoints = "true"
    }
  }

  management {
    auto_repair  = true
    auto_upgrade = true
  }
}

Deployment с toleration за спот възли

За да насочите натоварванията към спот node pools, използвате tolerations и node affinity. Ето универсален пример, който работи и при трите облачни доставчика:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: batch-processor
spec:
  replicas: 5
  selector:
    matchLabels:
      app: batch-processor
  template:
    metadata:
      labels:
        app: batch-processor
    spec:
      tolerations:
        - key: "spot-instance"
          operator: "Equal"
          value: "true"
          effect: "NoSchedule"
        - key: "kubernetes.azure.com/scalesetpriority"
          operator: "Equal"
          value: "spot"
          effect: "NoSchedule"
        - key: "cloud.google.com/gke-spot"
          operator: "Equal"
          value: "true"
          effect: "NoSchedule"
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 80
              preference:
                matchExpressions:
                  - key: karpenter.sh/capacity-type
                    operator: In
                    values:
                      - spot
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - batch-processor
                topologyKey: kubernetes.io/hostname
      containers:
        - name: processor
          image: myregistry/batch-processor:latest
          resources:
            requests:
              cpu: "500m"
              memory: "1Gi"
            limits:
              cpu: "1"
              memory: "2Gi"

Мониторинг и оптимизация на спот разходите

Конфигурацията е само началото. За да извлечете максимума от спот инстанциите, трябва да наблюдавате какво се случва и да реагирате навреме.

AWS CloudWatch метрики за спот

От януари 2026 г. EC2 Capacity Manager предлага три нови метрики, които доста улесняват нещата:

  • Spot Total Count: Общ брой спот инстанции (или vCPU) за избрания период
  • Spot Total Interruptions: Колко от тях са били прекъснати
  • Spot Interruption Rate: Процентът на прекъсвания — това е метриката, на която трябва да обръщате най-много внимание

Практически dashboard с Prometheus и Grafana

За Kubernetes среди можете да мониторирате спот-специфични метрики с Prometheus. Ето примерни alert правила:

# Prometheus правила за алертиране при висока честота на спот прекъсвания
groups:
  - name: spot-instance-alerts
    rules:
      - alert: HighSpotInterruptionRate
        expr: |
          (
            sum(rate(kube_node_status_condition{
              condition="Ready",
              status="false"
            }[1h])) by (node)
            /
            count(kube_node_info) by (node)
          ) > 0.1
        for: 15m
        labels:
          severity: warning
        annotations:
          summary: "Висока честота на прекъсвания на спот възли"
          description: "Повече от 10% от спот възлите са били прекъснати в последния час"

      - alert: SpotNodePoolCapacityLow
        expr: |
          sum(kube_node_status_allocatable{
            resource="cpu",
            node=~".*spot.*"
          }) < 20
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "Нисък капацитет на спот node pool"
          description: "Наличните CPU ресурси в спот pool са под 20 cores"

Калкулация на реалните спестявания: практически пример

Теорията е хубаво нещо, но нека погледнем конкретни числа. Ето един реалистичен сценарий, който илюстрира какво можете да очаквате.

Сценарий: E-commerce платформа с Kubernetes

КомпонентТип инстанцияБройOn-Demand цена/месецСпот цена/месец
API сървъри (stateless)m6i.xlarge10$1,401$420 (70% спестяване)
Background workersc6i.2xlarge8$1,958$490 (75% спестяване)
ML inferenceg5.xlarge4$4,867$1,460 (70% спестяване)
Бази данни (on-demand)r6i.2xlarge3$2,741$2,741 (без промяна)
Системни компонентиm6i.large3$630$630 (без промяна)

Общо on-demand: $11,597/месец
С хибридна спот стратегия: $5,741/месец
Месечно спестяване: $5,856 (~50%)
Годишно спестяване: $70,272

При по-агресивна стратегия с 80% спот покритие за подходящите натоварвания, годишните спестявания могат да стигнат $80,000-90,000. Не е лошо, нали?

Топ 5 грешки при използване на спот инстанции

Ако избегнете тези грешки, ще си спестите и пари, и безсънни нощи:

  1. Разчитане на един тип инстанция: Ако използвате само m5.large и тази pool бъде прекъсната — губите всичко. Винаги конфигурирайте поне 4-5 различни типа.
  2. Липса на on-demand fallback: Чиста спот конфигурация без on-demand baseline рискува пълен downtime при масово прекъсване. Не си заслужава да спестите още 10%, ако рискувате наличността.
  3. Пренебрегване на checkpointing: Дълготрайни задачи без checkpoint записване загубват целия прогрес при прекъсване — часове или дни работа, хвърлени на вятъра.
  4. Singleton услуги на спот възли: Бази данни, message brokers и други stateful singletons никога не трябва да работят на спот. Точка.
  5. Липса на мониторинг: Без наблюдение на честотата на прекъсвания летите на сляпо и не можете да коригирате стратегията навреме.

Често задавани въпроси

Колко можем реално да спестим със спот инстанции?

Спот инстанциите предлагат отстъпки от 60% до 90% спрямо on-demand цените — зависи от региона, типа инстанция и текущото търсене. Средните спестявания за организации с хибридна стратегия (спот + on-demand) са около 50-70% от разходите за compute. Според Kubernetes Cost Benchmark Report 2025, клъстери с микс от on-demand и спот постигат средно 59% спестяване, а клъстери само със спот — 77%.

Безопасно ли е да използваме спот инстанции в production?

Да, при правилна архитектура. Ключът е да проектирате за устойчивост: използвайте реплики (минимум 3-5 за всяка услуга), Pod Disruption Budgets, Node Termination Handlers, и винаги поддържайте on-demand baseline за критичните компоненти. Много организации успешно работят със спот за 60-80% от production натоварванията си.

Каква е разликата между спот инстанции и Reserved Instances?

Reserved Instances (RI) дават отстъпки до 72% срещу 1-3 годишен ангажимент и гарантирана наличност. Спот инстанциите предлагат по-големи отстъпки (до 90%), но без гаранция. Оптималната стратегия е комбинирана: RI за базовото натоварване (предвидимо, 24/7), спот за променливи и fault-tolerant натоварвания, и on-demand за върхови моменти.

Как да се справим с прекъсване по време на ML тренировка?

Checkpoint pattern е отговорът. Записвайте състоянието на модела (weights, optimizer state, epoch) в S3/GCS/Azure Blob на всеки 5-15 минути. При прекъсване новата инстанция зарежда последния checkpoint и продължава от там. Frameworks като PyTorch Lightning и TensorFlow поддържат вграден checkpointing. Не забравяйте да регистрирате SIGTERM handler за аварийно записване при сигнал за прекъсване.

Кой облачен доставчик предлага най-добрите спот инстанции?

Зависи какво търсите. AWS има най-зрялата екосистема с 2-минутно предупреждение и най-богат набор от инструменти (Karpenter, Spot Instance Advisor, EC2 Capacity Manager). GCP предлага автоматични SUDs и по-опростено ценообразуване. Azure е силен при хибридни сценарии с Azure Hybrid Benefit. За Kubernetes натоварвания конкретно — AWS EKS с Karpenter е водещият избор през 2026 г., а GCP GKE предлага най-лесната интеграция от кутията.

За Автора Editorial Team

Our team of expert writers and editors.