Горизонтальный POD Autoscaler автоматически масштабирует количество стручков в контроллере репликации, развертывания, набора реплик или набора состояния на основе наблюдаемого использования ЦП (или, с помощью Custom Metrics Обратите внимание, что горизонтальное автомассалирование POD не применяется к объектам, которые не могут быть масштабированы, например, Daemonsets.
Как работает горизонтальный аутоскальщик POD?
Горизонтальный POD Autoscaler реализован как ресурс API Kubernetes и контроллер. Ресурс определяет поведение контроллера. Контроллер периодически корректирует количество реплик в контроллере репликации или развертывании, чтобы соответствовать наблюдаемому среднему использованию ЦП для цели, указанной пользователем.
Чтобы узнать больше о том, как работает Kubernetes HPA, вы можете прочитать Эта подробная статья из официального kubernetes.io Анкет
Наиболее распространенный пример конфигураций HPA основан на показателях использования процессоров/памяти, предоставленных Метрики-сервер Анкет В этой статье я приведу пример масштабирования/вниз по развертыванию Kubernetes на основе пользовательских метрик для конкретных приложений. Приложение будет Node.js ( Express ) Сервер с ВЕБ -ОКОКА Поддержка и цель будет состоять в том, чтобы масштабировать/вниз по развертыванию на основе количества подключенных клиентов (подсчет соединений).
Для достижения этой цели этот пост будет сосредоточен на:
- Создание демонстрационного приложения с поддержкой WebSocket.
- Интеграция Прометей-клиент раскрыть статистику WebSocket как метрику Прометея.
- Настройка Прометей Чтобы собрать обнаженные метрики.
- Настройка Прометей-Адаптер Чтобы преобразовать метрику Прометея в метрику жалобы HPA.
- Настройка HPA для использования и потребления метрики жалобы.
Создание демонстрационного приложения с поддержкой WebSocket
Следующий код создаст приложение Demo Express и интегрирует WebSocket на /ws/
дорожка.
https://github.com/shebang-labs/websocket-prometheus-hpa-example/blob/main/app.js
Интеграция Prometheus-Client для разоблачения статистики WebSocket как метрика Prometheus
Следующий код будет интегрировать клиента Prometheus и разоблачить стандарт/жалоба Prometheus websockets_connections_total
Метрика на порту 9095. Следующим шагом является направление Прометея начать сбор и сбор этого метрики и сохранить статистику с течением времени.
https://github.com/shebang-labs/websocket-prometheus-hpa-example/blob/main/app.js
Настройка Prometheus для сбора обнаженных метрик
На этом этапе я буду использовать Хелм развернуть Прометею в кластере Kubernetes. Во -первых, нам нужно добавить репо Helm для Prometheus, используя эту команду:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
Затем мы можем установить Prometheus с постоянным томом для хранения и сохранять данные метрик с течением времени со следующей командой:
helm upgrade --install prometheus prometheus-community/prometheus --namespace prometheus --set alertmanager.persistentVolume.storageClass="gp2",server.persistentVolume.storageClass="gp2"
На этом этапе мы должны иметь компоненты Prometheus и отлично работать на Kubernetes Clsuter на Прометей
Пространство имен, как показано в следующем:
Прометей пространство имен (Kubernetes)
Чтобы направить Прометею, чтобы начать очищать/собирать приложение, обнажаемое метрикой websockets_connections_total
Со временем нам нужно аннотировать стручок, который запускает приложение Express со следующими аннотациями:
prometheus.io/scrape: 'true' prometheus.io/port: '9095'
Таким образом, развертывание приложения будет выглядеть как -то вроде:
https://github.com/shebang-labs/websocket-prometheus-hpa-example/blob/main/deployment.yaml
Настройка Adapter Prometheus-Adapter для преобразования метрики Prometheus в HPA.
На этом этапе Prometheus соскребает метрики каждые 1 секунду из порта 9095 из всех стручков в этом развертывании. Чтобы проверить это, вы можете перенести порт-сервер Прометеуса в локальный хост и получить доступ к его пользовательскому интерфейсу запроса/приборной панели, используя следующую команду:
kubectl --namespace=prometheus port-forward deploy/prometheus-server 9090
что сделает панель доступной на Localhost: 9090
. Тогда вы можете искать websockets_connections_total
Чтобы увидеть сокраренные метрики с течением времени, как показано здесь:
В этом примере запрос вернул 2 графика, так как в этом развертывании есть 2 стручки, генерирующие разные websockets_connections_total
ценности. Один из стручков имеет 1-2 подключения к WebSocket сверхурочно, а у другого есть 0 соединений.
На следующем этапе мы начнем использовать средние значения (сумма сообщений о подсчетах от разных стручков/стручков), чтобы определить, как масштаб вверх и вниз. Но сначала нам нужно превратить эти метрики Прометея в метрику жалобы HPA. Мы можем достичь этого, используя Прометей-Адаптер
Анкет
Вы можете установить Прометей-Адаптер
Как диаграмма руля. Вы должны указать адаптер на экземпляр Prometheus, чтобы запросить данные оттуда. Также вам нужно будет рассказать адаптеру, как запросить метрики, преобразовать и отформатировать их.
Это можно сделать с помощью следующих пользовательских конфигураций Helm:
prometheus: url: http://prometheus-server.prometheus.svc port: 80 rules: custom: - seriesQuery: '{__name__=~"^myapp_websockets_connections_total$"}' resources: overrides: kubernetes_namespace: resource: namespace kubernetes_pod_name: resource: pod name: matches: "^(.*)_total" as: "${1}_avg" metricsQuery: (avg(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>))
Prometheus-adapter-values.yaml
Теперь вы можете использовать этот файл для установки пользовательского Прометей-Адаптер
следующим образом:
helm upgrade --install prometheus-adapter prometheus-community/prometheus-adapter --values=./prometheus-adapter-values.yaml --namespace prometheus
Чтобы убедиться, что адаптер работал так, как и ожидалось, вы сможете запросить пользовательские метрики HPA, используя следующую команду:
# I'm using jq for better formatting. You can omit it if needed. kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/myapp-namespace/pods/*/myapp_websockets_connections_avg" | jq .
Это должно показать результат, подобный:
Настройка HPA для использования и потребления метрики жалобы
Используя следующее определение HPA, мы можем контролировать масштабирование развертывания вверх и вниз на основе подключений AVG Websockets на POD:
https://github.com/shebang-labs/websocket-prometheus-hpa-example/blob/main/hpa.yaml
В этом примере я настроил Min Replicas как 2
и максимум быть 10
а затем Kubernetes будет использовать myApp_websockets_connections_avg
Значение со временем, чтобы соответствовать цели 5 соединений на капсул
и он будет динамически масштабироваться вверх и вниз, чтобы соответствовать этой цели 🎉🎉
Оригинал: «https://dev.to/tareksamni/horizontal-scaling-websockets-on-kubernetes-and-node-js-1121»