После прочтения этой статьи вы узнаете, как настроить AutoScaling на основе среднего количества HTTP-запросов в секунду.
Я не нашел никакой статьи, описывающей конфигурацию горизонтального автоскализатора POD на основе метрики HTTP-запросов от ISIO. Есть несколько источников, но все они устарели или намного сложнее, чем мое решение.
Некоторое время назад мы создали аналогичное автоскализаторующее решение на основе метрик от балансировщика AWS Load, который использовался масштабированием контейнеров, развернутых на ECS. Сначала мы проверили автоскализацию на основе CPU, но у нас было много проблем из-за высокого использования CPU на запуск приложения. Масштабирование на основе количества HTTP-запросов работало намного лучше. Тем не менее, в мире Кубернаны все совершенно другое …
Все исходный код доступен здесь: https://github.com/devopsbox-io/example-istio-hpa
В этой статье я использовал несколько инструментов, вы, вероятно, могли бы заменить некоторые из них. Не забудьте использовать довольно новую версию ISTIO (тестированные с 1.7.2). Вероятно, более старые версии не имеют ISTIO_REQUESTS_TOTAL METRIC, доступен на POD. Список инструментов:
- Minikube (проверено с v1.10.1, kubernetes v1.17.12)
- KVM (требуется Minikube)
- Kubectl (проверено с v1.17.12)
- Хелм (проверено с v3.2.1)
- Осада (проверено с 4.0.4)
- Istioctl (проверен с 1.7.2)
Прежде всего, мы должны начать Minikube:
minikube start --driver=kvm2 --kubernetes-version v1.17.12 --memory=8192 --cpus=4 && minikube tunnel
Несколько вещей, которые нужно упомянуть здесь: я использую KVM2 и Kubernetes версии 1.17, но решение, вероятно, будет работать на разных версиях Kubernetes и разных драйверов Minikube (или даже других дистрибутивов Kubernetes). Нам нужно довольно много RAM и CPU, потому что мы хотим проверить автоскализацию. Последнее — мы должны запустить туннель Minikube, чтобы получить доступ к воротам Istio Inhress, поэтому он попросит вас за пароль Sudo, и он заблокирует ваш терминал, поэтому вам придется открыть новый.
Далее нам нужно установить ISTIO:
istioctl install -y
Мы используем конфигурацию ISTIO по умолчанию. Здесь ничего особенного.
Затем мы создадим пространства имен и включите ISTIO Automatic Sidecar Injection на одном из них:
kubectl create namespace monitoring kubectl create namespace dev kubectl label namespace dev istio-injection=enabled
Я не буду объяснять, что такое Sidecar и как работает Isttio, но если вы хотите узнать больше — просто прочитайте документацию ISTIO.
Затем мы развертываем пример приложения (код, доступный здесь: https://github.com/devopsbox-io/example-istio-hpa/blob/main/sample-app-with-istio.yaml):
kubectl -n dev apply -f sample-app-with-istio.yaml
и ждать развертывания на работу (вероятно, несколько минут):
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
until curl -f http://$INGRESS_HOST; do echo "Waiting for the application to start..."; sleep 1; done
Это почти немодифицированное приложение HTTPBIN из ISTIO Documentation.
Для нашего решения нам понадобится Premetheus, чтобы скорректировать метрики из ISTIO:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo add stable https://kubernetes-charts.storage.googleapis.com/ helm repo update helm -n monitoring install prometheus prometheus-community/prometheus
Это диаграмма Helm по умолчанию для установки PROMETHEUS. Мы используем это, потому что ISTIO имеет конфигурацию по умолчанию для выставления метрик для него, то есть POD имеет следующие аннотации:
prometheus.io/path:/Статистика/ПрометейPROMETHEUS.IO///3020PROMETHEUS.IO/Scrape: True
Наличие установленного PROMETHEUS не означает, что мы можем использовать его метрики для горизонтального автоскализатора. Нам понадобится еще одна вещь — Adapter PrimeTheus установлен с настраиваемым файлом конфигурации PROMETHEUS-ADAPTER-NECTORS.YAML:
prometheus:
url: http://prometheus-server.monitoring.svc.cluster.local
port: 80
rules:
custom:
- seriesQuery: 'resources:
overrides:
kubernetes_namespace: {resource: "namespace"}
kubernetes_pod_name: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
Здесь мы можем увидеть наш URL-адрес экземпляра PROMETHEUS, порт и одно собственное правило. Давайте сосредоточимся на этом правиле:
сериалыНеобходимо для метрических ресурсов обнаружения/переопределения — это отображение полей из метрики (kubernetes_namespace,kubernetes_pod_name) На имена, требуемые Kubernetes (пространство имен,POD).Имя/матчи,Имя/какнеобходимы для изменения имени метрики. Мы преобразуем эту метрику, так что полезно изменить имя iStio_requests_total для istio_requests_per_second.metricsqueryВот фактический запрос (который на самом деле является шаблоном запроса), и он будет запускаться адаптером при сочетании метрики от PROMETHEUS.Оценитеи[2m]«рассчитывает среднюю скорость увеличения временного ряда временных рядов в векторе диапазона» (от документации PROMETHEUS), вот это вторая скорость HTTP-запросов, измеренных за последние 2 минуты, за время серии в диапазоне в диапазоне Фото со стока (также почти от документации PROMETHEUS).
Теперь, как у нас есть конфигурация адаптера, мы можем развернуть его использовать:
helm -n monitoring install prometheus-adapter prometheus-community/prometheus-adapter -f prometheus-adapter-values.yaml
ОК, поэтому последнее — создать горизонтальный автоскалер POD, используя следующую конфигурацию:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: httpbin
spec:
minReplicas: 1
maxReplicas: 5
metrics:
- type: Pods
pods:
metric:
name: istio_requests_per_second
target:
type: AverageValue
averageValue: "10"
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: httpbin
Большая часть конфигурации является самоснабжением. ScaletArgetref Ссылки на наше объект развертывания приложения и мин и максимальные реплики являются нашими границами. Самая интересная часть — Метрики — Здесь мы говорим автоскалеру использовать наш пользовательский ISTIO_REQUESTS_PER_SECOND Метрика (которая рассчитана на POD) и что она должна масштабироваться после более чем 10 средних запросов в секунду.
Одна из самых важных вещей — вероятно, когда были написаны другие статьи об этой теме, istio_requests_total. Метрика не была рассчитана на POD. Все было намного проще, потому что теперь это!
Теперь давайте создадим горизонтальный автоскалер POD:
kubectl -n dev apply -f hpa.yaml
и дождитесь наличия метрики (вероятно, несколько минут):
until kubectl -n dev describe hpa | grep "\"istio_requests_per_second\" on pods:" | grep -v "/ 10"; do echo "Waiting for the metric availability..."; sleep 1; done
У нас есть наш аутокалирование и бега. Давайте проверим это!
Прежде всего, мы можем открыть два новых окна терминала и смотреть, что происходит (каждая строка в отдельном окне):
watch kubectl -n dev get pod watch kubectl -n dev describe hpa httpbin
Тогда давайте начнем тестирование:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
siege -c 2 -t 5m http://$INGRESS_HOST
Вы можете использовать другие инструменты, чем осада (например, эй). Важно, чтобы он должен поддерживать HTTP/1.1 SO AS AB (Apache Censmark) не является правильным решением.
Через несколько минут вы должны увидеть больше стручков, и что «описать HPA» показывает текущее количество запросов в секунду.
Нетственно создать автоматический раствор на основе HTTP-запросов на секунду метрики, если вы знаете, что вы делаете. Следует также довольно просто, чтобы изменить его в какой-то другой метрика прометея. Но если вы действительно сделаете это сами? Наша DevOpbox Platform уже встроен в полное автоскализация с разумными значениями по умолчанию!
Для получения более подробной информации о платформе DevOpsbox Пожалуйста, посетите https://www.devopsbox.io/
Оригинал: «https://dev.to/mraszplewicz/horizontal-pod-autoscaling-based-on-http-requests-metric-from-istio-cc3»