Чтобы проверить процент памяти, используемый каждым пространством имен, вам понадобится запрос, аналогичный приведенному ниже:
sum( container_memory_working_set_bytes{container="", namespace=~".+"} )|
by (namespace) / ignoring (namespace) group_left
sum( machine_memory_bytes{}) * 100
Вышеуказанный запрос должен создать график, подобный этому:
![ГРАФАНА ИМИДЖ](https://i.stack.imgur.com/eiqur.png)
Отказ от ответственности !:
- Снимок экрана выше взят из Grafana для лучшей наглядности.
- Этот запрос не подтверждает изменения в доступной оперативной памяти (изменения узлов, автоматическое масштабирование узлов и т. д.).
Чтобы получить метрику за определенный период времени в PromQL, вам нужно будет использовать дополнительную функцию, например:
avg_over_time(EXP[time])
.
Чтобы вернуться в прошлое и рассчитать ресурсы с определенного момента времени, вам нужно будет использовать:
При использовании вышеуказанных указателей запрос должен сочетаться с:
avg_over_time( sum(container_memory_working_set_bytes{container="", namespace=~".+"} offset 45m) by (namespace)[120m:]) / ignoring (namespace) group_left
sum( machine_memory_bytes{})
Вышеупомянутый запрос вычислит средний процент памяти, используемый каждым пространством имен, и разделит его на всю память в кластере в промежутке от 120 минут до настоящего времени. Он также начнется на 45 минут раньше текущего времени.
Пример:
- Время выполнения запроса: 20:00
avg_over_time(EXPR[2h:])
offset 45 min
Вышеупомянутый пример начнется в 17:15 и запустит запрос до 19:15. Вы можете изменить его, чтобы включить всю неделю :).
Если вы хотите рассчитать использование ЦП по пространству имен, вы можете заменить эту метрику следующей:
container_cpu_usage_seconds_total{}
- проверьте rate()
функцию при использовании этой метрики (счетчика)
machine_cpu_cores{}
Вы также можете посмотреть на эти сетевые показатели:
container_network_receive_bytes_total
- проверьте rate()
функцию при использовании этой метрики (счетчика)
container_network_transmit_bytes_total
- проверьте rate()
функцию при использовании этой метрики (счетчика)
Я включил более подробное объяснение ниже с примерами (память), методологией тестирования и анализа используемых запросов.
Предположим:
- Kubernetes cluster
1.18.6
(Kubespray) with 12GB of memory in total:
- master node with
2GB
of memory
- узел worker-one с
8GB
памяти
- узел worker-two с
2GB
памяти
- Prometheus и Grafana установлены с помощью: Github.com: Coreos: Kube-prometheus em >
- Namespace
kruk
with single ubuntu
pod set to generate artificial load with below command:
$ stress-ng --vm 1 --vm-bytes <AMOUNT_OF_RAM_USED> --vm-method all -t 60m -v
Искусственная нагрузка была сгенерирована stress-ng
два раза:
- 60 минут - используется 1 ГБ памяти
- 60 минут - используется 2 ГБ памяти
Процент памяти, используемой пространством имен kruk
в этот промежуток времени:
- 1 ГБ, что составляет около 8,5% всей памяти в кластере (12 ГБ)
- 2 ГБ, что составляет около 17,5% всей памяти в кластере (12 ГБ)
Загрузка из запроса Prometheus для пространства имен kruk
выглядела так:
![Использование памяти пространства имен kruk](https://i.stack.imgur.com/x1FTl.png)
Расчет с использованием avg_over_time(EXPR[time:]) / memory in the cluster
показал использование в среднем около 13% ((17.5+8.5)/2
) при запросе времени создания искусственной нагрузки. Это должно указывать на то, что запрос был правильным:
![«Среднее](https://i.stack.imgur.com/g3y6r.png)
Что касается используемого запроса:
avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:]) / ignoring (namespace) group_left
sum( machine_memory_bytes{}) * 100
Вышеупомянутый запрос действительно похож на тот, что был в начале, но я внес некоторые изменения, чтобы показать только пространство имен kruk
.
Я разделил объяснение запроса на 2 части (делимое / делитель).
Дивиденды
container_memory_working_set_bytes{container="", namespace="kruk"}
Эта метрика выводит записи об использовании памяти в пространстве имен kruk
. Если вам нужно было запросить все пространства имен, посмотрите дополнительное объяснение:
namespace=~".+"
‹- это регулярное выражение будет соответствовать только тогда, когда значение внутри ключа пространства имен содержит 1 или более символов. Это сделано для того, чтобы избежать пустого результата в пространстве имен с агрегированными метриками.
container=""
‹- часть используется для фильтрации метрики. Если бы вы выполняли запрос без него, вы бы получили несколько показателей использования памяти для каждого контейнера / модуля, как показано ниже. container=""
будет соответствовать только тогда, когда значение контейнера пусто (последняя строка в приведенной ниже цитате).
container_memory_working_set_bytes{container="POD",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/e249c12010a27f82389ebfff3c7c133f2a5da19799d2f5bb794bcdb5dc5f8bca",image="k8s.gcr.io/pause:3.2",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_POD_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 692224
container_memory_working_set_bytes{container="ubuntu",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/fae287e7043ff00da16b6e6a8688bfba0bfe30634c52e7563fcf18ac5850f6d9",image="ubuntu@sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_ubuntu_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2186403840
container_memory_working_set_bytes{endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2187096064
Вы можете узнать больше о контейнере паузы здесь:
sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)
Этот запрос суммирует результаты по соответствующим пространствам имен. offset 1380m
используется, чтобы вернуться в прошлое, поскольку тесты проводились в прошлом.
avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:])
Этот запрос будет вычислять среднее значение по метрике памяти по пространствам имен в указанное время (с 120 мин до настоящего времени), начиная с 1380 м до настоящего времени.
Вы можете узнать больше о avg_over_time()
здесь:
Делитель
sum( machine_memory_bytes{})
Эта метрика суммирует объем памяти, доступный на каждом узле кластера.
EXPR / ignoring (namespace) group_left
sum( machine_memory_bytes{}) * 100
Сфокусироваться на:
/ ignoring (namespace) group_left
‹- это выражение позволит вам разделить каждую запись в делимом (каждое пространство имен с их средним объемом памяти по времени) на делитель (всю память в кластере). Подробнее об этом можно прочитать здесь: Prometheus.io: Vector соответствие
* 100
не требует пояснений и умножает результат на 100, чтобы он выглядел как проценты.
Дополнительные ресурсы:
person
Dawid Kruk
schedule
03.08.2020