Приведи примеры горизонтального масштабирования в DevOps-практиках

«Приведи примеры горизонтального масштабирования в DevOps-практиках» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Горизонтальное масштабирование (scaling out) — это основа отказоустойчивости и обработки пиковой нагрузки. Вот как я реализовывал его на практике для разных компонентов системы.

1. Масштабирование stateless-приложений в Kubernetes: Самый частый сценарий. Настройка Horizontal Pod Autoscaler (HPA) на основе CPU, памяти или кастомных метрик из Prometheus.

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 3 # Базовая отказоустойчивость
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: my-api:latest
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
---
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-deployment
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

2. Масштабирование очередей (Kafka): Для обработки всплеска событий масштабируем потребителей (consumer groups).

# Увеличиваем количество партиций в топике (это необходимо сделать до добавления консьюмеров)
kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic user-events --partitions 12

# Запускаем дополнительные консьюмеры в отдельном Deployment.
# Kafka автоматически перераспределит партиции между всеми консьюмерами в группе.
kubectl scale deployment kafka-consumer --replicas=6

3. Масштабирование кэша (Redis): Использование Redis Cluster для распределения данных по нескольким нодам (шардинг).

# Пример Redis Cluster из 6 подов (3 master, 3 replica)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    spec:
      containers:
      - name: redis
        image: redis:7-alpine
        command: ["redis-server", "/etc/redis/redis.conf", "--cluster-enabled", "yes"]
        ports:
        - containerPort: 6379
          name: client
        - containerPort: 16379
          name: gossip
        volumeMounts:
        - name: redis-config
          mountPath: /etc/redis/
  volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi

Ключевой принцип: Горизонтальное масштабирование требует, чтобы приложение было stateless (состояние вынесено во внешние сервисы: БД, кэш, объектное хранилище) или использовало шардинг состояния (как в Redis Cluster или шардированных БД).