Уведомления о распространённых проблемах в Kubernetes/OpenShift
Ключ-АСТРОМ версии 1.254+
АктивныйШлюз версия 1.253+
Чтобы получать оповещения о распространенных проблемах платформы Kubernetes, следуйте приведенным ниже инструкциям.
Настройка
Существует три способа настройки оповещений о распространенных проблемах Kubernetes/OpenShift.
Настройка оповещения на другом уровне предназначена лишь для упрощения конфигурации нескольких объектов одновременно. Это не меняет поведения оповещения.
Например, включение оповещения ЦП рабочей нагрузкой по-прежнему будет оценивать и сообщать о проблемах для каждой рабочей нагрузки Kubernetes отдельно, даже если это настроено на уровне кластера Kubernetes.
Более подробную информацию об иерархии настроек см. в документации по настройкам.
На уровне каждого арендатора
- Настройки применяются ко всем кластерам, узлам, пространствам имен или рабочим нагрузкам в рамках арендатора Kubernetes/OpenShift.
- Для настройки параметров перейдите в раздел Настройки > Обнаружение аномалий и выберите любую страницу в разделе Kubernetes.
Пример:
На уровне кластера
- Настройки применяются к выбранному кластеру или к нодам, пространствам имен и рабочим нагрузкам из выбранного кластера.
- Для настройки параметров перейдите в раздел настроек выбранного кластера Kubernetes и выберите любую страницу в разделе Обнаружение аномалий.
Пример:
На уровне пространства имен
- Настройки применяются к выбранным пространствам имен или рабочим нагрузкам.
- Для настройки параметров перейдите в раздел настроек выбранного пространства имен и выберите любую страницу в разделе Обнаружение аномалий.
Пример:
Просмотреть оповещения
Проблемы, закрытые вручную, снова появятся через 60 дней, если их первопричина останется нерешенной.
Вы можете просмотреть оповещения.
- На странице Проблемы.
Пример задачи:
- В разделе События на странице с подробными сведениями о кластере.
Пример события:
- Выберите событие, чтобы перейти в визуализацию данных и получить дополнительную информацию о метрике, которая сгенерировала это событие.
Доступные оповещения
Ниже приведён список доступных оповещений.
Кластерные оповещения
| Название оповещения | Версия Ключ-АСТРОМ | Тип проблемы | Название проблемы | Описание проблемы | Отмена оповещений после | Расчет | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Обнаружение перегрузки кластера по запросам ЦП | 1.254 | Ресурс | Перегрузка кластера запросами ЦП | Перегрузка ЦП запросами превышает установленный порог. | 10 минут | Запросы на использование ЦП нода / Доступное для выделения ЦП нода | Kubernetes Classic, приложение Kubernetes |
| Обнаружение перегрузки кластера запросами памяти | 1.254 | Ресурс | Перегрузка кластера запросами памяти | Перегрузка памяти запросами превышает установленный порог. | 10 минут | Запросы на память от нода / Доступная память от нода | Kubernetes Classic, приложение Kubernetes |
| Обнаружение перегрузки кластера подами | 1.258 | Ресурс | Перегрузка подов в кластере | Перегрузка кластера подами превышает установленный порог. | 10 минут | Сумма готовых нодов / Сумма доступных для выделения нодов | Kubernetes Classic, приложение Kubernetes |
| Обнаружение проблем с готовностью кластера | 1.254 | Доступность | Кластер не готов | Конечная точка Readyz указывает, что данный кластер не готов. | 10 минут | Метрика готовности кластера | Kubernetes Classic, приложение Kubernetes |
| Обнаружение проблем мониторинга | 1.258 | Доступность | Мониторинг недоступен | Мониторинг через API Ключ-АСТРОМ недоступен. | 10 минут | Kubernetes Classic, приложение Kubernetes |
Метрика кластера и выражения DQL
Обнаружение перегрузки кластера по запросам ЦП
| Тип | Выражение |
|---|---|
| Метрическое выражение | 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: {}
|
Обнаружение проблем мониторинга
| Тип | Выражение |
|---|---|
| Метрическое выражение | (no metric expression)
|
| DQL | (no DQL)
|
Автоматические оповещения для новых арендаторов
| Алерт | Настройка | Значение |
|---|---|---|
| Проблемы готовности | период выборки в минутах | 3 |
| Проблемы готовности | период наблюдения в минутах | 5 |
| Проблемы мониторинга | период выборки в минутах | 15 |
| Проблемы мониторинга | период наблюдения в минутах | 30 |
Оповещения о пространствах имен
| Название оповещения | Версия Ключ-АСТРОМ | Тип проблемы | Название проблемы | Описание проблемы | Отмена оповещений после | Расчет | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Обнаружение перегрузки квоты ЦП пространства имен | 1.254 | Ресурс | Перегрузка квоты ЦП | Перегрузка квоты ЦП превышает установленный порог. | 10 минут | Сумма квот ресурсов ЦП, использованных / Сумма лимитов квот ресурсов ЦП | Kubernetes Classic, приложение Kubernetes |
| Обнаружение насыщения квоты запросов ЦП в пространстве имен | 1.254 | Ресурс | Перегрузка квоты запросов ЦП | Перегрузка квоты запросов к ЦП превышает установленный порог. | 10 минут | Сумма использованных ресурсов ЦП / Сумма запросов ресурсов ЦП | Kubernetes Classic, приложение Kubernetes |
| Обнаружение переполнения квоты памяти пространства имен | 1.254 | Ресурс | Перегрузка квоты ограничения памяти | Перегрузка квоты памяти превышает установленный порог. | 10 минут | Сумма использованной памяти из квоты ресурсов / Сумма лимитов памяти из квоты ресурсов | Kubernetes Classic, приложение Kubernetes |
| Обнаружение насыщения квоты на использование памяти пространства имен | 1.254 | Ресурс | Перегрузка квоты запросов памяти | Перегрузка квоты запросов памяти превышает установленный порог. | 10 минут | Сумма использованной квоты памяти ресурсов / Сумма запросов на использование квоты памяти ресурсов | Kubernetes Classic, приложение Kubernetes |
| Обнаружение переполнения квот подов пространства имен | 1.254 | Ресурс | Перегрузка квоты подов | Перегрузка квот в подах превышает установленный порог. | 10 минут | Сумма использованных квот ресурсов / Сумма лимита квот ресурсов | Kubernetes Classic, приложение Kubernetes |
Метрики пространств имен и выражения DQL
Обнаружение перегрузки квоты ЦП пространства имен
| Тип | Выражение |
|---|---|
| Метрическое выражение | 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}
|
Обнаружение перегрузки квоты запросов ЦП в пространстве имен
| Тип | Выражение |
|---|---|
| Метрическое выражение | 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.254 | Ресурс | Перегрузка процессорного трафика на нодах | Перегрузка ЦП запросами превышает установленный порог. | 10 минут | Сумма запросов ЦП нода / Сумма доступных ресурсов ЦП нода | Kubernetes Classic, приложение Kubernetes |
| Обнаружение перегрузки памяти, запрашиваемой нодами | 1.254 | Ресурс | Перегрузка памяти запросами на нодах | Перегрузка памяти запросами превышает установленный порог. | 10 минут | Сумма запросов памяти нода / Сумма доступной памяти нода | Kubernetes Classic, приложение Kubernetes |
| Обнаружение перегрузки нодов подами | 1.254 | Ресурс | Перегрузка подов на нодах | Перегрузка капсул превышает установленный порог. | 10 минут | Сумма запущенных подов на нода / Лимит подов на нода | Kubernetes Classic, приложение Kubernetes |
| Обнаружение проблем с готовностью нода | 1.254 | Доступность | Нод не готов | Нод не готов. | 10 минут | Метрика состояния нода отфильтрована по критерию «не готов». | Kubernetes Classic, приложение Kubernetes |
| Обнаружение проблемных состояний нодов | 1.264 | Ошибка | Проблемное состояние нода | Нод имеет одно или несколько проблемных состояний из следующих ContainerRuntimeProblem:Container RuntimeUnhea lthy Corrupt Docker Overlay2 Disk Pressure Filesystem Corruption Problem Frequent Containerd Restart Frequent Docker Restart Frequent Gcfs Snapshotter Restart Frequent Gcfsd Restart Frequent Kubelet Restart Frequent Unregister NetDevice GcfsSnapshotter Missing Layer Gcfs Snapshotter Unhealthy Gcfsd Unhealthy Kernel Deadlock Kubelet Problem Kubelet Unhealthy Memory Pressure Network Unavailable Out OfDisk PID Pressure Readonly Filesystem
|
10 минут | Метрика состояния нода | Kubernetes Classic, приложение Kubernetes |
Метрики нода и выражения DQL
Обнаружение перегрузки ЦП нода
| Тип | Выражение |
|---|---|
| Метрическое выражение | 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 |
Постоянно поступающие оповещения о большом объеме заявок
| Название оповещения | Версия Ключ-АСТРОМ | Тип проблемы | Название проблемы | Описание проблемы | Отмена оповещений после | Расчет | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Обнаружено нехватка места на диске (%) | 1.262 | Ресурс | Kubernetes PVC: Низкий процент свободного места на диске | Доступное дисковое пространство для запроса постоянного тома находится ниже порогового значения. | 10 минут | Доступные данные статистики по объему (в байтах) / Объем данных статистики по объему (в байтах) | Kubernetes Classic, приложение Kubernetes |
| Обнаружение недостатка места на диске (МиБ) | 1.262 | Ресурс | Kubernetes PVC: Недостаток дискового пространства | Доступное дисковое пространство для запроса постоянного тома находится ниже порогового значения. | 10 минут | Статистика объема Kubelet, доступные байты, метрика | Kubernetes Classic, приложение Kubernetes |
Показатель постоянного объема претензий и выражения 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}
|
Оповещения о рабочей нагрузке
| Название оповещения | Версия Ключ-АСТРОМ | Тип проблемы | Название проблемы | Описание проблемы | Отмена оповещений после | Расчет | Поддерживается в |
|---|---|---|---|---|---|---|---|
| Обнаружение предела ЦП | 1.264 | Ресурс | Загрузка ЦП близка к пределу | Использование ЦП превышает пороговое значение, установленное в рамках лимита использования ЦП. | 10 минут | Сумма использования ЦП рабочей нагрузкой / Сумма лимитов ЦП рабочей нагрузкой | Kubernetes Classic, приложение Kubernetes |
| Обнаружение перезапусков контейнеров | 1.254 | Ошибка | Контейнер перезапускается | Количество перезапусков контейнеров, зафиксированных в ходе наблюдений, превышает установленный порог. | 15 минут | Метрика перезапуска контейнера | Kubernetes Classic, приложение Kubernetes |
| Обнаружение высокого уровня троттлинга ЦП | 1.264 | Ресурс | Высокое снижение производительности процессора | Соотношение снижения производительности процессора к установленным пределам превышает заданный порог. | 10 минут | Сумма ограничений ЦП рабочей нагрузки / Сумма ограничений ЦП рабочей нагрузки | Kubernetes Classic, приложение Kubernetes |
| Обнаружение событий, приводящих к сбоям в работе. | 1.268 | Ошибка | Событие, приведшее к сбою в работе | Обнаружены события с причинами 'BackoffLimitExceeded', 'DeadlineExceeded' или 'PodFailurePolicy'. | 60 минут | Метрика события, отфильтрованная по причине и типу рабочей нагрузки. | Kubernetes Classic, приложение Kubernetes |
| Обнаружение предела использования памяти | 1.264 | Ресурс | Использование памяти близко к пределу. | Объем используемой памяти (память рабочего набора) превышает пороговое значение, установленное в рамках лимита памяти. | 10 минут | Сумма объема памяти, используемой рабочей нагрузкой / Сумма лимитов памяти, используемых рабочей нагрузкой | Kubernetes Classic, приложение Kubernetes |
| Обнаружение случаев ошибок из-за нехватки памяти | 1.268 | Ошибка | Ошибки, произошедшие из-за отсутствия памяти | Для групп с такой рабочей нагрузкой наблюдались случаи гибели из-за нехватки памяти. | 15 минут | Показатель "нехватка памяти приводит к ошибкам" | Kubernetes Classic, приложение Kubernetes |
| Обнаружение событий отката пода | 1.268 | Ошибка | Откат | Для модулей этой рабочей нагрузки обнаружены события с причиной 'BackOff'. Проверьте наличие модулей со статусом 'ImagePullBackOff' или 'CrashLoopBackOff'. | 15 минут | Метрика события, отфильтрованная по причине | Kubernetes Classic, приложение Kubernetes |
| Обнаружение событий прерывания подов | 1.268 | Ошибка | Событие прерывания подов | Для модулей с данной рабочей нагрузкой были обнаружены события с причиной «прерывания». | 60 минут | Метрика события, отфильтрованная по причине | Kubernetes Classic, приложение Kubernetes |
| Обнаружение событий прерывания подов | 1.268 | Ошибка | Событие прерывания | Для модулей с данной рабочей нагрузкой были обнаружены события с причинами «Прервано» или «Прерывание». | 60 минут | Метрика события, отфильтрованная по причине | Kubernetes Classic, приложение Kubernetes |
| Обнаружение модулей, зависших в состоянии ожидания | 1.254 | Ресурс | Поды застряли в состоянии ожидания | В рабочей нагрузке имеются ожидающие завершения поды. | 10 минут | Метрика Pods отфильтрована по фазе 'Pending'. | Kubernetes Classic, приложение Kubernetes |
| Обнаружение подов, зависших в состоянии завершения | 1.260 | Ресурс | Поды застряли в состоянии завершения | В процессе выполнения задачи модули зависли в состоянии "завершение". | 10 минут | Метрика Pods отфильтрована по статусу «Завершение». | Kubernetes Classic, приложение Kubernetes |
| Обнаружение зависших развертываний | 1.260 | Ошибка | Развертывание зависло | Процесс развертывания завис и поэтому больше не продвигается. | 10 минут | Показатель состояния рабочей нагрузки отфильтрован по критерию «не выполняется». | Kubernetes Classic, приложение Kubernetes |
| Обнаружение рабочих нагрузок с неготовыми подами | 1.258 | Ошибка | Не все модули готовы. | В рабочей нагрузке есть модули, которые еще не готовы. | 10 минут | Сумма всех ожидающих или выполняющихся подов − Сумма готовых ожидающих или выполняющихся подов. Поды, созданные с помощью Jobs и CronJob, исключаются. | Kubernetes Classic, приложение Kubernetes |
| Обнаружение рабочих нагрузок без готовых модулей | 1.254 | Ошибка | Модуль не готов | В рабочей нагрузке нет готовых модулей. | 10 минут | Сумма всех ожидающих или выполняющихся подов − Сумма не готовых ожидающих или выполняющихся подов. Поды, созданные с помощью Jobs и CronJob, исключаются. | Kubernetes Classic, приложение Kubernetes |
Метрики рабочей нагрузки и выражения DQL
Обнаружение насыщения ЦП
| Тип | Выражение |
|---|---|
| Метрическое выражение | (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}
|
Обнаружение высокого уровня троттлинга ЦП
| Тип | Выражение |
|---|---|
| Метрическое выражение | (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}
|
Обнаружение модулей, зависших в состоянии ожидания
| Тип | Выражение |
|---|---|
| Метрическое выражение | 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}
|
Обнаружение рабочих нагрузок с неготовыми подами
Следующее выражение возвращает количество ожидающих и запущенных подов, находящихся в состоянии «не готово». Поды, созданные с помощью Jobs и 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}
|
Обнаружение рабочих нагрузок без готовых модулей
Следующее выражение возвращает количество ожидающих и выполняющихся подов в состоянии готовности. Поды, созданные с помощью Jobs и 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 |
| Oom Kills | алерт | всегда |
| События, приводящие к сбоям в работе | алерт | всегда |
| События отката пода | алерт | всегда |
| События по выселению из групп | алерт | всегда |
| События вытеснения подов | алерт | всегда |




