Как Kubernetes вычисляет загрузку ЦП для HPA?

Я хочу понять, как HPA вычисляет использование ЦП в модулях.

Согласно этому документу требуется среднее использование ЦП модуля (среднее значение за последнюю 1 минуту), разделенное на процессор, запрошенный модулем. Затем он вычисляет среднее арифметическое всех ЦП модулей.

К сожалению, документ содержит некоторую устаревшую информацию, например, что --horizontal-pod-autoscaler-sync-periodпо умолчанию установлено 30 секунд, но в официальном документе значение по умолчанию - 15 секунд.

Когда я тестировал, я заметил, что HPA масштабируется еще до того, как этот средний ЦП достигнет установленного мной порога (который составляет 90%), что заставило меня подумать, что, возможно, для этого требуется максимальный ЦП для всех модулей, а не средний.

У меня вопрос: где я могу найти обновленную документацию, чтобы точно понять, как работает HPA?

2 ответа

Обратите внимание, что у меня под рукой нет кластера Kubernetes, это теоретический ответ, основанный на исходном коде k8s.
Посмотрите, действительно ли это соответствует вашему опыту.


Kubernetes с открытым исходным кодом, вот, кажется, код HPA.

Функции GetResourceReplica а также calcPlainMetricReplicas(для процента неиспользования) вычислить количество реплик с учетом текущих показателей.
Оба используютusageRatio вернулся GetMetricUtilizationRatio Эта величина умножается на число в настоящее время готовых стручков в репликой, чтобы получить новое количество стручков:

New_number_of_pods = Old_numbers_of_ready_pods * usageRatio

Есть проверка допуска (т.е. если usageRatio падает достаточно близко к 1, ничего не делается), а модули с ожидающим и неизвестным состоянием игнорируются (считается, что они используют 0% ресурса), в то время как модули без метрик считаются использующими 100% ресурса.

В usageRatio вычисляется GetResourceUtilizationRatio которому передаются метрики и запросы (ресурсов) всех модулей, происходит следующее:

utilization = Total_sum_resource_usage_all_pods / Total_sum_resource_requests_all_pods
usageRatio = utilization * 100 / targetUtilization

где targetUtilizationпроисходит из спецификации HPA.
Код легче читать, чем это мое резюме, в этом контексте термин запрос означает "запрос ресурса" (это обоснованное предположение).

Таким образом, я бы сказал, что 90% - это использование ресурсов для всех модулей, вычисленных, поскольку все они были одним модулем, запрашивающим сумму запросов каждого модуля и собирающим метрики, поскольку все они выполнялись на одном выделенном узле.

Согласно https://github.com/kubernetes/kubernetes/issues/78988, это зависит от конфигурации и является проблемой сервера метрик и отчетов о кублетах, HPA должно использовать только информацию: https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/

Я думаю, что продолжительность должна быть определена kubelet --housekeeping-interval и по умолчанию равна 10 секундам.

Другие вопросы по тегам