Оповещения Kubernetes
Оповещения Kubernetes
Ключ-АСТРОМ предоставляет готовые оповещения для распространённых проблем Kubernetes в кластерах, нодах, пространствах имён, рабочих нагрузках и запросах на постоянные тома. Каждое оповещение — это либо оповещение о здоровье, которое запускает расследование проблемы, либо предупреждающий сигнал, который отмечает потенциальную проблему без открытия проблемы. Подробнее об этой модели серьёзности см. в разделе «Оповещения о здоровье и предупреждающие сигналы».
Эта страница содержит список всех готовых оповещений Kubernetes с указанием их серьёзности, рекомендуемых значений по умолчанию, времени снятия оповещения и логики обнаружения.
Настройка
Чтобы просмотреть или изменить конфигурацию оповещений Kubernetes:
- Перейдите в Настройки.
- Выберите Анализ и оповещения > Оповещения.
- В разделе Kubernetes вы можете найти типы объектов.
- Просмотрите включённые оповещения и при необходимости скорректируйте пороги.
Вы также можете открыть конфигурацию оповещений непосредственно из кластера или пространства имён в Kubernetes (new).
Серьёзность и рекомендуемые значения по умолчанию
С последним обновлением Ключ-АСТРОМ оповещения Kubernetes, которые ранее создавали проблему, были переклассифицированы как предупреждающие сигналы. Эта переклассификация выполняется автоматически и применяется ко всем средам — она не требует изменения конфигурации.
Независимо от этого, рекомендуемые значения по умолчанию доступны для всех сред. Они определяют, какие оповещения включены и их пороги обнаружения, но не применяются автоматически — ваша текущая конфигурация не затрагивается, пока вы явно не примените их в разделе Настройки > Анализ и оповещения > Оповещения > Kubernetes.
Каждое оповещение имеет два независимых измерения:
- Включено/отключено: активно ли оповещение отслеживает вашу среду.
- Порог обнаружения: условие, которое запускает оповещение.
В таблицах справочника оповещений ниже:
- ¹ отмечает оповещения, включение или порог которых изменяется при применении рекомендуемых значений по умолчанию.
- ² отмечает оповещения, переклассифицированные из оповещения о здоровье в предупреждающий сигнал — уже действует, независимо от рекомендуемых значений по умолчанию.
Следующие оповещения в настоящее время отключены и становятся включёнными с серьёзностью Критическая при применении рекомендуемых значений по умолчанию. Просмотрите их перед применением, так как они начнут открывать проблемы.
| Оповещение | Условие срабатывания |
|---|---|
| Обнаружение застрявших развёртываний | Останавливается прогресс ≥ 3 мин; в течение 5 мин |
| Обнаружение рабочих нагрузок без готовых подов | Нет готовых подов ≥ 10 мин; в течение 15 мин |
| Обнаружение событий отката подов | На основе событий |
| Обнаружение событий вытеснения подов | На основе событий |
Доступные оповещения
Кластер
| Оповещение | Тип проблемы | Включено (рекомендуется) | Порог обнаружения (рекомендуется) | Серьёзность | Снятие оповещения через | Расчёт |
|---|---|---|---|---|---|---|
| Обнаружение проблем готовности кластера | Доступность | Да | Не готов ≥ 10 мин; в течение 15 мин | Оповещение о здоровье | 10 минут | Метрика Cluster readyz |
| Обнаружение насыщения запросов CPU кластера | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Запросы CPU нод / Выделяемый CPU нод |
| Обнаружение насыщения запросов памяти кластера | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Запросы памяти нод / Выделяемая память нод |
| Обнаружение насыщения подов кластера | Ресурс | Нет | > 90 % подов / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма готовых подов / Сумма выделяемых подов |
| Обнаружение проблем мониторинга | Доступность | Да ¹ | Недоступно ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ¹ ² | 10 минут | Доступность мониторинга через API Ключ-АСТРОМ |
Обнаружение проблем мониторинга не имеет связанной метрики или выражения DQL — оно отслеживает доступность собственного мониторинга кластера Ключ-АСТРОМ на основе API, а не состояние кластера.
Метрики и выражения DQL для кластера
Нода
| Оповещение | Тип проблемы | Включено (рекомендуется) | Порог обнаружения (рекомендуется) | Серьёзность | Снятие оповещения через | Расчёт |
|---|---|---|---|---|---|---|
| Обнаружение проблем готовности ноды | Доступность | Да ¹ | Не готова ≥ 10 мин; в течение 20 мин | Предупреждающий сигнал ¹ ² | 10 минут | Метрика состояния ноды с фильтром 'not ready' |
| Обнаружение проблемных состояний ноды | Ошибка | Да ¹ | Проблемное ≥ 10 мин; в течение 20 мин | Предупреждающий сигнал ¹ ² | 10 минут | Метрика состояния нод |
| Обнаружение насыщения запросов CPU ноды | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма запросов CPU ноды / Сумма выделяемого CPU нод |
| Обнаружение насыщения запросов памяти ноды | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма запросов памяти ноды / Сумма выделяемой памяти нод |
| Обнаружение насыщения подов ноды | Ресурс | Нет | > 90 % подов / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма работающих подов на ноде / Лимит подов ноды |
Обнаружение проблемных состояний ноды срабатывает при любом из следующих состояний: ContainerRuntimeProblem, ContainerRuntimeUnhealthy, CorruptDockerOverlay2, DiskPressure, FilesystemCorruptionProblem, FrequentContainerdRestart, FrequentDockerRestart, FrequentGcfsSnapshotterRestart, FrequentGcfsdRestart, FrequentKubeletRestart, FrequentUnregisterNetDevice, GcfsSnapshotterMissingLayer, GcfsSnapshotterUnhealthy, GcfsdUnhealthy, KernelDeadlock, KubeletProblem, KubeletUnhealthy, MemoryPressure, NetworkUnavailable, OutOfDisk, PIDPressure, ReadonlyFilesystem.
Метрики и выражения DQL для ноды
Обнаружение насыщения запросов CPU ноды
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.node.requests_cpu:splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum/builtin:kubernetes.node.cpu_allocatable:splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.container.requests_cpu, rollup: avg), o2=sum(dt.kubernetes.node.cpu_allocatable, rollup: avg)}, by: {dt.kubernetes.node.system_uuid,k8s.node.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения запросов памяти ноды
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.node.requests_memory:splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum/builtin:kubernetes.node.memory_allocatable:splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.container.requests_memory, rollup: avg), o2=sum(dt.kubernetes.node.memory_allocatable, rollup: avg)}, by: {dt.kubernetes.node.system_uuid,k8s.node.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения подов ноды
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.node.pods:filter(and(eq(pod_phase,Running))):splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum/builtin:kubernetes.node.pods_allocatable:splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum*100.0 |
| DQL | timeseries o1=sum(dt.kubernetes.pods, rollup: avg), nonempty:true, filter: {((pod_phase=="Running"))}, by: {dt.kubernetes.node.system_uuid,k8s.node.name}| join [timeseries operand=sum(dt.kubernetes.node.pods_allocatable, rollup: avg), nonempty:true, by: {dt.kubernetes.node.system_uuid,k8s.node.name}], on: {interval}, fields: {o2=operand}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение проблем готовности ноды
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.node.conditions:filter(and(eq(node_condition,Ready),ne(condition_status,True))):splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum |
| DQL | timeseries {sum(dt.kubernetes.node.conditions, rollup: avg)}, filter: {((node_condition=="Ready")AND(condition_status!=true))}, by: {dt.kubernetes.node.system_uuid,k8s.node.name}
|
Обнаружение проблемных состояний ноды
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.node.conditions:filter(and(or(eq(node_condition,ContainerRuntimeProblem),eq(node_condition,ContainerRuntimeUnhealthy),eq(node_condition,CorruptDockerOverlay2),eq(node_condition,DiskPressure),eq(node_condition,FilesystemCorruptionProblem),eq(node_condition,FrequentContainerdRestart),eq(node_condition,FrequentDockerRestart),eq(node_condition,FrequentGcfsSnapshotterRestart),eq(node_condition,FrequentGcfsdRestart),eq(node_condition,FrequentKubeletRestart),eq(node_condition,FrequentUnregisterNetDevice),eq(node_condition,GcfsSnapshotterMissingLayer),eq(node_condition,GcfsSnapshotterUnhealthy),eq(node_condition,GcfsdUnhealthy),eq(node_condition,KernelDeadlock),eq(node_condition,KubeletProblem),eq(node_condition,KubeletUnhealthy),eq(node_condition,MemoryPressure),eq(node_condition,NetworkUnavailable),eq(node_condition,OutOfDisk),eq(node_condition,PIDPressure),eq(node_condition,ReadonlyFilesystem)),eq(condition_status,True))):splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum |
| DQL | timeseries {sum(dt.kubernetes.node.conditions, rollup: avg)}, filter: {(((node_condition=="ContainerRuntimeProblem")OR(node_condition=="ContainerRuntimeUnhealthy")OR(node_condition=="CorruptDockerOverlay2")OR(node_condition=="DiskPressure")OR(node_condition=="FilesystemCorruptionProblem")OR(node_condition=="FrequentContainerdRestart")OR(node_condition=="FrequentDockerRestart")OR(node_condition=="FrequentGcfsSnapshotterRestart")OR(node_condition=="FrequentGcfsdRestart")OR(node_condition=="FrequentKubeletRestart")OR(node_condition=="FrequentUnregisterNetDevice")OR(node_condition=="GcfsSnapshotterMissingLayer")OR(node_condition=="GcfsSnapshotterUnhealthy")OR(node_condition=="GcfsdUnhealthy")OR(node_condition=="KernelDeadlock")OR(node_condition=="KubeletProblem")OR(node_condition=="KubeletUnhealthy")OR(node_condition=="MemoryPressure")OR(node_condition=="NetworkUnavailable")OR(node_condition=="OutOfDisk")OR(node_condition=="PIDPressure")OR(node_condition=="ReadonlyFilesystem"))AND(condition_status==true))}, by: {dt.kubernetes.node.system_uuid,k8s.node.name}
|
Пространство имён
| Оповещение | Тип проблемы | Включено (рекомендуется) | Порог обнаружения (рекомендуется) | Серьёзность | Снятие оповещения через | Расчёт |
|---|---|---|---|---|---|---|
| Обнаружение насыщения квоты запросов CPU пространства имён | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма использованного CPU квоты ресурсов / Сумма запросов CPU квоты ресурсов |
| Обнаружение насыщения квоты лимитов CPU пространства имён | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма использованного CPU квоты ресурсов / Сумма лимитов CPU квоты ресурсов |
| Обнаружение насыщения квоты запросов памяти пространства имён | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма использованной памяти квоты ресурсов / Сумма запросов памяти квоты ресурсов |
| Обнаружение насыщения квоты лимитов памяти пространства имён | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма использованной памяти квоты ресурсов / Сумма лимитов памяти квоты ресурсов |
| Обнаружение насыщения квоты подов пространства имён | Ресурс | Нет | > 90 % / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма использованных подов квоты ресурсов / Сумма лимитов подов квоты ресурсов |
Метрики и выражения DQL для пространства имён
Обнаружение насыщения квоты лимитов CPU пространства имён
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.resourcequota.limits_cpu_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.limits_cpu:splitBy(k8s.namespace.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.resourcequota.limits_cpu_used, rollup: avg), o2=sum(dt.kubernetes.resourcequota.limits_cpu, rollup: avg)}, by: {k8s.namespace.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения квоты запросов CPU пространства имён
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.resourcequota.requests_cpu_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.requests_cpu:splitBy(k8s.namespace.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.resourcequota.requests_cpu_used, rollup: avg), o2=sum(dt.kubernetes.resourcequota.requests_cpu, rollup: avg)}, by: {k8s.namespace.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения квоты лимитов памяти пространства имён
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.resourcequota.limits_memory_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.limits_memory:splitBy(k8s.namespace.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.resourcequota.limits_memory_used, rollup: avg), o2=sum(dt.kubernetes.resourcequota.limits_memory, rollup: avg)}, by: {k8s.namespace.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения квоты запросов памяти пространства имён
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.resourcequota.requests_memory_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.requests_memory:splitBy(k8s.namespace.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.resourcequota.requests_memory_used, rollup: avg), o2=sum(dt.kubernetes.resourcequota.requests_memory, rollup: avg)}, by: {k8s.namespace.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения квоты подов пространства имён
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.resourcequota.pods_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.pods:splitBy(k8s.namespace.name):sum*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.resourcequota.pods_used, rollup: avg), o2=sum(dt.kubernetes.resourcequota.pods, rollup: avg)}, by: {k8s.namespace.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Рабочая нагрузка
| Оповещение | Тип проблемы | Включено (рекомендуется) | Порог обнаружения (рекомендуется) | Серьёзность | Снятие оповещения через | Расчёт |
|---|---|---|---|---|---|---|
| Обнаружение перезапусков контейнеров | Ошибка | Да ¹ | ≥ 1 перезапуск за 3 мин; в течение 5 мин | Предупреждающий сигнал ¹ ² | 15 минут | Метрика перезапусков контейнеров |
| Обнаружение застрявших развёртываний | Ошибка | Да ¹ | Прогресс остановлен ≥ 3 мин; в течение 5 мин | Оповещение о здоровье ¹ | 10 минут | Метрика состояния рабочей нагрузки с фильтром 'not progressing' |
| Обнаружение подов, застрявших в состоянии Pending | Ресурс | Да ¹ | ≥ 1 под застрял ≥ 10 мин; в течение 15 мин | Предупреждающий сигнал ¹ ² | 10 минут | Метрика подов с фильтром по фазе 'Pending' |
| Обнаружение подов, застрявших в состоянии Terminating | Ресурс | Да ¹ | Завершение остановлено ≥ 10 мин; в течение 15 мин | Предупреждающий сигнал ¹ ² | 10 минут | Метрика подов с фильтром по статусу 'Terminating' |
| Обнаружение рабочих нагрузок без готовых подов | Ошибка | Да ¹ | Нет готовых подов ≥ 10 мин; в течение 15 мин | Оповещение о здоровье ¹ | 10 минут | Сумма неfailed подов − Сумма неfailed, неготовых подов |
| Обнаружение рабочих нагрузок с неготовыми подами | Ошибка | Нет | > 30 % неготовых; в течение 60 мин | Предупреждающий сигнал ² | 10 минут | Сумма неfailed подов − Сумма неfailed, готовых подов |
| Обнаружение насыщения использования памяти | Ресурс | Нет | > 90 % / ≥ 10 мин; в течение 15 мин | Предупреждающий сигнал ² | 10 минут | Сумма рабочего набора памяти рабочей нагрузки / Сумма лимитов памяти рабочей нагрузки |
| Обнаружение насыщения использования CPU | Ресурс | Нет | > 90 % / ≥ 10 мин; в течение 15 мин | Предупреждающий сигнал ² | 10 минут | Сумма рабочего набора памяти рабочей нагрузки / Сумма лимитов памяти рабочей нагрузки |
| Обнаружение высокого троттлинга CPU | Ресурс | Нет | > 100 % троттлинга / ≥ 20 мин; в течение 30 мин | Предупреждающий сигнал ² | 10 минут | Сумма троттлинга CPU рабочей нагрузки / Сумма лимитов CPU рабочей нагрузки |
| Обнаружение убийств из-за нехватки памяти | Ошибка | Да ¹ | На основе событий | Предупреждающий сигнал ¹ ² | 15 минут | Метрика убийств из-за нехватки памяти |
| Обнаружение событий сбоя задания | Ошибка | Да ¹ | На основе событий | Предупреждающий сигнал ¹ ² | 60 минут | Метрика событий с фильтром по причине и типу рабочей нагрузки |
| Обнаружение событий отката подов | Ошибка | Да ¹ | На основе событий | Оповещение о здоровье ¹ | 15 минут | Метрика событий с фильтром по причине |
| Обнаружение событий вытеснения подов | Ошибка | Да ¹ | На основе событий | Оповещение о здоровье ¹ | 60 минут | Метрика событий с фильтром по причине |
| Обнаружение событий вытеснения приоритетов подов | Ошибка | Да ¹ | На основе событий | Предупреждающий сигнал ¹ ² | 60 минут | Метрика событий с фильтром по причине |
Обнаружение событий сбоя задания срабатывает на события с причиной BackoffLimitExceeded, DeadlineExceeded или PodFailurePolicy, только для Jobs и CronJobs.
Обнаружение событий отката подов срабатывает на события с причиной BackOff — проверяйте поды со статусом ImagePullBackOff или CrashLoopBackOff.
Обнаружение событий вытеснения подов срабатывает на события с причиной Evicted.
Обнаружение событий вытеснения приоритетов подов срабатывает на события с причиной Preempted или Preempting.
Обнаружение рабочих нагрузок с неготовыми подами и Обнаружение рабочих нагрузок без готовых подов исключают поды, принадлежащие Jobs и CronJobs.
Метрики и выражения DQL для рабочей нагрузки
Обнаружение насыщения использования CPU
| Тип | Выражение |
|---|---|
| Выражение метрики | (builtin:kubernetes.workload.cpu_usage:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum/builtin:kubernetes.workload.limits_cpu:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum):default(0.0)*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.container.cpu_usage, rollup: avg), o2=sum(dt.kubernetes.container.limits_cpu, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}| fieldsAdd result=if(isNull(o1[]/o2[]), 0.0, else: o1[]/o2[])* 100.0| fieldsRemove {o1,o2}
|
Обнаружение перезапусков контейнеров
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.container.restarts:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries {sum(dt.kubernetes.container.restarts, default:0.0, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение высокого троттлинга CPU
| Тип | Выражение |
|---|---|
| Выражение метрики | (builtin:kubernetes.workload.cpu_throttled:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum/builtin:kubernetes.workload.limits_cpu:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum):default(0.0)*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.container.cpu_throttled, rollup: avg), o2=sum(dt.kubernetes.container.limits_cpu, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}| fieldsAdd result=if(isNull(o1[]/o2[]), 0.0, else: o1[]/o2[])* 100.0| fieldsRemove {o1,o2}
|
Обнаружение событий сбоя задания
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.events:filter(and(or(eq(k8s.event.reason,BackoffLimitExceeded),eq(k8s.event.reason,DeadlineExceeded),eq(k8s.event.reason,PodFailurePolicy)),or(eq(k8s.workload.kind,job),eq(k8s.workload.kind,cronjob)))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries {sum(dt.kubernetes.events, default:0.0, rollup: avg)}, filter: {(((k8s.event.reason=="BackoffLimitExceeded")OR(k8s.event.reason=="DeadlineExceeded")OR(k8s.event.reason=="PodFailurePolicy"))AND((k8s.workload.kind=="job")OR(k8s.workload.kind=="cronjob")))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение насыщения использования памяти
| Тип | Выражение |
|---|---|
| Выражение метрики | (builtin:kubernetes.workload.memory_working_set:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum/builtin:kubernetes.workload.limits_memory:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum):default(0.0)*100.0 |
| DQL | timeseries {o1=sum(dt.kubernetes.container.memory_working_set, rollup: avg), o2=sum(dt.kubernetes.container.limits_memory, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}| fieldsAdd result=if(isNull(o1[]/o2[]), 0.0, else: o1[]/o2[])* 100.0| fieldsRemove {o1,o2}
|
Обнаружение убийств из-за нехватки памяти
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.container.oom_kills:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries {sum(dt.kubernetes.container.oom_kills, default:0.0, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение событий отката подов
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.events:filter(and(eq(k8s.event.reason,BackOff))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries {sum(dt.kubernetes.events, default:0.0, rollup: avg)}, filter: {((k8s.event.reason=="BackOff"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение событий вытеснения подов
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.events:filter(and(eq(k8s.event.reason,Evicted))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries {sum(dt.kubernetes.events, default:0.0, rollup: avg)}, filter: {((k8s.event.reason=="Evicted"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение событий вытеснения приоритетов подов
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.events:filter(or(eq(k8s.event.reason,Preempted),eq(k8s.event.reason,Preempting))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries {sum(dt.kubernetes.events, default:0.0, rollup: avg)}, filter: {((k8s.event.reason=="Preempted")OR(k8s.event.reason=="Preempting"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение подов, застрявших в состоянии Pending
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.pods:filter(and(eq(pod_phase,Pending))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum |
| DQL | timeseries {sum(dt.kubernetes.pods, rollup: avg)}, filter: {((pod_phase=="Pending"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение подов, застрявших в состоянии Terminating
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.pods:filter(and(eq(pod_status,Terminating))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum |
| DQL | timeseries {sum(dt.kubernetes.pods, rollup: avg)}, filter: {((pod_status=="Terminating"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение застрявших развёртываний
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.workload.conditions:filter(and(eq(workload_condition,Progressing),eq(condition_status,False))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum |
| DQL | timeseries {sum(dt.kubernetes.workload.conditions, rollup: avg)}, filter: {((workload_condition=="Progressing")AND(condition_status==false))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}
|
Обнаружение рабочих нагрузок с неготовыми подами
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.pods:filter(and(ne(pod_phase,Failed),ne(pod_phase,Succeeded),ne(k8s.workload.kind,job),ne(k8s.workload.kind,cronjob),ne(pod_status,Terminating))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum-builtin:kubernetes.pods:filter(and(ne(pod_phase,Failed),ne(pod_phase,Succeeded),ne(k8s.workload.kind,job),ne(k8s.workload.kind,cronjob),eq(pod_condition,Ready),ne(pod_status,Terminating))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries o1=sum(dt.kubernetes.pods, rollup: avg), filter: {((pod_phase!="Failed")AND(pod_phase!="Succeeded")AND(k8s.workload.kind!="job")AND(k8s.workload.kind!="cronjob")AND(pod_status!="Terminating"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}| join [timeseries operand=sum(dt.kubernetes.pods, default:0.0, rollup: avg), nonempty:true, filter: {((pod_phase!="Failed")AND(pod_phase!="Succeeded")AND(k8s.workload.kind!="job")AND(k8s.workload.kind!="cronjob")AND(pod_condition=="Ready")AND(pod_status!="Terminating"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}], on: {interval}, fields: {o2=operand}| fieldsAdd result=o1[]-o2[]| fieldsRemove {o1,o2}
|
Обнаружение рабочих нагрузок без готовых подов
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.pods:filter(and(ne(pod_phase,Failed),ne(pod_phase,Succeeded),ne(k8s.workload.kind,job),ne(k8s.workload.kind,cronjob))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum-builtin:kubernetes.pods:filter(and(ne(pod_phase,Failed),ne(pod_phase,Succeeded),ne(k8s.workload.kind,job),ne(k8s.workload.kind,cronjob),ne(pod_condition,Ready))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0) |
| DQL | timeseries o1=sum(dt.kubernetes.pods, rollup: avg), filter: {((pod_phase!="Failed")AND(pod_phase!="Succeeded")AND(k8s.workload.kind!="job")AND(k8s.workload.kind!="cronjob"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}| join [timeseries operand=sum(dt.kubernetes.pods, default:0.0, rollup: avg), nonempty:true, filter: {((pod_phase!="Failed")AND(pod_phase!="Succeeded")AND(k8s.workload.kind!="job")AND(k8s.workload.kind!="cronjob")AND(pod_condition!="Ready"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}], on: {interval}, fields: {o2=operand}| fieldsAdd result=o1[]-o2[]| fieldsRemove {o1,o2}
|
Запросы на постоянные тома
| Оповещение | Тип проблемы | Включено (рекомендуется) | Порог обнаружения (рекомендуется) | Серьёзность | Снятие оповещения через | Расчёт |
|---|---|---|---|---|---|---|
| Обнаружение низкого дискового пространства (MiB) | Ресурс | Нет | ≤ 100 MiB осталось / ≥ 3 мин; в течение 5 мин | Предупреждающий сигнал ² | 10 минут | Метрика доступных байт статистики тома Kubelet |
| Обнаружение низкого дискового пространства (%) | Ресурс | Да ¹ | < 3 % доступно / ≥ 3 мин; в течение 5 мин | Предупреждающий сигнал ¹ ² | 10 минут | Доступные байты статистики тома / Ёмкость статистики тома |
Метрики и выражения DQL для запросов на постоянные тома
Обнаружение низкого дискового пространства (%)
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.persistentvolumeclaim.available:splitBy(k8s.namespace.name,k8s.persistent_volume_claim.name):avg/builtin:kubernetes.persistentvolumeclaim.capacity:splitBy(k8s.namespace.name,k8s.persistent_volume_claim.name):avg*100.0 |
| DQL | timeseries {o1=avg(dt.kubernetes.persistentvolumeclaim.available), o2=avg(dt.kubernetes.persistentvolumeclaim.capacity)}, by: {k8s.namespace.name,k8s.persistent_volume_claim.name}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение низкого дискового пространства (MiB)
| Тип | Выражение |
|---|---|
| Выражение метрики | builtin:kubernetes.persistentvolumeclaim.available:splitBy(k8s.namespace.name,k8s.persistent_volume_claim.name):avg |
| DQL | timeseries {avg(dt.kubernetes.persistentvolumeclaim.available)}, by: {k8s.namespace.name,k8s.persistent_volume_claim.name}
|