Предупреждение об общих проблемах Kubernetes / OpenShift: различия между версиями
ENetrebin (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
| Строка 1: | Строка 1: | ||
= Предупреждение об общих проблемах Kubernetes / OpenShift = | |||
''' | '''Версия Ключ-АСТРОМ 1.254+''' '''Версия АктивногоШлюза 1.253+''' | ||
Чтобы настроить предупреждения об общих проблемах платформы Kubernetes, следуйте инструкциям ниже. | |||
== Настройка == | |||
Существует три способа настройки предупреждений об общих проблемах Kubernetes/OpenShift. Настройка предупреждения на другом уровне предназначена только для упрощения конфигурации сразу нескольких сущностей. Это не меняет поведение предупреждения. Например, включение предупреждения о насыщении CPU рабочей нагрузки по-прежнему будет оценивать и создавать проблемы для каждой рабочей нагрузки Kubernetes отдельно, даже если оно настроено на уровне кластера Kubernetes. Подробнее об иерархии настроек см. в документации по настройкам. | |||
''' | * '''Настройки уровня тенанта''': применяются ко всем кластерам, нодам, пространствам имён или рабочим нагрузкам в тенанте Kubernetes/OpenShift. | ||
** Чтобы настроить, перейдите в '''Настройки''' > '''Обнаружение аномалий''' и выберите любую страницу в разделе '''Kubernetes'''. | |||
* '''Настройки уровня кластера''': применяются к выбранному кластеру или к нодам, пространствам имён и рабочим нагрузкам выбранного кластера. | |||
** Чтобы настроить, перейдите в настройки выбранного кластера Kubernetes и выберите любую страницу в разделе '''Обнаружение аномалий'''. | |||
* '''Настройки уровня пространства имён''': применяются к выбранным пространствам имён или рабочим нагрузкам. | |||
** Чтобы настроить, перейдите в настройки выбранного пространства имён и выберите любую страницу в разделе '''Обнаружение аномалий'''. | |||
== Просмотр предупреждений == | |||
Проблемы, закрытые вручную, появятся снова через 60 дней, если их первопричина остаётся нерешённой. | |||
Просматривать предупреждения можно: | |||
''' | * На странице '''Проблемы'''. | ||
* В разделе '''События''' страницы сведений о кластере. | |||
Выберите событие, чтобы перейти в '''Визуализацию данных''' и получить больше информации о метрике, вызвавшей событие. | |||
== Доступные предупреждения == | |||
Ниже приведён список доступных предупреждений. Следующие предупреждения не переклассифицируются как сигналы предупреждений при включении обновлённой классификации. | |||
* | * Обнаружение проблем готовности кластера | ||
* | * Обнаружение зависших развёртываний | ||
* Обнаружение рабочих нагрузок без готовых подов | |||
* Обнаружение событий backoff подов | |||
=== Предупреждения кластера === | |||
{| class="wikitable" | |||
!Название предупреждения | |||
!Версия Ключ-АСТРОМ | |||
!Тип проблемы | |||
!Заголовок проблемы | |||
!Описание проблемы | |||
!Деактивация после | |||
!Расчёт | |||
!Поддерживается в | |||
|- | |||
|Насыщение 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-запросов на кластере ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.node.requests_cpu:splitBy():sum/builtin:kubernetes.node.cpu_allocatable:splitBy():sum*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения запросов памяти на кластере ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.node.requests_memory:splitBy():sum/builtin:kubernetes.node.memory_allocatable:splitBy():sum*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения подов на кластере ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>(builtin:kubernetes.node.pods:filter(and(eq(pod_condition,Ready))):splitBy():sum/builtin:kubernetes.node.pods_allocatable:splitBy():sum):default(0.0)*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение проблем готовности кластера ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.cluster.readyz:splitBy():sum</code> | |||
|- | |||
|DQL | |||
|<pre>timeseries {sum(dt.kubernetes.cluster.readyz, rollup: avg)}, by: {}</pre> | |||
|} | |||
==== Обнаружение недоступности мониторинга ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|(нет выражения метрики) | |||
|- | |||
|DQL | |||
|(нет DQL) | |||
|} | |||
=== Предупреждения по умолчанию для новых тенантов === | |||
{| class="wikitable" | |||
!Предупреждение | |||
!Настройка | |||
!Значение | |||
|- | |||
|Проблемы готовности | |||
|период выборки в минутах | |||
|3 | |||
|- | |||
|Проблемы готовности | |||
|период наблюдения в минутах | |||
|5 | |||
|- | |||
|Проблемы мониторинга | |||
|период выборки в минутах | |||
|15 | |||
|- | |||
|Проблемы мониторинга | |||
|период наблюдения в минутах | |||
|30 | |||
|} | |||
=== Предупреждения нод === | |||
{| class="wikitable" | {| class="wikitable" | ||
!Название предупреждения | |||
!Версия Ключ-АСТРОМ | |||
!Тип проблемы | |||
!Заголовок проблемы | |||
!Описание проблемы | |||
!Деактивация после | |||
!Расчёт | |||
!Поддерживается в | |||
|- | |- | ||
| | |Насыщение CPU-запросов на ноде | ||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение CPU-запросов на ноде превышает указанный порог. | |||
|Насыщение CPU-запросов на ноде превышает указанный порог. | |||
|10 минут | |||
|Сумма CPU-запросов ноды / Сумма выделяемого CPU ноды | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |- | ||
|Насыщение запросов памяти на ноде | |||
|Насыщение | |||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение запросов памяти на ноде превышает указанный порог. | |||
|Насыщение запросов памяти на ноде превышает указанный порог. | |||
|10 минут | |||
|Сумма запросов памяти ноды / Сумма выделяемой памяти ноды | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |- | ||
| | |Насыщение подов на ноде | ||
|1.254 | |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-запросов на ноде ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения запросов памяти на ноде ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения подов на ноде ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение проблем готовности ноды ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.node.conditions:filter(and(eq(node_condition,Ready),ne(condition_status,True))):splitBy(dt.kubernetes.node.system_uuid,k8s.node.name):sum</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение проблемных состояний ноды ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |- | ||
| | |Метрика | ||
| | |<code>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</code> | ||
|- | |- | ||
| | |DQL | ||
| | |<pre>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}</pre> | ||
|} | |} | ||
=== Предупреждения по умолчанию для новых тенантов === | |||
{| class="wikitable" | {| class="wikitable" | ||
!Предупреждение | |||
!Настройка | |||
!Значение | |||
|- | |- | ||
| | |Проблемы готовности | ||
| | |период выборки в минутах | ||
| | |3 | ||
|- | |- | ||
| | |Проблемы готовности | ||
| | |период наблюдения в минутах | ||
| | |5 | ||
|- | |- | ||
| | |Проблемное состояние ноды | ||
| | |период выборки в минутах | ||
| | |3 | ||
|- | |- | ||
| | |Проблемное состояние ноды | ||
| | |период наблюдения в минутах | ||
| | |5 | ||
|} | |} | ||
=== Предупреждения пространств имён === | |||
{| class="wikitable" | {| class="wikitable" | ||
!Название предупреждения | |||
!Версия Ключ-АСТРОМ | |||
!Тип проблемы | |||
!Заголовок проблемы | |||
!Описание проблемы | |||
!Деактивация после | |||
!Расчёт | |||
!Поддерживается в | |||
|- | |- | ||
|Насыщение квоты CPU-лимитов | |||
|Насыщение | |||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение квоты CPU-лимитов превышает указанный порог. | |||
|Насыщение квоты CPU-лимитов превышает указанный порог. | |||
|10 минут | |||
|Сумма использованных CPU-лимитов квоты ресурсов / Сумма CPU-лимитов квоты ресурсов | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |- | ||
|Насыщение квоты CPU-запросов | |||
|Насыщение | |||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение квоты CPU-запросов превышает указанный порог. | |||
|Насыщение квоты CPU-запросов превышает указанный порог. | |||
|10 минут | |||
|Сумма использованных CPU-запросов квоты ресурсов / Сумма CPU-запросов квоты ресурсов | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |- | ||
|Насыщение квоты лимитов памяти | |||
|Насыщение | |||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение квоты лимитов памяти превышает указанный порог. | |||
|Насыщение квоты лимитов памяти превышает указанный порог. | |||
|10 минут | |||
|Сумма использованных лимитов памяти квоты ресурсов / Сумма лимитов памяти квоты ресурсов | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |- | ||
|Насыщение квоты запросов памяти | |||
|Насыщение | |||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение квоты запросов памяти превышает указанный порог. | |||
|Насыщение квоты запросов памяти превышает указанный порог. | |||
|10 минут | |||
|Сумма использованных запросов памяти квоты ресурсов / Сумма запросов памяти квоты ресурсов | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |- | ||
|Насыщение квоты подов | |||
|Насыщение | |||
|1.254 | |1.254 | ||
|Ресурс | |||
|Насыщение квоты подов превышает указанный порог. | |||
|Насыщение квоты подов превышает указанный порог. | |||
|10 минут | |||
|Сумма использованных подов квоты ресурсов / Сумма лимитов подов квоты ресурсов | |||
|Kubernetes Classic, приложение Kubernetes | |||
|} | |||
=== Метрики пространств имён и выражения DQL === | |||
==== Обнаружение насыщения квоты CPU-лимитов в пространстве имён ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.resourcequota.limits_cpu_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.limits_cpu:splitBy(k8s.namespace.name):sum*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |} | ||
==== Обнаружение насыщения квоты CPU-запросов в пространстве имён ==== | |||
{| class="wikitable" | {| class="wikitable" | ||
!Тип | |||
!Выражение | |||
|- | |- | ||
| | |Метрика | ||
| | |<code>builtin:kubernetes.resourcequota.requests_cpu_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.requests_cpu:splitBy(k8s.namespace.name):sum*100.0</code> | ||
| | |- | ||
| | |DQL | ||
|[[ | |<pre>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}</pre> | ||
|} | |||
==== Обнаружение насыщения квоты лимитов памяти в пространстве имён ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.resourcequota.limits_memory_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.limits_memory:splitBy(k8s.namespace.name):sum*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения квоты запросов памяти в пространстве имён ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.resourcequota.requests_memory_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.requests_memory:splitBy(k8s.namespace.name):sum*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения квоты подов в пространстве имён ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.resourcequota.pods_used:splitBy(k8s.namespace.name):sum/builtin:kubernetes.resourcequota.pods:splitBy(k8s.namespace.name):sum*100.0</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
=== Предупреждения о постоянных томах (PVC) === | |||
{| class="wikitable" | |||
!Название предупреждения | |||
!Версия Ключ-АСТРОМ | |||
!Тип проблемы | |||
!Заголовок проблемы | |||
!Описание проблемы | |||
!Деактивация после | |||
!Расчёт | |||
!Поддерживается в | |||
|- | |||
|Kubernetes PVC: низкий процент свободного места на диске | |||
|1.262 | |||
|Ресурс | |||
|Доступное дисковое пространство для запроса на постоянный том ниже порога. | |||
|Доступное дисковое пространство для запроса на постоянный том ниже порога. | |||
|10 минут | |||
|Доступные байты статистики тома / Ёмкость статистики тома | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |||
|Kubernetes PVC: низкий объём свободного места на диске | |||
|1.262 | |||
|Ресурс | |||
|Доступное дисковое пространство для запроса на постоянный том ниже порога. | |||
|Доступное дисковое пространство для запроса на постоянный том ниже порога. | |||
|10 минут | |||
|Метрика доступных байтов статистики тома kubelet | |||
|Kubernetes Classic, приложение Kubernetes | |||
|} | |||
=== Метрики PVC и выражения DQL === | |||
==== Обнаружение низкого процента свободного места на диске ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение низкого объёма свободного места на диске (МиБ) ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.persistentvolumeclaim.available:splitBy(k8s.namespace.name,k8s.persistent_volume_claim.name):avg</code> | |||
|- | |||
|DQL | |||
|<pre>timeseries {avg(dt.kubernetes.persistentvolumeclaim.available)}, by: {k8s.namespace.name,k8s.persistent_volume_claim.name}</pre> | |||
|} | |||
=== Предупреждения рабочих нагрузок === | |||
{| class="wikitable" | |||
!Название предупреждения | |||
!Версия Ключ-АСТРОМ | |||
!Тип проблемы | |||
!Заголовок проблемы | |||
!Описание проблемы | |||
!Деактивация после | |||
!Расчёт | |||
!Поддерживается в | |||
|- | |||
|Использование CPU близко к лимитам | |||
|1.264 | |||
|Ресурс | |||
|Использование CPU превышает порог с точки зрения заданного лимита CPU. | |||
|Использование CPU превышает порог с точки зрения заданного лимита CPU. | |||
|10 минут | |||
|Сумма использования CPU рабочей нагрузки / Сумма лимитов CPU рабочей нагрузки | |||
|Kubernetes Classic, приложение Kubernetes | |||
|- | |||
|Перезапуски контейнеров | |||
|1.254 | |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 | |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 | |1.254 | ||
|Ошибка | |||
|Рабочая нагрузка не имеет ни одного готового пода. | |||
|Рабочая нагрузка не имеет ни одного готового пода. | |||
|10 минут | |||
|Сумма всех ожидающих или запущенных подов − Сумма неготовых ожидающих или запущенных подов. Поды заданий и CronJob исключены. | |||
|Kubernetes Classic, приложение Kubernetes | |||
|} | |||
=== Метрики рабочих нагрузок и выражения DQL === | |||
==== Обнаружение насыщения использования CPU ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>(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</code> | |||
|- | |- | ||
| | |DQL | ||
| | |<pre>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}</pre> | ||
| | |} | ||
| | |||
|[[ | ==== Обнаружение перезапусков контейнеров ==== | ||
|1 | {| class="wikitable" | ||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.container.restarts:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0)</code> | |||
|- | |||
|DQL | |||
|<pre>timeseries {sum(dt.kubernetes.container.restarts, default:0.0, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}</pre> | |||
|} | |||
==== Обнаружение высокого троттлингования CPU ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>(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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение событий сбоя задания ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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)</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение насыщения использования памяти ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>(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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение убийств из-за нехватки памяти ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.container.oom_kills:splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0)</code> | |||
|- | |||
|DQL | |||
|<pre>timeseries {sum(dt.kubernetes.container.oom_kills, default:0.0, rollup: avg)}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}</pre> | |||
|} | |||
==== Обнаружение событий backoff подов ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.events:filter(and(eq(k8s.event.reason,BackOff))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0)</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение событий вытеснения подов ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.events:filter(and(eq(k8s.event.reason,Evicted))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum:default(0.0)</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение событий вытеснения подов (preemption) ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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)</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение подов, застрявших в состоянии ожидания ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.pods:filter(and(eq(pod_phase,Pending))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum</code> | |||
|- | |||
|DQL | |||
|<pre>timeseries {sum(dt.kubernetes.pods, rollup: avg)}, filter: {((pod_phase=="Pending"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}</pre> | |||
|} | |||
==== Обнаружение подов, застрявших в состоянии завершения ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>builtin:kubernetes.pods:filter(and(eq(pod_status,Terminating))):splitBy(k8s.namespace.name,k8s.workload.kind,k8s.workload.name):sum</code> | |||
|- | |||
|DQL | |||
|<pre>timeseries {sum(dt.kubernetes.pods, rollup: avg)}, filter: {((pod_status=="Terminating"))}, by: {k8s.namespace.name,k8s.workload.kind,k8s.workload.name}</pre> | |||
|} | |||
==== Обнаружение зависших развёртываний ==== | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение рабочих нагрузок с неготовыми подами ==== | |||
Следующее выражение возвращает количество ожидающих и запущенных подов в неготовом состоянии. Поды заданий и CronJobs исключены. | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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)</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
==== Обнаружение рабочих нагрузок без готовых подов ==== | |||
Следующее выражение возвращает количество ожидающих и запущенных подов в готовом состоянии. Поды заданий и CronJobs исключены. | |||
{| class="wikitable" | |||
!Тип | |||
!Выражение | |||
|- | |||
|Метрика | |||
|<code>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)</code> | |||
|- | |||
|DQL | |||
|<pre>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}</pre> | |||
|} | |||
=== Предупреждения по умолчанию для новых тенантов === | |||
{| class="wikitable" | |||
!Предупреждение | |||
!Настройка | |||
!Значение | |||
|- | |||
|Перезапуски контейнеров | |||
|порог | |||
|1 | |||
|- | |||
|Перезапуски контейнеров | |||
|период выборки в минутах | |||
|3 | |||
|- | |||
|Перезапуски контейнеров | |||
|период наблюдения в минутах | |||
|5 | |||
|- | |||
|Развёртывание зависло | |||
|период выборки в минутах | |||
|3 | |||
|- | |||
|Развёртывание зависло | |||
|период наблюдения в минутах | |||
|5 | |||
|- | |||
|Ожидающие поды | |||
|порог | |||
|1 | |||
|- | |||
|Ожидающие поды | |||
|период выборки в минутах | |||
|10 | |||
|- | |||
|Ожидающие поды | |||
|период наблюдения в минутах | |||
|15 | |||
|- | |||
|Поды застряли в состоянии завершения | |||
|период выборки в минутах | |||
|10 | |||
|- | |||
|Поды застряли в состоянии завершения | |||
|период наблюдения в минутах | |||
|15 | |||
|- | |||
|Рабочая нагрузка без готовых подов | |||
|период выборки в минутах | |||
|10 | |||
|- | |||
|Рабочая нагрузка без готовых подов | |||
|период наблюдения в минутах | |||
|15 | |||
|- | |||
|Убийства из-за нехватки памяти | |||
|предупреждать всегда | |||
|— | |||
|- | |||
|События сбоя задания | |||
|предупреждать всегда | |||
|— | |||
|- | |||
|События backoff подов | |||
|предупреждать всегда | |||
|— | |||
|- | |||
|События вытеснения подов | |||
|предупреждать всегда | |||
|— | |||
|- | |||
|События вытеснения подов (preemption) | |||
|предупреждать всегда | |||
|— | |||
|} | |} | ||
Текущая версия от 11:46, 30 сентября 2026
Предупреждение об общих проблемах 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) | предупреждать всегда | — |