Предупреждение об общих проблемах Kubernetes / OpenShift
Предупреждение об общих проблемах Kubernetes / OpenShift
Версия Ключ-АСТРОМ 1.254+ Версия АктивногоШлюза 1.253+
Чтобы настроить предупреждения об общих проблемах платформы Kubernetes, следуйте инструкциям ниже.
Настройка
Существует три способа настройки предупреждений об общих проблемах Kubernetes/OpenShift. Настройка предупреждения на другом уровне предназначена только для упрощения конфигурации сразу нескольких сущностей. Это не меняет поведение предупреждения. Например, включение предупреждения о насыщении CPU рабочей нагрузки по-прежнему будет оценивать и создавать проблемы для каждой рабочей нагрузки Kubernetes отдельно, даже если оно настроено на уровне кластера Kubernetes. Подробнее об иерархии настроек см. в документации по настройкам.
- Настройки уровня тенанта: применяются ко всем кластерам, нодам, пространствам имён или рабочим нагрузкам в тенанте Kubernetes/OpenShift.
- Чтобы настроить, перейдите в Настройки > Обнаружение аномалий и выберите любую страницу в разделе Kubernetes.
- Настройки уровня кластера: применяются к выбранному кластеру или к нодам, пространствам имён и рабочим нагрузкам выбранного кластера.
- Чтобы настроить, перейдите в настройки выбранного кластера Kubernetes и выберите любую страницу в разделе Обнаружение аномалий.
- Настройки уровня пространства имён: применяются к выбранным пространствам имён или рабочим нагрузкам.
- Чтобы настроить, перейдите в настройки выбранного пространства имён и выберите любую страницу в разделе Обнаружение аномалий.
Просмотр предупреждений
Проблемы, закрытые вручную, появятся снова через 60 дней, если их первопричина остаётся нерешённой.
Просматривать предупреждения можно:
- На странице Проблемы.
- В разделе События страницы сведений о кластере.
Выберите событие, чтобы перейти в Визуализацию данных и получить больше информации о метрике, вызвавшей событие.
Доступные предупреждения
Ниже приведён список доступных предупреждений. Следующие предупреждения не переклассифицируются как сигналы предупреждений при включении обновлённой классификации.
- Обнаружение проблем готовности кластера
- Обнаружение зависших развёртываний
- Обнаружение рабочих нагрузок без готовых подов
- Обнаружение событий backoff подов
Предупреждения кластера
| Название предупреждения | Версия Ключ-АСТРОМ | Тип проблемы | Заголовок проблемы | Описание проблемы | Деактивация после | Расчёт | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Насыщение CPU-запросов на кластере | 1.254 | Ресурс | Насыщение CPU-запросов на кластере превышает указанный порог. | Насыщение CPU-запросов на кластере превышает указанный порог. | 10 минут | Запросы CPU нод / Выделяемый CPU нод | Kubernetes Classic, приложение Kubernetes |
| Насыщение запросов памяти на кластере | 1.254 | Ресурс | Насыщение запросов памяти на кластере превышает указанный порог. | Насыщение запросов памяти на кластере превышает указанный порог. | 10 минут | Запросы памяти нод / Выделяемая память нод | Kubernetes Classic, приложение Kubernetes |
| Насыщение подов на кластере | 1.258 | Ресурс | Насыщение подов кластера превышает указанный порог. | Насыщение подов кластера превышает указанный порог. | 10 минут | Сумма готовых подов / Сумма выделяемых подов | Kubernetes Classic, приложение Kubernetes |
| Кластер не готов | 1.254 | Доступность | Конечная точка readyz указывает, что этот кластер не готов. | Конечная точка readyz указывает, что этот кластер не готов. | 10 минут | Метрика readyz кластера | Kubernetes Classic, приложение Kubernetes |
| Мониторинг недоступен | 1.258 | Доступность | Мониторинг API Ключ-АСТРОМ недоступен. | Мониторинг API Ключ-АСТРОМ недоступен. | 10 минут | — | Kubernetes Classic, приложение Kubernetes |
Метрики кластера и выражения DQL
Обнаружение насыщения CPU-запросов на кластере
| Тип | Выражение |
|---|---|
| Метрика | builtin:kubernetes.node.requests_cpu:splitBy():sum/builtin:kubernetes.node.cpu_allocatable:splitBy():sum*100.0
|
| DQL | timeseries {o1=sum(dt.kubernetes.container.requests_cpu, rollup: avg), o2=sum(dt.kubernetes.node.cpu_allocatable, rollup: avg)}, by: {}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения запросов памяти на кластере
| Тип | Выражение |
|---|---|
| Метрика | builtin:kubernetes.node.requests_memory:splitBy():sum/builtin:kubernetes.node.memory_allocatable:splitBy():sum*100.0
|
| DQL | timeseries {o1=sum(dt.kubernetes.container.requests_memory, rollup: avg), o2=sum(dt.kubernetes.node.memory_allocatable, rollup: avg)}, by: {}| fieldsAdd result=o1[]/o2[]* 100.0| fieldsRemove {o1,o2}
|
Обнаружение насыщения подов на кластере
| Тип | Выражение |
|---|---|
| Метрика | (builtin:kubernetes.node.pods:filter(and(eq(pod_condition,Ready))):splitBy():sum/builtin:kubernetes.node.pods_allocatable:splitBy():sum):default(0.0)*100.0
|
| DQL | timeseries o1=sum(dt.kubernetes.pods, rollup: avg), nonempty:true, filter: {((pod_condition=="Ready"))}, by: {}| join [timeseries operand=sum(dt.kubernetes.node.pods_allocatable, rollup: avg), nonempty:true, by: {}], on: {interval}, fields: {o2=operand}| fieldsAdd result=if(isNull(o1[]/o2[]), 0.0, else: o1[]/o2[])* 100.0| fieldsRemove {o1,o2}
|
Обнаружение проблем готовности кластера
| Тип | Выражение |
|---|---|
| Метрика | builtin:kubernetes.cluster.readyz:splitBy():sum
|
| DQL | timeseries {sum(dt.kubernetes.cluster.readyz, rollup: avg)}, by: {}
|
Обнаружение недоступности мониторинга
| Тип | Выражение |
|---|---|
| Метрика | (нет выражения метрики) |
| DQL | (нет DQL) |
Предупреждения по умолчанию для новых тенантов
| Предупреждение | Настройка | Значение |
|---|---|---|
| Проблемы готовности | период выборки в минутах | 3 |
| Проблемы готовности | период наблюдения в минутах | 5 |
| Проблемы мониторинга | период выборки в минутах | 15 |
| Проблемы мониторинга | период наблюдения в минутах | 30 |
Предупреждения нод
| Название предупреждения | Версия Ключ-АСТРОМ | Тип проблемы | Заголовок проблемы | Описание проблемы | Деактивация после | Расчёт | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Насыщение CPU-запросов на ноде | 1.254 | Ресурс | Насыщение CPU-запросов на ноде превышает указанный порог. | Насыщение CPU-запросов на ноде превышает указанный порог. | 10 минут | Сумма CPU-запросов ноды / Сумма выделяемого CPU ноды | Kubernetes Classic, приложение Kubernetes |
| Насыщение запросов памяти на ноде | 1.254 | Ресурс | Насыщение запросов памяти на ноде превышает указанный порог. | Насыщение запросов памяти на ноде превышает указанный порог. | 10 минут | Сумма запросов памяти ноды / Сумма выделяемой памяти ноды | Kubernetes Classic, приложение Kubernetes |
| Насыщение подов на ноде | 1.254 | Ресурс | Насыщение подов на ноде превышает указанный порог. | Насыщение подов на ноде превышает указанный порог. | 10 минут | Сумма запущенных подов на ноде / Лимит подов ноды | Kubernetes Classic, приложение Kubernetes |
| Нода не готова | 1.254 | Доступность | Нода не готова. | Нода не готова. | 10 минут | Метрика состояния ноды, отфильтрованная по 'not ready' | Kubernetes Classic, приложение Kubernetes |
| Проблемное состояние ноды | 1.264 | Ошибка | Нода имеет одно или несколько проблемных состояний из следующих: ContainerRuntimeProblem, ContainerRuntimeUnhealthy, CorruptDockerOverlay2, DiskPressure, FilesystemCorruptionProblem, FrequentContainerdRestart, FrequentDockerRestart, FrequentGcfsSnapshotterRestart, FrequentGcfsdRestart, FrequentKubeletRestart, FrequentUnregisterNetDevice, GcfsSnapshotterMissingLayer, GcfsSnapshotterUnhealthy, GcfsdUnhealthy, KernelDeadlock, KubeletProblem, KubeletUnhealthy, MemoryPressure, NetworkUnavailable, OutOfDisk, PIDPressure, ReadonlyFilesystem | Нода имеет одно или несколько проблемных состояний. | 10 минут | Метрика состояния нод | Kubernetes Classic, приложение Kubernetes |
Метрики нод и выражения 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}
|
Предупреждения по умолчанию для новых тенантов
| Предупреждение | Настройка | Значение |
|---|---|---|
| Проблемы готовности | период выборки в минутах | 3 |
| Проблемы готовности | период наблюдения в минутах | 5 |
| Проблемное состояние ноды | период выборки в минутах | 3 |
| Проблемное состояние ноды | период наблюдения в минутах | 5 |
Предупреждения пространств имён
| Название предупреждения | Версия Ключ-АСТРОМ | Тип проблемы | Заголовок проблемы | Описание проблемы | Деактивация после | Расчёт | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Насыщение квоты CPU-лимитов | 1.254 | Ресурс | Насыщение квоты CPU-лимитов превышает указанный порог. | Насыщение квоты CPU-лимитов превышает указанный порог. | 10 минут | Сумма использованных CPU-лимитов квоты ресурсов / Сумма CPU-лимитов квоты ресурсов | Kubernetes Classic, приложение Kubernetes |
| Насыщение квоты CPU-запросов | 1.254 | Ресурс | Насыщение квоты CPU-запросов превышает указанный порог. | Насыщение квоты CPU-запросов превышает указанный порог. | 10 минут | Сумма использованных CPU-запросов квоты ресурсов / Сумма CPU-запросов квоты ресурсов | Kubernetes Classic, приложение Kubernetes |
| Насыщение квоты лимитов памяти | 1.254 | Ресурс | Насыщение квоты лимитов памяти превышает указанный порог. | Насыщение квоты лимитов памяти превышает указанный порог. | 10 минут | Сумма использованных лимитов памяти квоты ресурсов / Сумма лимитов памяти квоты ресурсов | Kubernetes Classic, приложение Kubernetes |
| Насыщение квоты запросов памяти | 1.254 | Ресурс | Насыщение квоты запросов памяти превышает указанный порог. | Насыщение квоты запросов памяти превышает указанный порог. | 10 минут | Сумма использованных запросов памяти квоты ресурсов / Сумма запросов памяти квоты ресурсов | Kubernetes Classic, приложение Kubernetes |
| Насыщение квоты подов | 1.254 | Ресурс | Насыщение квоты подов превышает указанный порог. | Насыщение квоты подов превышает указанный порог. | 10 минут | Сумма использованных подов квоты ресурсов / Сумма лимитов подов квоты ресурсов | Kubernetes Classic, приложение Kubernetes |
Метрики пространств имён и выражения 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}
|
Предупреждения о постоянных томах (PVC)
| Название предупреждения | Версия Ключ-АСТРОМ | Тип проблемы | Заголовок проблемы | Описание проблемы | Деактивация после | Расчёт | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Kubernetes PVC: низкий процент свободного места на диске | 1.262 | Ресурс | Доступное дисковое пространство для запроса на постоянный том ниже порога. | Доступное дисковое пространство для запроса на постоянный том ниже порога. | 10 минут | Доступные байты статистики тома / Ёмкость статистики тома | Kubernetes Classic, приложение Kubernetes |
| Kubernetes PVC: низкий объём свободного места на диске | 1.262 | Ресурс | Доступное дисковое пространство для запроса на постоянный том ниже порога. | Доступное дисковое пространство для запроса на постоянный том ниже порога. | 10 минут | Метрика доступных байтов статистики тома kubelet | Kubernetes Classic, приложение Kubernetes |
Метрики PVC и выражения 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}
|
Обнаружение низкого объёма свободного места на диске (МиБ)
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Предупреждения рабочих нагрузок
| Название предупреждения | Версия Ключ-АСТРОМ | Тип проблемы | Заголовок проблемы | Описание проблемы | Деактивация после | Расчёт | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Использование CPU близко к лимитам | 1.264 | Ресурс | Использование CPU превышает порог с точки зрения заданного лимита CPU. | Использование CPU превышает порог с точки зрения заданного лимита CPU. | 10 минут | Сумма использования CPU рабочей нагрузки / Сумма лимитов CPU рабочей нагрузки | Kubernetes Classic, приложение Kubernetes |
| Перезапуски контейнеров | 1.254 | Ошибка | Наблюдаемые перезапуски контейнеров превышают указанный порог. | Наблюдаемые перезапуски контейнеров превышают указанный порог. | 15 минут | Метрика перезапусков контейнеров | Kubernetes Classic, приложение Kubernetes |
| Высокое троттлингование CPU | 1.264 | Ресурс | Отношение троттлингования CPU к лимитам превышает указанный порог. | Отношение троттлингования CPU к лимитам превышает указанный порог. | 10 минут | Сумма троттлингования CPU рабочей нагрузки / Сумма лимитов CPU рабочей нагрузки | Kubernetes Classic, приложение Kubernetes |
| Событие сбоя задания | 1.268 | Ошибка | Обнаружены события с причинами 'BackoffLimitExceeded', 'DeadlineExceeded' или 'PodFailurePolicy'. | Обнаружены события с причинами 'BackoffLimitExceeded', 'DeadlineExceeded' или 'PodFailurePolicy'. | 60 минут | Метрика событий, отфильтрованная по причине и типу рабочей нагрузки | Kubernetes Classic, приложение Kubernetes |
| Использование памяти близко к лимитам | 1.264 | Ресурс | Использование памяти (рабочий набор памяти) превышает порог с точки зрения заданного лимита памяти. | Использование памяти (рабочий набор памяти) превышает порог с точки зрения заданного лимита памяти. | 10 минут | Сумма рабочего набора памяти рабочей нагрузки / Сумма лимитов памяти рабочей нагрузки | Kubernetes Classic, приложение Kubernetes |
| Убийства из-за нехватки памяти | 1.268 | Ошибка | Для подов этой рабочей нагрузки наблюдались убийства из-за нехватки памяти. | Для подов этой рабочей нагрузки наблюдались убийства из-за нехватки памяти. | 15 минут | Метрика убийств из-за нехватки памяти | Kubernetes Classic, приложение Kubernetes |
| Событие backoff | 1.268 | Ошибка | Для подов этой рабочей нагрузки обнаружены события с причиной 'BackOff'. Проверьте поды со статусом 'ImagePullBackOff' или 'CrashLoopBackOff'. | Для подов этой рабочей нагрузки обнаружены события с причиной 'BackOff'. Проверьте поды со статусом 'ImagePullBackOff' или 'CrashLoopBackOff'. | 15 минут | Метрика событий, отфильтрованная по причине | Kubernetes Classic, приложение Kubernetes |
| Событие вытеснения пода | 1.268 | Ошибка | Для подов этой рабочей нагрузки обнаружены события с причиной 'Evicted'. | Для подов этой рабочей нагрузки обнаружены события с причиной 'Evicted'. | 60 минут | Метрика событий, отфильтрованная по причине | Kubernetes Classic, приложение Kubernetes |
| Событие вытеснения | 1.268 | Ошибка | Для подов этой рабочей нагрузки обнаружены события с причинами 'Preempted' или 'Preempting'. | Для подов этой рабочей нагрузки обнаружены события с причинами 'Preempted' или 'Preempting'. | 60 минут | Метрика событий, отфильтрованная по причине | Kubernetes Classic, приложение Kubernetes |
| Поды застряли в состоянии ожидания | 1.254 | Ресурс | Рабочая нагрузка имеет поды в состоянии ожидания. | Рабочая нагрузка имеет поды в состоянии ожидания. | 10 минут | Метрика подов, отфильтрованная по фазе 'Pending' | Kubernetes Classic, приложение Kubernetes |
| Поды застряли в состоянии завершения | 1.260 | Ресурс | Рабочая нагрузка имеет поды, застрявшие в состоянии завершения. | Рабочая нагрузка имеет поды, застрявшие в состоянии завершения. | 10 минут | Метрика подов, отфильтрованная по статусу 'Terminating' | Kubernetes Classic, приложение Kubernetes |
| Развёртывание зависло | 1.260 | Ошибка | Развёртывание зависло и больше не продвигается. | Развёртывание зависло и больше не продвигается. | 10 минут | Метрика состояния рабочей нагрузки, отфильтрованная по 'not progressing' | Kubernetes Classic, приложение Kubernetes |
| Не все поды готовы | 1.258 | Ошибка | Рабочая нагрузка имеет поды, которые не готовы. | Рабочая нагрузка имеет поды, которые не готовы. | 10 минут | Сумма всех ожидающих или запущенных подов − Сумма готовых ожидающих или запущенных подов. Поды заданий и CronJob исключены. | Kubernetes Classic, приложение Kubernetes |
| Нет готовых подов | 1.254 | Ошибка | Рабочая нагрузка не имеет ни одного готового пода. | Рабочая нагрузка не имеет ни одного готового пода. | 10 минут | Сумма всех ожидающих или запущенных подов − Сумма неготовых ожидающих или запущенных подов. Поды заданий и CronJob исключены. | Kubernetes Classic, приложение Kubernetes |
Метрики рабочих нагрузок и выражения 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}
|
Обнаружение событий backoff подов
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Обнаружение событий вытеснения подов (preemption)
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Обнаружение подов, застрявших в состоянии ожидания
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Обнаружение подов, застрявших в состоянии завершения
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Обнаружение рабочих нагрузок с неготовыми подами
Следующее выражение возвращает количество ожидающих и запущенных подов в неготовом состоянии. Поды заданий и CronJobs исключены.
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Обнаружение рабочих нагрузок без готовых подов
Следующее выражение возвращает количество ожидающих и запущенных подов в готовом состоянии. Поды заданий и CronJobs исключены.
| Тип | Выражение |
|---|---|
| Метрика | 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}
|
Предупреждения по умолчанию для новых тенантов
| Предупреждение | Настройка | Значение |
|---|---|---|
| Перезапуски контейнеров | порог | 1 |
| Перезапуски контейнеров | период выборки в минутах | 3 |
| Перезапуски контейнеров | период наблюдения в минутах | 5 |
| Развёртывание зависло | период выборки в минутах | 3 |
| Развёртывание зависло | период наблюдения в минутах | 5 |
| Ожидающие поды | порог | 1 |
| Ожидающие поды | период выборки в минутах | 10 |
| Ожидающие поды | период наблюдения в минутах | 15 |
| Поды застряли в состоянии завершения | период выборки в минутах | 10 |
| Поды застряли в состоянии завершения | период наблюдения в минутах | 15 |
| Рабочая нагрузка без готовых подов | период выборки в минутах | 10 |
| Рабочая нагрузка без готовых подов | период наблюдения в минутах | 15 |
| Убийства из-за нехватки памяти | предупреждать всегда | — |
| События сбоя задания | предупреждать всегда | — |
| События backoff подов | предупреждать всегда | — |
| События вытеснения подов | предупреждать всегда | — |
| События вытеснения подов (preemption) | предупреждать всегда | — |