Рубрики
Uncategorized

Горизонтальный стручок AutoScaling на основе HTTP-запросов метрики из ISTIO

После прочтения этой статьи вы узнаете, как настроить AutoScaling на основе среднего числа … Теги с Куберовщиками, DevOps, ISTIO, AutoScaling.

После прочтения этой статьи вы узнаете, как настроить 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///3020
  • PROMETHEUS.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»