Мониторинг Kubernetes
Мониторинг Kubernetes в Наблюдателе работает через агента — один Deployment в namespace, который вы хотите наблюдать. Агент читает поды через kube API и раз в 30 секунд отправляет их статусы, рестарты, OOM, коды выхода, CPU и память, а также ошибки из логов. Права у него только на чтение: в кластере он ничего не создаёт и не меняет.
Ниже — как поставить агента, какие права он получает, зачем нужен metrics-server и что делать, если данные не пришли.
Как установить агента в Kubernetes
- Откройте проект в кабинете и добавьте стек (кнопка «Добавить»). Один стек — одно окружение, например namespace
shop-prod. - На странице стека нажмите «Агент» → «Создать агента», введите название и нажмите «Создать».
- В блоке «Где работает стек» выберите «Kubernetes» и впишите namespace в поле «Namespace» (по умолчанию
default). - Скопируйте «Манифест nabl-agent.yaml», сохраните в файл и примените:
kubectl apply -f nabl-agent.yamlВажно. Токен агента показывается один раз. Он уже вписан в манифест — сохраните файл в надёжном месте или запишите токен отдельно.
Агент ставится в тот же namespace, который наблюдает. Манифест — обычный YAML: его можно прочитать и поправить до kubectl apply.
Что входит в манифест
| Объект | Зачем |
|---|---|
ServiceAccount nabl-agent |
учётная запись агента в кластере |
Secret nabl-agent |
токен агента (ключ token) |
Role и RoleBinding nabl-agent |
права на чтение подов, их логов, PVC и метрик в своём namespace |
ClusterRole и ClusterRoleBinding nabl-agent-volumes-<namespace> |
чтение PersistentVolume — где физически лежат тома. Необязательно |
Deployment nabl-agent |
сам агент, одна реплика |
Service nabl-agent |
приём трасс и событий от приложений: порты 4317, 4318, 4319 |
Основная часть Deployment:
containers:
- name: agent
image: velgir/nabl-agent:latest
env:
- name: NABL_BASE_URL
value: "https://app.nablops.io"
- name: NABL_MODE
value: "kubernetes"
- name: NABL_INTERVAL
value: "30"
- name: NABL_K8S_NAMESPACES
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: NABL_AGENT_TOKEN
valueFrom:
secretKeyRef:
name: nabl-agent
key: token
- name: NABL_OTLP_ENABLED
value: "true"
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
memory: 256MiПолный манифест с портами и securityContext выдаёт кабинет — берите его оттуда.
Права RBAC: что агент может в кластере
Права только на чтение:
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list"]
- apiGroups: ["metrics.k8s.io"]
resources: ["pods"]
verbs: ["get", "list"]Отдельный ClusterRole даёт get и list на persistentvolumes — чтобы показать, где лежит том: путь на ноде или внешнее хранилище. Содержимое томов агент не читает. Без этого ClusterRole агент работает, просто тома PVC видны без пути.
Под агента запускается без привилегий: не от root (uid 65532), файловая система только для чтения, без capabilities, seccomp RuntimeDefault. Нет ни hostPath, ни hostNetwork, ни privileged.
Проверить права самому:
kubectl auth can-i --list -n <namespace> --as=system:serviceaccount:<namespace>:nabl-agentАгент поставлен давно? В старых манифестах не было
securityContext. Добавить его можно без переустановки:
kubectl -n <namespace> patch deployment nabl-agent -p '{"spec":{"template":{"spec":{"securityContext":{"runAsNonRoot":true,"runAsUser":65532,"runAsGroup":65532,"seccompProfile":{"type":"RuntimeDefault"}},"containers":[{"name":"agent","securityContext":{"allowPrivilegeEscalation":false,"readOnlyRootFilesystem":true,"capabilities":{"drop":["ALL"]}}}]}}}}'
Зачем нужен metrics-server
CPU и память подов агент берёт из metrics.k8s.io — его отдаёт metrics-server. Без него поды, статусы и рестарты видны, но без графиков потребления.
Проверить, есть ли metrics-server:
kubectl top pods -n <namespace>Если команда выдаёт ошибку, установите metrics-server в кластер (в k3s и многих облачных кластерах он уже есть). Агента после этого переустанавливать не нужно.
Несколько namespace или весь кластер
По умолчанию агент наблюдает только свой namespace. Чтобы охватить несколько, задайте NABL_K8S_NAMESPACES списком через запятую или all для всего кластера:
- name: NABL_K8S_NAMESPACES
value: "shop,payments"Role действует только в своём namespace, поэтому в этом случае замените Role и RoleBinding на ClusterRole и ClusterRoleBinding с теми же правилами:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nabl-agent
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list"]
- apiGroups: ["metrics.k8s.io"]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: nabl-agent
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nabl-agent
subjects:
- kind: ServiceAccount
name: nabl-agent
namespace: <namespace>Если окружения разные (prod и staging), лучше сделать отдельные стеки и поставить по агенту в каждый namespace — так уведомления и графики не смешаются.
Что собирает агент Kubernetes
| Что | Подробности |
|---|---|
| Статусы подов | в том числе CrashLoopBackOff и непройденная проверка готовности |
| Сбои | рестарты, OOM, код выхода |
| Ресурсы | CPU и память подов (нужен metrics-server) |
| Размещение | узел, порты |
| Тома | emptyDir и hostPath с путём на ноде; PVC — с путём из PersistentVolume или названием внешнего хранилища (CSI, NFS). Агент 0.12+ |
| Выкатки | ревизия Deployment, StatefulSet и DaemonSet — выкатка видна, даже если образ не менялся. Агент 0.13+ |
| Ошибки | ошибки и исключения из логов подов — во вкладке «Ошибки». Агент 0.8.0+ |
Если под упал, агент дочитывает лог прошлого запуска, поэтому причина падения не теряется. Служебные контейнеры istio-proxy и linkerd-proxy пропускаются. Новый под, который ещё не прошёл проверку готовности и запущен меньше 5 минут, не считается нездоровым (агент 0.9.3+) — выкатки не дают ложных уведомлений.
Полные логи подов не хранятся: в Наблюдатель уходят только распознанные ошибки. Весь лог пода можно смотреть вживую в кабинете — без kubectl, см. Живые логи.
Приём трасс и событий от приложений
Service nabl-agent открывает порты 4317 (OTLP gRPC), 4318 (OTLP HTTP) и 4319 (события и логи). Из того же namespace агент доступен как nabl-agent, из других — как nabl-agent.<namespace>.svc.cluster.local. Наружу эти порты публиковать не нужно. Подробнее — в статьях Трассировка и События и логи.
Как проверить, что данные пошли
kubectl -n <namespace> get pods -l app=nabl-agent
kubectl -n <namespace> logs deploy/nabl-agent -fВ логе должна быть строка запуска вида nabl-agent 0.14.1 mode=kubernetes …. Через 30 секунд на странице стека появится вкладка «Поды» с Deployment-ами, StatefulSet-ами и их подами, а в разделе «Агенты» статус агента станет «Активен».
Сколько агент потребляет на самом деле:
kubectl top pod -n <namespace> -l app=nabl-agentЧастые ошибки
| Симптом | Причина и что делать |
|---|---|
| Поды видны, но нет CPU и памяти | Нет metrics-server. В журнале агента — код E_KUBE_METRICS. Установите metrics-server. |
Пусто, в логе агента forbidden |
Не хватает прав — код E_KUBE_RBAC. Проверьте, что Role и RoleBinding применены в том же namespace, а для нескольких namespace — что вместо них ClusterRole. |
| Нет подов из другого namespace | Агент по умолчанию видит только свой namespace — см. «Несколько namespace». |
| Тома PVC без пути | Не применён ClusterRole nabl-agent-volumes-<namespace>. Примените свежий манифест из кабинета. |
В логе агента 401 или «токен отклонён» |
Токен перевыпущен или агент удалён. Обновите Secret — см. Обновление агента и токен. |
| Нет ошибок из логов | Агент старше 0.8.0. Обновите его. |
| Под агента в CrashLoopBackOff | Посмотрите kubectl -n <namespace> logs deploy/nabl-agent --previous. Частая причина — нет исходящего доступа к https://app.nablops.io. |
Если причина не нашлась — см. решение проблем.
Обновление и удаление
Обновить агента на образе latest:
kubectl -n <namespace> rollout restart deployment/nabl-agentВ production закрепите версию тегом или digest. Новый токен и подробности — в статье Обновление агента и токен.
Удалить агента полностью:
kubectl delete -f nabl-agent.yamlУйдут Deployment, Service, Secret, ServiceAccount и права — в кластере ничего не останется.
Совет. ИИ-ассистент через MCP создаст стек, выдаст манифест под ваш namespace и проверит, что поды появились. См. ИИ-ассистент.
Что дальше
- Контейнеры — графики и статусы подов.
- Ошибки приложений — что агент находит в логах подов.
- Как работает агент — нагрузка на API-сервер и безопасность.
- Правила уведомлений — уведомления о падениях и OOM.
Первый сервер или стек подключается за пару минут. Бесплатно в раннем доступе.
Нашли неточность или не хватает ответа? Напишите в поддержку