Инженерные инструменты эксплуатации
Эта заметка связывает инструменты, которыми я пользуюсь после написания кода. Их задача — ответить на конкретный вопрос о системе: что запущено, где сломалось, с какой конфигурацией и что изменилось.
Карта
- контейнеры и локальное окружение — Docker;
- Linux-процессы, сеть и файлы — Linux;
- оркестрация контейнеров — Kubernetes и k3s;
- просмотр Kubernetes-кластера — Lens;
- логи Java-приложения — Log4j;
- история изменений — Основы GIT;
- безопасный доступ к узлу — SSH протокол;
- сообщения и consumer groups — Kafka;
- исполняемые бизнес-процессы — Camunda 7 и BPMN.
Лестница диагностики
Я начинаю с наблюдаемого симптома и двигаюсь от внешнего слоя к внутреннему:
клиентский запрос
→ DNS / сеть / TLS
→ ingress или port
→ pod / container
→ process
→ application logs
→ dependency
→ dataТак проще не перепутать причину со следствием. Например, Connection refused и HTTP 500 требуют разных веток поиска: в первом случае соединение не установлено, во втором приложение уже приняло запрос.
До изменения состояния
Сначала собираю доказательства:
- точное время и часовой пояс;
- окружение, namespace и имя workload;
- request/correlation id, если он есть;
- версия артефакта или image digest;
- команда и полный текст ошибки;
- последние события и логи предыдущего контейнера;
- отличие от рабочего окружения.
Перезапуск может убрать симптом вместе с данными для расследования. Поэтому сначала смотрю, потом меняю.
Минимальная последовательность для Kubernetes
kubectl config current-context
kubectl get pods -A
kubectl describe pod <pod> -n <namespace>
kubectl get events -n <namespace> --sort-by=.metadata.creationTimestamp
kubectl logs <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --previousЭти команды отвечают на разные вопросы:
| Команда | Что даёт |
|---|---|
get | текущее состояние и размещение |
describe | конфигурацию, conditions и события объекта |
events | хронологию решений scheduler/kubelet/controllers |
logs | вывод приложения |
logs --previous | вывод завершившегося контейнера |
Как фиксирую результат
Для повторяемой проблемы сохраняю:
- симптом;
- минимальный способ воспроизведения;
- факты, которые сузили поиск;
- корневую причину;
- изменение;
- способ проверить результат;
- технический вывод, который пригодится в другом проекте.
Именно по этой схеме записаны Инженерные кейсы.