Эта статья опубликована сообществом Huawei Cloud « Выполнение HPA на указанном бэкэнде на основе индикаторов Nginx Ingress ». Автор: Вы можете подружиться.
фон
В производственных сценариях входящий трафик Nginx в конечном итоге будет перенаправляться в разные приложения через доменные имена и пути. Иногда ЦП и память не являются узкими местами производительности nginx. В этом случае nginx_ingress_controller_requests
HPA можно настроить для соответствующего приложения на основе показателей для достижения эластичности. укажите внутренние рабочие нагрузки на основе объема запросов различных доменных имен и путей.
Введение
Экологическая подготовка
- 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/home
nginx_ingress_controller_requests соответственно, индикаторы в норме
Создайте ресурс 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
внешние правила: - 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_секунду
Создание правил 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
Гибкая демонстрация
Используйте команду для стресс-тестирования имени домена доступа и пути, соответствующего образцу приложения, и нормально активируйте эластичность. Настройте сопоставление между именем домена и адресом ELB самостоятельно;
ab -c 50 -n 5000 http://test.example.com/
Используйте тот же метод для стресс-тестирования тестового приложения и запуска эластичности в обычном режиме.
ab -c 50 -n 5000 http://test.example.com/home
Нажмите, чтобы подписаться и узнать о новых технологиях Huawei Cloud как можно скорее~
Линус взял на себя задачу не допустить, чтобы разработчики ядра заменяли табуляции пробелами. Его отец — один из немногих руководителей, умеющих писать код, его второй сын — директор отдела технологий с открытым исходным кодом, а младший сын — ядро с открытым исходным кодом. участник Робин Ли: Естественный язык станет новым универсальным языком программирования. Модель с открытым исходным кодом будет все больше и больше отставать от Huawei: потребуется 1 год, чтобы полностью перенести 5000 часто используемых мобильных приложений на язык Hongmeng, наиболее подверженный этому . сторонние уязвимости. Расширенный текстовый редактор Quill 2.0 был выпущен с функциями, надежностью и разработчиками. Опыт был значительно улучшен. Ма Хуатэн и Чжоу Хунъи пожали друг другу руки, чтобы «устранить обиды». Meta Llama 3 официально выпущен. источник Laoxiangji не является кодом, причины этого очень трогательны. Google объявил о масштабной реструктуризации.