Выполните HPA на указанном бэкэнде на основе показателей Nginx Ingress.

Эта статья опубликована сообществом Huawei Cloud « Выполнение HPA на указанном бэкэнде на основе индикаторов Nginx Ingress ». Автор: Вы можете подружиться.

фон

В производственных сценариях входящий трафик Nginx в конечном итоге будет перенаправляться в разные приложения через доменные имена и пути. Иногда ЦП и память не являются узкими местами производительности nginx. В этом случае nginx_ingress_controller_requestsHPA можно настроить для соответствующего приложения на основе показателей для достижения эластичности. укажите внутренние рабочие нагрузки на основе объема запросов различных доменных имен и путей.

Введение

Экологическая подготовка

  • nginx-ingress развернут
  • Установлен собственный плагин облачного мониторинга kube-prometheus-stack (режим сервера). Плагин по умолчанию отслеживает вход nginx. Для сред с открытым исходным кодом настройте мониторинг самостоятельно.
  • Настройте команду kubectl или используйте CloudShell.

Примечание. Поскольку пространство имен не может быть указано в правилах HPA scaleTargetRefи describedObjectдвух полях, источник индикатора, HPA и эластичная цель должны находиться в одном пространстве имен, тогда как рабочие нагрузки nginx-ingress и бизнес-задачи обычно находятся в разных пространствах имен; Введите HPA, пространство имен источника индикатора можно игнорировать.

Шаги

Создайте эластичную целевую рабочую нагрузку, сервис и вход, необходимые для демонстрации.

apiVersion: приложения/v1
вид: Развертывание
метаданные:
  имя: test-hpa
  этикетки:
    приложение: тестовое приложение
спецификация:
  реплики: 1
  селектор:
    Метки совпадений:
      приложение: тестовое приложение
  шаблон:
    метаданные:
      этикетки:
        приложение: тестовое приложение
    спецификация:
      контейнеры:
      - изображение: skto/sample-app:v2
        имя: поставщик метрик
        порты:
        - имя: http
          контейнерПорт: 8080
---
APIВерсия: v1
вид: Сервис
метаданные:
  имя: тестовое приложение
  пространство имен: по умолчанию
  этикетки:
    приложение: тестовое приложение
спецификация:
  порты:
    - порт: 8080
      имя: http
      протокол: TCP
      целевой порт: 8080
  селектор:
    приложение: тестовое приложение
  тип: КластерIP

---
apiVersion: приложения/v1
вид: Развертывание
метаданные:
  имя: образец приложения
  этикетки:
    приложение: образец приложения
спецификация:
  реплики: 1
  селектор:
    Метки совпадений:
      приложение: образец приложения
  шаблон:
    метаданные:
      этикетки:
        приложение: образец приложения
    спецификация:
      контейнеры:
      - изображение: skto/sample-app:v2
        имя: поставщик метрик
        порты:
        - имя: http
          контейнерПорт: 8080
---
APIВерсия: v1
вид: Сервис
метаданные:
  имя: образец приложения
  пространство имен: по умолчанию
  этикетки:
    приложение: образец приложения
спецификация:
  порты:
    - порт: 80
      имя: http
      протокол: TCP
      целевой порт: 8080
  селектор:
    приложение: образец приложения
  тип: КластерIP
---
apiVersion: networking.k8s.io/v1
вид: Вход
метаданные:
  имя: тестовый вход
  пространство имен: по умолчанию
спецификация:
  имя входного класса: nginx
  правила:
    - хост: test.example.com
      http:
        пути:
          - бэкэнд:
              услуга:
                имя: образец приложения
                порт:
                  номер: 80
            путь: /
            PathType: РеализацияСпецифик
          - бэкэнд:
              услуга:
                имя: тестовое приложение
                порт:
                  номер: 8080
            путь: /домой
            PathType: РеализацияСпецифик

Индикаторы Query test.example.com/и test.example.com/homenginx_ingress_controller_requests соответственно, индикаторы в норме

изображение.png

изображение.png

Создайте ресурс apiservices внешнего типа; после создания статус apiservices может быть ложным. После добавления externalRules статус становится истинным.

apiVersion: apiregistration.k8s.io/v1
вид: APIService
метаданные:
  имя: v1beta1.external.metrics.k8s.io
спецификация:
  группа: external.metrics.k8s.io
  groupPriorityМинимум: 100
  insecureSkipTLSVerify: правда
  service: #Укажите службу, соответствующую prometheus-adapter. Имя адаптера в подключаемом модуле Huawei CCE — custom-metrics-apiserver.
    имя: custom-metrics-apiserver
    пространство имен: мониторинг
    порт: 443
  версия: v1beta1
  приоритет версии: 100

Добавьте правила externalRules в конфигурационную карту адаптера. После внесения изменений необходимо перезапустить службу prometheus-adapter.

kubectl -n мониторинг редактирования карты конфигурации user-adapter-config

изображение.png

внешние правила:
- metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) на (<<.GroupBy>>)
  имя:
    как: ${1}_per_sec
    совпадения: ^(.*)
  Ресурсы:
    namespaced: false #Игнорировать пространство имен источника индикатора, эта конфигурация не применяет правила
  seriesQuery: nginx_ingress_controller_requests

 

seriesQuery : исходный индикатор; вы можете написать имя индикатора напрямую или использовать {labelKey=labelValue}, чтобы отфильтровать исходный индикатор.

metricsQuery : используйте PromQL для фильтрации и агрегирования индикаторов, .Seriesпредставляет исходные индикаторы, .LabelMatchersпредставляет фильтрацию индикаторов по меткам, а в hpa можно настроить определенные правила фильтрации;

name : Переименуйте индикатор

ресурсы : вызывается через API, когда hpa запрашивает индикаторы, путь вызова:

 

Функция ресурсов — заменить ${namespace} в пути значением тега пространства имен в индикаторе, и наше решение должно игнорировать пространство имен источника индикатора.

После перезапуска службы custom-metrics-apiserver нужно подождать около 1 минуты и выполнить команду, чтобы проверить, в норме ли показатели.

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_requests_per_секунду

изображение.png

Создание правил HPA

apiVersion: автомасштабирование/v2
вид: HorizontalPodAutoscaler
метаданные:
  имя: образец-hpa
спецификация:
  масштабтаржетреф:
    apiVersion: приложения/v1
    вид: Развертывание
    имя: образец приложения
  мин Ответов: 1
  Максимальное количество реплик: 10
  метрики:
    - тип: Внешний
      внешний:
        метрика:
          имя: nginx_ingress_controller_requests_per_секунду
          селектор:
            matchLabels: #Вы можете фильтровать индикаторы по этому полю. Условия фильтрации меток будут добавлены в <<.LabelMatchers>> из externalRules.
              Exported_service: sample-app #Filter запросы, серверная служба которых является примером приложения
              хост: test.example.com #Фильтрация запросов на доступ к доменному имени test.example.com
        цель:
          тип: AverageValue #Внешний тип индикатора поддерживает только целевые значения типов Value и AverageValue.
          среднее значение: 30
---
apiVersion: автомасштабирование/v2
вид: HorizontalPodAutoscaler
метаданные:
  имя: test-hpa
спецификация:
  масштабтаржетреф:
    apiVersion: приложения/v1
    вид: Развертывание
    имя: тестовое приложение
  мин Ответов: 1
  Максимальное количество реплик: 10
  метрики:
    - тип: Внешний
      внешний:
        метрика:
          имя: nginx_ingress_controller_requests_per_секунду
          селектор:
            Метки совпадений:
              Exported_service: тестовое приложение
              хост: test.example.com
        цель:
          тип: Среднее значение
          среднее значение: 30

изображение.png

Гибкая демонстрация

Используйте команду для стресс-тестирования имени домена доступа и пути, соответствующего образцу приложения, и нормально активируйте эластичность. Настройте сопоставление между именем домена и адресом ELB самостоятельно;

ab -c 50 -n 5000 http://test.example.com/

изображение.png

Используйте тот же метод для стресс-тестирования тестового приложения и запуска эластичности в обычном режиме.

ab -c 50 -n 5000 http://test.example.com/home

изображение.png

 

Нажмите, чтобы подписаться и узнать о новых технологиях Huawei Cloud как можно скорее~

 

Линус взял на себя задачу не допустить, чтобы разработчики ядра заменяли табуляции пробелами. Его отец — один из немногих руководителей, умеющих писать код, его второй сын — директор отдела технологий с открытым исходным кодом, а младший сын — ядро ​​с открытым исходным кодом. участник Робин Ли: Естественный язык станет новым универсальным языком программирования. Модель с открытым исходным кодом будет все больше и больше отставать от Huawei: потребуется 1 год, чтобы полностью перенести 5000 часто используемых мобильных приложений на язык Hongmeng, наиболее подверженный этому . сторонние уязвимости. Расширенный текстовый редактор Quill 2.0 был выпущен с функциями, надежностью и разработчиками. Опыт был значительно улучшен. Ма Хуатэн и Чжоу Хунъи пожали друг другу руки, чтобы «устранить обиды». Meta Llama 3 официально выпущен. источник Laoxiangji не является кодом, причины этого очень трогательны. Google объявил о масштабной реструктуризации.
{{o.name}}
{{m.name}}

рекомендация

отmy.oschina.net/u/4526289/blog/11053992