Введение в автоматическое масштабирование в Kubernetes
В динамичном мире современной разработки программного обеспечения масштабируемость — это не просто функция, а необходимость. Архитектура микросервисов с её модульными и независимыми компонентами предлагает надёжный способ создания масштабируемых приложений. Однако эффективное управление микросервисами и их масштабирование может оказаться сложной задачей. Здесь на помощь приходит Kubernetes, предоставляя мощную платформу для автоматизации масштабирования микросервисов.
Почему именно Kubernetes?
Kubernetes — это система управления контейнерами с открытым исходным кодом, которая автоматизирует развёртывание, масштабирование и управление контейнерными приложениями. Она предлагает богатую экосистему инструментов и интеграций, которые делают её идеальной для развёртывания микросервисов. Вот несколько причин, по которым Kubernetes является лучшим выбором для масштабирования микросервисов:
- Автоматическое развёртывание и масштабирование. Kubernetes автоматически развёртывает и масштабирует приложения, обеспечивая постоянную доступность и оптимальную производительность ваших микросервисов.
- Управление ресурсами. Эффективно управляет такими ресурсами, как процессор и память, гарантируя, что ваши микросервисы получают нужное количество ресурсов в зависимости от спроса.
- Высокая доступность. Kubernetes обеспечивает высокую доступность, автоматически перезапуская отказавшие контейнеры и перераспределяя рабочие нагрузки между несколькими узлами.
Проектирование масштабируемых микросервисов
Прежде чем углубляться в особенности автоматического масштабирования, крайне важно проектировать микросервисы с учётом масштабируемости.
Сервисы без сохранения состояния
Сервис без сохранения состояния не хранит никакой информации о состоянии приложения. Это гарантирует, что при масштабировании сервисов Kubernetes данные не будут потеряны. Пример того, как может выглядеть сервис без сохранения состояния:
Слабая связанность
Слабая связанность снижает риск каскадных сбоев и упрощает масштабирование отдельных сервисов. Вот как можно визуализировать слабую связанность:
Управление версиями API
Управление версиями API позволяет Kubernetes автоматически определять узкие места и выделять больше ресурсов соответствующим сервисам. Пример реализации управления версиями API:
Автоматическое масштабирование микросервисов в Kubernetes
Kubernetes предоставляет несколько инструментов для автоматического масштабирования микросервисов, каждый из которых имеет свои сильные стороны и сценарии использования.
Горизонтальное автомасштабирование подов (HPA)
Горизонтальное автомасштабирование подов (Horizontal Pod Autoscaler, HPA) — один из наиболее часто используемых инструментов автоматического масштабирования в Kubernetes. Он масштабирует количество реплик микросервиса на основе использования процессора или памяти.
Пример конфигурации
Пример настройки HPA для масштабирования на основе загрузки процессора:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Шаги реализации
- Определение развёртывания. Сначала определите развёртывание для вашего микросервиса.
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: my-image resources: requests: cpu: 100m limits: cpu: 200m
- Применение развёртывания. Примените конфигурацию развёртывания к кластеру Kubernetes.
kubectl apply -f deployment.yaml
- Создание HPA. Создайте конфигурацию HPA и примените её к кластеру Kubernetes.
kubectl apply -f hpa.yaml
Вертикальное автомасштабирование подов (VPA)
Вертикальное автомасштабирование подов (Vertical Pod Autoscaler, VPA) регулирует распределение ресурсов для отдельных подов микросервисов на основе их шаблонов использования.
Пример конфигурации
Пример конфигурации вертикального автомасштабирования подов:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-vpa
spec:
selector:
matchLabels:
app: my-app
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 2000m
memory: 2048Mi
target:
cpu: 50
memory: 50
updatePolicy:
updateMode: Auto
Шаги реализации
- Установка VPA. Сначала необходимо установить контроллер VPA в кластере Kubernetes.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/vpa-admission-controller.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/vpa-recommender.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/vpa-updater.yaml
- Создание VPA. Создайте конфигурацию VPA и примените её к вашему кластеру Kubernetes.
kubectl apply -f vpa.yaml
Автомасштабатор Kubernetes на основе событий (KEDA)
KEDA динамически масштабирует приложения на основе таких событий в реальном времени, как сообщения в очереди или входящие запросы. Это особенно полезно для рабочих нагрузок, управляемых событиями.
Пример конфигурации
Вот пример того, как настроить KEDA для масштабирования на основе сообщений в очереди:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: my-scaledobject
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: RabbitMQQueueLength
queueName: my-queue
queueLength: 5
connectionFromEnv: RABBITMQ_CONNECTION_STRING
Шаги реализации
- Установите KEDA. Сначала вам нужно установить оператор KEDA в вашем кластере Kubernetes.
kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.7.1/keda-2.7.1.yaml
- Создайте масштабируемый объект. Создайте масштабируемый объект конфигурации и примените его к кластеру Kubernetes.
kubectl apply -f keda.yaml
Продвинутые методы масштабирования микросервисов
Пользовательские метрики с HPA
Хотя HPA обычно используется для масштабирования на основе использования CPU и памяти, его также можно настроить для использования пользовательских метрик.
Пример конфигурации
Пример настройки HPA для масштабирования на основе пользовательских метрик, собранных Prometheus:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Object
object:
metric:
name: my-metric
describedObject:
apiVersion: custom.metrics.k8s.io/v1beta1
kind: Pod
name: my-pod
target:
type: Value