Ответ
Горизонтальное масштабирование (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 или шардированных БД).