Основные понятия масштабируемости
Прежде чем найти решение масштабирования, необходимо понять, что такое масштабируемость и как она применяется к приложениям Kubernetes.
В этом уроке мы рассмотрим некоторые концепции масштабируемости.
Масштабируемость
Масштабируемость описывает способность приложения или системы обрабатывать все больше работы, добавляя в нее дополнительные ресурсы.
В нашем примере объем работы, в которой наблюдается увеличение, — это количество запросов клиентов. Объем добавленных ресурсов можно представить двумя способами: вертикальной масштабируемости и горизонтальной масштабируемости.
Вертикальная масштабируемость
Вертикальная масштабируемость или масштабирование относится к масштабированию системы путем добавления дополнительных физических ресурсов, таких как память или мощность ЦП. Например, если веб-сайт вашей компании потребляет слишком много памяти, можно обновить экземпляр виртуальной машины, чтобы включить больше памяти, сохраняя одно и то же базовое приложение.
Короче говоря, вертикальное масштабирование включает увеличение размера виртуальной машины при сохранении числа приложений. Этот подход ценен, если у вас есть монолитные приложения, требующие много вычислительной мощности, но слишком дорогостоящие, чтобы разбить на небольшие части. Эти приложения в основном размещаются на виртуальных машинах, а не в распределенных системах.
Несмотря на более управляемую стоимость, очень большие виртуальные машины могут стать очень дорогими. Стоимость добавления дополнительных вычислительных ресурсов выше, чем стоимость дедупликации небольших виртуальных машин. Существует максимальное ограничение на количество ресурсов, которые можно добавить на одну виртуальную машину, то есть необходимо в конечном итоге дублировать виртуальную машину после достижения верхней границы.
Горизонтальное масштабируемость
Горизонтальное масштабирование или масштабирование относится к масштабированию системы путем дедупликации приложения и балансировки нагрузки между экземплярами приложения.
Горизонтальное масштабирование ценно для распределенных приложений, таких как развернутые в AKS, и системы без отслеживания состояния, так как можно развернуть несколько контейнеров с одним приложением на одной виртуальной машине. Масштабирование позволяет извлечь большую часть ресурсов при оплате за одну виртуальную машину.
В нашем примере ваш корпоративный сайт является без отслеживания состояния. Это означает, что масштабирование является лучшим курсом действий. Kubernetes предоставляет устаревший ресурс с именем HorizontalPodAutoscaler (HPA), который позволяет масштабировать развертывания.
Масштабирование в Kubernetes вручную
Прежде чем мы рассмотрим HPA, давайте рассмотрим, как масштабировать приложение Kubernetes вручную.
Каждое развертывание привязано к другому ресурсу под названием ReplicaSet. РепликаSet отвечает за поддержание "требуемого состояния реплика" и масштабирования реального приложения в или вне, чтобы сохранить требуемое состояние так же, как и реальное состояние. Вы можете контролировать количество реплика в развертывании с помощью spec.replicas
ключа в спецификации развертывания. Этот ключ задает количество требуемых реплика в базовом наборе реплик и заставляет контроллер реплика tion сохранить это число реплика в любое время.
Вы также можете контролировать количество реплика в развертывании kubectl scale deploy/contoso-website --replicas <number>
с помощью команды. Эта команда динамически изменяет количество требуемых реплика в развертывании и масштабирует приложение в или вне.
HorizontalPodAutoscaler (HPA)
HPA — это собственный ресурс Kubernetes 1.8 +, обеспечивающий возможность горизонтального масштабирования для модулей pod в кластере. Каждые 30 секунд он отслеживает любые изменения необходимого количества реплик в API метрик. Если требуемое количество реплика отличается от текущего реплика счетчика, диспетчер контроллеров, который управляет объектами HPA, масштабирует развертывание в или вне.
HPA работает вместе с группой API autoscaling
в Kubernetes. Существует две версии для этой группы API: v1
и v2
. Версия v1
позволяет масштабировать развертывание только на основе метрик ЦП. Версия v2
обеспечивает собственный мониторинг ЦП и памяти. В этом модуле мы используем версию v2
.
Каждый ресурс HPA связан со ссылкой масштабирования, которая определена в ключе spec.scaleTargetRef
манифеста HPA. Эта ссылка на масштабирование должна иметь базовые модули pod для масштабирования, в противном случае HPA не работает, так как невозможно применить масштабирование к объектам, которые нельзя масштабировать, например DaemonSets.
Важно, чтобы в каждом модуле pod был задан запрос ресурса в спецификации. Алгоритм HPA не может правильно вычислить метрики и определить использование ресурсов без этого параметра. Это ограничение можно задать с помощью spec.template.spec.containers[].resources
ключа в манифесте развертывания, как показано в следующем примере:
spec:
template:
spec:
containers:
- resources:
requests:
cpu: 250m
memory: 256M
limits:
cpu: 500m
memory: 512M
Пример манифеста HPA
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50