- Отладка и мониторинг
Отладка и мониторинг
Работа с Kubernetes в production требует постоянного мониторинга состояния кластера и быстрого решения возникающих проблем. Приложения могут падать, узлы выходить из строя, ресурсы заканчиваться, а сетевые соединения прерываться. Без правильных инструментов диагностики и мониторинга вы будете работать вслепую, не понимая причин проблем и не имея возможности их предотвратить. В этом уроке вы изучите инструменты отладки и мониторинга, которые помогут поддерживать стабильную работу кластера.
Основы отладки с kubectl
kubectl — это основной инструмент для диагностики проблем в Kubernetes. Он предоставляет множество команд для анализа состояния кластера, Pod, Service и других ресурсов.
Анализ состояния Pod
Когда приложение не работает, первым делом проверьте состояние Pod:
# Посмотреть все Pod
kubectl get pods
# Посмотреть Pod с подробной информацией
kubectl get pods -o wide
# Посмотреть Pod в реальном времени
kubectl get pods -w
Статус Pod рассказывает о его состоянии:
- Pending — Pod принят, но не размещён на узле
- Running — Pod размещён и все контейнеры запущены
- Succeeded — Все контейнеры завершились успешно
- Failed — По крайней мере один контейнер завершился с ошибкой
- Unknown — Состояние Pod не может быть определено
Для детального анализа используйте kubectl describe:
# Подробная информация о Pod
kubectl describe pod <pod-name>
# Посмотреть события, связанные с Pod
kubectl get events --field-selector involvedObject.name=<pod-name>
Команда describe покажет события, условия, переменные окружения, тома и другую информацию, которая поможет понять причину проблемы.
Анализ логов
Логи — основной источник информации о работе приложения:
# Логи контейнера
kubectl logs <pod-name>
# Логи с отслеживанием изменений
kubectl logs -f <pod-name>
# Логи предыдущего контейнера (если контейнер перезапустился)
kubectl logs <pod-name> --previous
# Логи конкретного контейнера в Pod с несколькими контейнерами
kubectl logs <pod-name> -c <container-name>
# Логи за последний час
kubectl logs <pod-name> --since=1h
# Логи с временными метками
kubectl logs <pod-name> --timestamps
Для анализа логов используйте стандартные Unix-инструменты:
# Поиск ошибок
kubectl logs <pod-name> | grep -i error
# Подсчёт строк
kubectl logs <pod-name> | wc -l
# Последние 100 строк
kubectl logs <pod-name> | tail -100
# Фильтрация по времени
kubectl logs <pod-name> --since=2h | grep ERROR
Выполнение команд в контейнере
Иногда нужно исследовать файловую систему или выполнить команды внутри контейнера:
# Выполнить команду в контейнере
kubectl exec <pod-name> -- ls /app
# Открыть интерактивную сессию
kubectl exec -it <pod-name> -- /bin/bash
# Выполнить команду в конкретном контейнере
kubectl exec <pod-name> -c <container-name> -- ps aux
# Копировать файлы в/из контейнера
kubectl cp <pod-name>:/app/config.yaml ./config.yaml
kubectl cp ./config.yaml <pod-name>:/app/config.yaml
Анализ ресурсов
Проблемы часто связаны с нехваткой ресурсов:
# Использование ресурсов узлами
kubectl top nodes
# Использование ресурсов Pod
kubectl top pods
# Использование ресурсов Pod в конкретном namespace
kubectl top pods -n <namespace>
# Подробная информация об узле
kubectl describe node <node-name>
Команда kubectl top требует установленного metrics-server. Если метрики недоступны, установите его:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Диагностика сетевых проблем
Сетевые проблемы — одни из самых сложных для диагностики. Kubernetes предоставляет несколько инструментов для анализа сетевой связности.
Проверка Service и Endpoints
Service может не работать из-за неправильной конфигурации или недоступности backend Pod:
# Посмотреть Service
kubectl get services
# Подробная информация о Service
kubectl describe service <service-name>
# Посмотреть Endpoints
kubectl get endpoints <service-name>
# Посмотреть Endpoints с подробной информацией
kubectl describe endpoints <service-name>
Если Endpoints пустой, проверьте селектор Service и метки Pod. Если Endpoints содержит IP-адреса, но Service не отвечает, проблема может быть в kube-proxy или сетевой конфигурации.
Тестирование сетевой связности
Создайте временный Pod для тестирования сетевой связности:
# Запустить временный Pod с сетевыми инструментами
kubectl run test-pod --image=nicolaka/netshoot --rm -it --restart=Never -- sh
# Внутри Pod протестировать связность
nslookup <service-name>
curl http://<service-name>:<port>
telnet <service-ip> <port>
Pod nicolaka/netshoot содержит множество сетевых инструментов: curl, wget, nslookup, dig, telnet, tcpdump и другие.
Анализ DNS
DNS-проблемы могут приводить к недоступности Service:
# Посмотреть DNS-конфигурацию
kubectl get configmap -n kube-system coredns -o yaml
# Проверить DNS из Pod
kubectl run test-dns --image=busybox --rm -it --restart=Never -- nslookup kubernetes.default
# Посмотреть логи CoreDNS
kubectl logs -n kube-system -l k8s-app=kube-dns
Мониторинг с Prometheus
Prometheus — это система мониторинга и база данных временных рядов, которая широко используется для мониторинга Kubernetes кластеров.
Установка Prometheus
Установите Prometheus с помощью Helm:
# Добавить репозиторий Prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Установить Prometheus
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
Этот Helm chart устанавливает Prometheus, Grafana, AlertManager и множество экспортеров метрик.
Основные метрики
Prometheus собирает метрики из различных источников:
# Посмотреть доступные метрики
kubectl port-forward -n monitoring svc/prometheus-server 9090:80
# Открыть Prometheus UI в браузере
open http://localhost:9090
Основные метрики для мониторинга:
kube_pod_status_phase— фаза Pod (Running, Pending, Failed)kube_node_status_condition— состояние узловcontainer_cpu_usage_seconds_total— использование CPU контейнерамиcontainer_memory_usage_bytes— использование памяти контейнерамиkube_deployment_status_replicas— количество реплик Deployment
Настройка алертов
Создайте правила алертов для критичных событий:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kubernetes-alerts
namespace: monitoring
spec:
groups:
- name: kubernetes.rules
rules:
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
for: 5m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.pod }} is crash looping"
- alert: HighCPUUsage
expr: rate(container_cpu_usage_seconds_total[5m]) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.pod }}"
- alert: HighMemoryUsage
expr: container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.9
for: 5m
labels:
severity: critical
annotations:
summary: "High memory usage on {{ $labels.pod }}"
Визуализация с Grafana
Grafana предоставляет мощные возможности для визуализации метрик и создания дашбордов.
Доступ к Grafana
# Получить пароль администратора
kubectl get secret -n monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode
# Открыть Grafana
kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80
Откройте http://localhost:3000 в браузере и войдите с логином admin и паролем, полученным выше.
Готовые дашборды
kube-prometheus-stack включает множество готовых дашбордов:
- Kubernetes Cluster — общее состояние кластера
- Kubernetes Pod — детальная информация о Pod
- Kubernetes Node — метрики узлов
- Kubernetes Deployment — состояние Deployment
Создание собственного дашборда
Создайте дашборд для мониторинга вашего приложения:
{
"dashboard": {
"title": "My Application Dashboard",
"panels": [
{
"title": "Pod Status",
"type": "stat",
"targets": [
{
"expr": "sum by (phase) (kube_pod_status_phase)",
"legendFormat": "{{phase}}"
}
]
},
{
"title": "CPU Usage",
"type": "graph",
"targets": [
{
"expr": "rate(container_cpu_usage_seconds_total[5m])",
"legendFormat": "{{pod}}"
}
]
},
{
"title": "Memory Usage",
"type": "graph",
"targets": [
{
"expr": "container_memory_usage_bytes",
"legendFormat": "{{pod}}"
}
]
}
]
}
}
Централизованное логирование
Для анализа логов множества Pod нужна централизованная система логирования.
ELK Stack
Установите Elasticsearch, Logstash и Kibana:
# Установить Elasticsearch
helm install elasticsearch elastic/elasticsearch --namespace logging --create-namespace
# Установить Kibana
helm install kibana elastic/kibana --namespace logging
# Установить Filebeat для сбора логов
helm install filebeat elastic/filebeat --namespace logging
Fluentd
Fluentd — альтернативный сборщик логов:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
namespace: logging
data:
fluent.conf: |
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
tag kubernetes.*
format json
time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</source>
<match kubernetes.**>
@type elasticsearch
host elasticsearch.logging.svc.cluster.local
port 9200
index_name kubernetes
</match>
Loki
Loki — легковесная система логирования от Grafana:
# Установить Loki
helm install loki grafana/loki-stack --namespace logging --create-namespace
# Установить Promtail для сбора логов
kubectl apply -f https://raw.githubusercontent.com/grafana/loki/main/production/helm/loki-stack/templates/promtail-daemonset.yaml
Loki интегрируется с Grafana и предоставляет простой интерфейс для поиска по логам.
Трассировка (Distributed Tracing)
Для анализа производительности распределённых приложений используйте трассировку.
Jaeger
Jaeger — популярная система трассировки:
# Установить Jaeger
kubectl create namespace tracing
kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/main/deploy/crds/jaegertracing.io_jaegers_crd.yaml
kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/main/deploy/service_account.yaml
kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/main/deploy/role.yaml
kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/main/deploy/role_binding.yaml
kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/main/deploy/operator.yaml
# Создать Jaeger instance
kubectl apply -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: jaeger
namespace: tracing
spec:
strategy: allInOne
EOF
Интеграция с приложением
Для отправки трасс из приложения используйте OpenTelemetry:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-with-tracing
spec:
template:
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: JAEGER_AGENT_HOST
value: jaeger-agent.tracing.svc.cluster.local
- name: JAEGER_AGENT_PORT
value: "6831"
Практический пример: диагностика проблемы
Рассмотрим полный процесс диагностики проблемы с приложением:
# 1. Проверить общее состояние кластера
kubectl get nodes
kubectl get pods --all-namespaces
# 2. Найти проблемный Pod
kubectl get pods | grep -v Running
# 3. Проанализировать состояние Pod
kubectl describe pod <problematic-pod>
# 4. Посмотреть логи
kubectl logs <problematic-pod> --previous
kubectl logs <problematic-pod> -c <container-name>
# 5. Проверить события
kubectl get events --sort-by=.metadata.creationTimestamp
# 6. Проверить ресурсы
kubectl top nodes
kubectl top pods
# 7. Проверить сетевую связность
kubectl run debug --image=nicolaka/netshoot --rm -it --restart=Never -- sh
# Внутри контейнера:
nslookup <service-name>
curl http://<service-name>:<port>
# 8. Проверить конфигурацию
kubectl get configmap <config-name> -o yaml
kubectl get secret <secret-name> -o yaml
# 9. Проверить логи системных компонентов
kubectl logs -n kube-system kube-apiserver-master
kubectl logs -n kube-system kube-scheduler-master
kubectl logs -n kube-system kube-controller-manager-master
Лучшие практики
При настройке мониторинга и отладки следуйте рекомендациям для эффективной работы. Настройте мониторинг всех критичных компонентов: API Server, etcd, Scheduler, kubelet, container runtime.
Используйте многоуровневый подход к мониторингу: инфраструктура (узлы, сеть), платформа (Kubernetes компоненты), приложения (метрики, логи, трассировка).
Настройте алерты для критичных событий, но избегайте alert fatigue — слишком много алертов притупляет внимание. Используйте разные уровни серьёзности и группируйте связанные алерты.
Регулярно тестируйте процесс восстановления. Проводите chaos engineering эксперименты для проверки отказоустойчивости системы.
Документируйте процедуры диагностики и восстановления. Создайте runbook с пошаговыми инструкциями для типичных проблем.
Используйте GitOps для управления конфигурацией мониторинга. Храните дашборды, алерты и правила в Git и применяйте их автоматически.
Заключение
Отладка и мониторинг — критически важные аспекты работы с Kubernetes в production. Правильно настроенная система мониторинга позволяет обнаруживать проблемы на раннем этапе и быстро их решать.
kubectl предоставляет мощные инструменты для диагностики, Prometheus и Grafana — для мониторинга метрик, а ELK Stack или Loki — для анализа логов. Трассировка помогает понять поведение распределённых приложений.
Комплексный подход к мониторингу, включающий все уровни системы, обеспечивает надёжную работу кластера и быструю диагностику проблем.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.