Траблшутинг нагрузок

Логи, терминал, события в GUI и консоли, частые ошибки и сетевые проблемы.

При диагностике проблем с подами и нагрузками используйте логи контейнеров, события (Events) и при необходимости терминал пода. В интерфейсе «Штурвал» всё это доступно на странице пода и на страницах нагрузок (Deployment, StatefulSet и т.д.). Ниже — где именно смотреть в GUI и как дублировать проверки в консоли (kubectl), а также типичные ошибки и ссылки на официальную документацию Kubernetes.


С чего начать: логи, события, терминал

Что нужно В интерфейсе В консоли
Логи контейнера Страница пода → вкладка Логи. См. раздел Просмотр логов пода ниже. kubectl logs <pod> -n <namespace>
События (Events) Дашборд неймспейса → вкладка События; или страница нагрузки/пода → вкладка События. Подробнее: Обзор дашборда неймспейса. kubectl get events -n <namespace> --sort-by='.lastTimestamp'; kubectl describe pod <pod>
Терминал пода Страница пода → вкладка Терминал (если в контейнере есть shell). См. раздел Вызов терминала пода ниже. kubectl exec -it <pod> -n <namespace> -- /bin/sh

Рекомендуемый порядок: сначала посмотрите события (причина планирования, образа, падений), затем логи пода; при необходимости откройте терминал для ручной проверки внутри контейнера.


Просмотр логов пода

В интерфейсе (GUI)

  1. Перейдите в НагрузкиPods (или откройте нагрузку → вкладка Pods) и выберите под.
  2. На странице пода откройте вкладку Логи.
  3. Выберите контейнер (если их несколько), при необходимости включите предыдущий лог (логи контейнера до последнего перезапуска), задайте диапазон времени или поиск по тексту, при необходимости скачайте логи.

На вкладке Логи доступны выбор контейнера, автообновление, отображение временной метки и предыдущего лога, количество записей (по умолчанию 100), диапазон времени, поиск по тексту и скачивание log-файла.

В консоли (kubectl)

# Логи основного контейнера
kubectl logs <pod-name> -n <namespace>

# Логи конкретного контейнера (если в поде несколько)
kubectl logs <pod-name> -n <namespace> -c <container-name>

# Поток логов в реальном времени (аналог tail -f)
kubectl logs -f <pod-name> -n <namespace>

# Логи за последний час
kubectl logs <pod-name> -n <namespace> --since=1h

# Логи предыдущего контейнера (после перезапуска — важно при CrashLoopBackOff)
kubectl logs <pod-name> -n <namespace> --previous

# Последние N строк
kubectl logs <pod-name> -n <namespace> --tail=100

Просмотр событий (Events)

События помогают понять, почему под не запланировался, не тянет образ, падает или не переходит в Ready.

В интерфейсе (GUI)

  • По неймспейсу: откройте дашборд неймспейса → вкладка События. Отображаются события всех объектов неймспейса (создание/удаление, ошибки планирования, предупреждения о ресурсах). Подробнее: Обзор дашборда неймспейса — вкладка «События».
  • По нагрузке или поду: откройте страницу Deployment / StatefulSet / Pod и перейдите на вкладку События. Там отображаются события, связанные с этим объектом (в том числе FailedScheduling, ImagePullBackOff, Killing, Unhealthy и т.п.).

В названии вкладки может отображаться количество событий. Обращайте внимание на сообщения с индикацией ошибок и предупреждений.

В консоли (kubectl)

# События неймспейса (последние в конце)
kubectl get events -n <namespace> --sort-by='.lastTimestamp'

# Детали пода, включая блок Events
kubectl describe pod <pod-name> -n <namespace>

# Только предупреждения
kubectl get events -n <namespace> --field-selector type=Warning

Официальная документация: kubectl events.


Вызов терминала пода

Удобен для ручной проверки файлов, переменных окружения и команд внутри контейнера.

В интерфейсе (GUI)

  1. Откройте страницу пода (НагрузкиPods → выберите под, или со страницы нагрузки → вкладка Pods → под).
  2. Перейдите на вкладку Терминал. Вкладка отображается только если хотя бы в одном контейнере пода есть shell (Bash в интерфейсе не поддерживается).
  3. Откроется интерактивная консоль внутри контейнера.

Обратите внимание! корректная работа терминала гарантируется в браузере Google Chrome.

В консоли (kubectl)

# Интерактивная оболочка (часто /bin/sh)
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh

# Если доступен bash
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash

# Выполнить одну команду без входа в контейнер
kubectl exec <pod-name> -n <namespace> -- ls -la /app

Частые ошибки и что проверять

Ниже — типичные состояния и ошибки, что смотреть в GUI (события, логи) и как исправлять. Дополнительно см. официальные руководства: Troubleshooting Applications, Determine the Reason for Pod Failure.

Под в состоянии Pending

Симптом: под долго остаётся в статусе Pending, не переходит в Running.

Причины и действия:

  1. Нехватка ресурсов на узлах (Insufficient CPU / Insufficient memory)
    В событиях пода или неймспейса обычно есть сообщение вроде 0/N nodes are available: N Insufficient cpu, N Insufficient memory.

    • В GUI: проверьте вкладку События на странице пода или дашборда неймспейса.
    • Решение: уменьшите requests (и при необходимости limits) в манифесте пода/Deployment; или запросите у администратора добавление узлов / увеличение квот.
  2. Несовпадение taints узлов и tolerations пода
    Под не может быть запланирован на узлы с taints, если у пода нет подходящих tolerations.

    • Проверьте события (в GUI — вкладка События; в консоли — kubectl describe pod <pod>).
    • Добавьте в spec пода соответствующие tolerations или измените taints на узлах (через администратора).
  3. Использование hostPort
    Ограничивает выбор узлов. По возможности используйте Service вместо hostPort.

Пример проверки в консоли:

kubectl describe pod <pod-name> -n <namespace>
# В блоке Events ищите FailedScheduling и текст причины

CrashLoopBackOff

Симптом: под постоянно перезапускается, статус CrashLoopBackOff.

Причины (часто): ошибка в приложении при старте, превышение лимита памяти (OOMKilled), неверные переменные окружения или конфигурация, отсутствие зависимостей (БД, внешний сервис), слишком строгие или неверные readiness/liveness probes, ошибки монтирования томов.

Что сделать:

  1. Логи предыдущего контейнера — часто там видна причина падения.
    • В GUI: страница пода → вкладка Логи → включите опцию отображения предыдущего лога (логи до последнего рестарта).
    • В консоли: kubectl logs <pod-name> -n <namespace> --previous
  2. События — на странице пода или нагрузки откройте вкладку События; в консоли — kubectl describe pod <pod-name>. Ищите сообщения о Killing, Unhealthy, Back-off restarting.
  3. Проверьте: образ и тег, переменные окружения, монтирование секретов/ConfigMap, доступность БД и внешних сервисов, настройки probes (начальная задержка, таймауты, порты).

См. также: Determine the Reason for Pod Failure (termination message, логи).


OOMKilled (Out Of Memory)

Симптом: контейнер завершён из-за превышения лимита памяти (в событиях/статусе — OOMKilled).

Причина: потребление памяти выше значения resources.limits.memory.

Решение:

  1. Увеличьте memory.limits (и при необходимости memory.requests) в манифесте Deployment/Pod.
  2. Оптимизируйте приложение (утечки памяти, кэши, размер пулов).
  3. Проверьте логи и метрики перед падением (в GUI — вкладка Логи, блок метрик на странице пода/нагрузки).

Пример:

resources:
  limits:
    memory: "512Mi"   # увеличить при необходимости
  requests:
    memory: "256Mi"

ImagePullBackOff / ErrImagePull

Симптом: под не может загрузить образ, статус ImagePullBackOff или ErrImagePull.

Причины: неверное имя образа или тег, образ в приватном реестре без учётных данных, нет сетевого доступа к реестру.

Что сделать:

  1. Проверьте имя образа и тег в манифесте (в GUI — вкладка Манифест или Шаблон пода).
  2. Убедитесь, что образ существует в реестре (доступен с узлов кластера).
  3. Для приватного реестра: задайте imagePullSecrets в поде (секреты создаются в разделе НеймспейсХранилище). См. подготовку образа и registry перед деплоем.
  4. Проверьте события пода (вкладка События) — там часто указана точная причина (например, 401 Unauthorized, 404 Not Found).

Официально: Pull an Image from a Private Registry, ImagePullBackOff.


Init-контейнер падает (Init:Error / Init:CrashLoopBackOff)

Симптом: под не переходит в Running, в статусе видно падение init-контейнера.

Что сделать: смотрите логи именно init-контейнера (в GUI — на вкладке Логи выберите этот контейнер; в консоли — kubectl logs <pod-name> -n <namespace> -c <init-container-name>). Проверьте скрипты, переменные окружения, доступ к зависимостям (сети, секреты, тома). События пода (вкладка События) также покажут причину перезапуска.


Liveness / Readiness probe failed

Симптом: в событиях пода сообщения о failed liveness или readiness probe; под перезапускается или не попадает в Service.

Что сделать:

  1. Проверьте логи приложения (вкладка Логи) — не падает ли приложение по таймауту или ошибке на пути проверки.
  2. Убедитесь, что порт, путь и период проверки в livenessProbe / readinessProbe соответствуют приложению (начальная задержка initialDelaySeconds может быть слишком мала).
  3. При необходимости временно ослабьте или отключите пробу для проверки (только для отладки).

Сетевые проблемы

Под не может подключиться к другому сервису

Проверьте:

  1. Существует ли Service для целевого приложения: в GUI — раздел Сервисы в неймспейсе; в консоли — kubectl get svc -n <namespace>.
  2. DNS-имя: внутри кластера — <service-name>.<namespace>.svc.cluster.local; в том же неймспейсе можно использовать короткое имя <service-name>.
  3. Совпадение портов у Service и контейнера.
  4. Сетевые политики (NetworkPolicy) не блокируют трафик: kubectl get networkpolicy -n <namespace>. При необходимости обратитесь к администратору кластера.

Ingress не открывает приложение

Проверьте: наличие и работоспособность Ingress Controller; корректность host, path и backend в ресурсе Ingress; DNS и TLS-сертификат при использовании HTTPS. При необходимости проверьте события Ingress и подов контроллера (вкладки События в GUI).


Отсутствие requests/limits

Проблема: у контейнеров не заданы requests и limits.

Последствия: HPA по CPU/памяти не работает; возможны перегрузка узлов и непредсказуемое планирование.

Решение: задайте requests и limits в манифесте (в GUI — форма создания/редактирования пода или вкладка Манифест):

resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "500m"
    memory: "512Mi"

Превышение квоты неймспейса

Симптом: под не создаётся, в событиях — ошибка о превышении квоты (ResourceQuota).

Решение: проверьте квоты неймспейса (в GUI — дашборд неймспейса, блок Квоты; в консоли — kubectl describe quota -n <namespace>). Уменьшите суммарные requests подов в неймспейсе или запросите у администратора увеличение квоты.


Нехватка ресурсов на узлах

Симптом: под в Pending, в событиях — недостаточно CPU/памяти на узлах.

Решение: проверьте использование узлов (kubectl top nodes); уменьшите requests подов или обратитесь к администратору для добавления узлов / очистки неиспользуемых подов и образов.


Неверные tolerations

Симптом: под в Pending; в событиях — не удаётся запланировать из-за taints узлов.

Решение: проверьте taints узлов (kubectl describe node <node-name> | grep Taints) и добавьте в spec пода подходящие tolerations (или согласуйте с администратором изменение taints). Пример:

spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoSchedule"

Общие рекомендации по траблшутингу

  1. Сначала события — вкладка События на дашборде неймспейса или на странице пода/нагрузки часто сразу указывает на причину (FailedScheduling, ImagePullBackOff, Killing, probe failed).
  2. Затем логи — вкладка Логи на странице пода (при падениях включайте «предыдущий лог»).
  3. Терминал пода — для ручной проверки файлов и команд внутри контейнера.
  4. Проверяйте зависимости — БД, внешние API, ConfigMap/Secret и монтирование томов.
  5. Сверяйтесь с манифестом — в GUI вкладка Манифест на странице пода/нагрузки; убедитесь, что образ, ресурсы, probes и окружение заданы верно.

Полезные команды kubectl

# Описание пода (события, условия, контейнеры)
kubectl describe pod <pod-name> -n <namespace>

# События неймспейса
kubectl get events -n <namespace> --sort-by='.lastTimestamp'

# События для конкретного пода
kubectl get events -n <namespace> --field-selector involvedObject.name=<pod-name>

# Использование ресурсов
kubectl top nodes
kubectl top pods -n <namespace>

# Сетевые политики
kubectl get networkpolicy -n <namespace>

# Service и endpoints
kubectl get svc, endpoints -n <namespace>

Дополнительные материалы