Введение в автоматическое масштабирование в Kubernetes

В динамичном мире современной разработки программного обеспечения масштабируемость — это не просто функция, а необходимость. Архитектура микросервисов с её модульными и независимыми компонентами предлагает надёжный способ создания масштабируемых приложений. Однако эффективное управление микросервисами и их масштабирование может оказаться сложной задачей. Здесь на помощь приходит Kubernetes, предоставляя мощную платформу для автоматизации масштабирования микросервисов.

Почему именно Kubernetes?

Kubernetes — это система управления контейнерами с открытым исходным кодом, которая автоматизирует развёртывание, масштабирование и управление контейнерными приложениями. Она предлагает богатую экосистему инструментов и интеграций, которые делают её идеальной для развёртывания микросервисов. Вот несколько причин, по которым Kubernetes является лучшим выбором для масштабирования микросервисов:

  • Автоматическое развёртывание и масштабирование. Kubernetes автоматически развёртывает и масштабирует приложения, обеспечивая постоянную доступность и оптимальную производительность ваших микросервисов.
  • Управление ресурсами. Эффективно управляет такими ресурсами, как процессор и память, гарантируя, что ваши микросервисы получают нужное количество ресурсов в зависимости от спроса.
  • Высокая доступность. Kubernetes обеспечивает высокую доступность, автоматически перезапуская отказавшие контейнеры и перераспределяя рабочие нагрузки между несколькими узлами.

Проектирование масштабируемых микросервисов

Прежде чем углубляться в особенности автоматического масштабирования, крайне важно проектировать микросервисы с учётом масштабируемости.

Сервисы без сохранения состояния

Сервис без сохранения состояния не хранит никакой информации о состоянии приложения. Это гарантирует, что при масштабировании сервисов Kubernetes данные не будут потеряны. Пример того, как может выглядеть сервис без сохранения состояния:

sequenceDiagram participant Клиент participant Сервис participant База данных Клиент->>Сервис: Запрос Сервис->>База данных: Получение данных База данных->>Сервис: Данные Сервис->>Клиент: Ответ

Слабая связанность

Слабая связанность снижает риск каскадных сбоев и упрощает масштабирование отдельных сервисов. Вот как можно визуализировать слабую связанность:

graph TD A("Сервис A") -->|Вызов API|B(Сервис B) B -->|Вызов API|C(Сервис C) A -->|Вызов API| C

Управление версиями API

Управление версиями API позволяет Kubernetes автоматически определять узкие места и выделять больше ресурсов соответствующим сервисам. Пример реализации управления версиями API:

sequenceDiagram participant Клиент participant Маршрутизатор participant V1 participant V2 Клиент->>Маршрутизатор: Запрос Маршрутизатор->>V1: Маршрут к v1 V1->>Клиент: Ответ Клиент->>Маршрутизатор: Запрос Маршрутизатор->>V2: Маршрут к v2 V2->>Клиент: Ответ

Автоматическое масштабирование микросервисов в 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

Шаги реализации

  1. Определение развёртывания. Сначала определите развёртывание для вашего микросервиса.
    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
    
  2. Применение развёртывания. Примените конфигурацию развёртывания к кластеру Kubernetes.
    kubectl apply -f deployment.yaml
    
  3. Создание 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

Шаги реализации

  1. Установка 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
    
  2. Создание 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

Шаги реализации

  1. Установите KEDA. Сначала вам нужно установить оператор KEDA в вашем кластере Kubernetes.
    kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.7.1/keda-2.7.1.yaml
    
  2. Создайте масштабируемый объект. Создайте масштабируемый объект конфигурации и примените его к кластеру 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