Как 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 секундам.