Зарегистрируйтесь, чтобы продолжить обучение

Отладка и мониторинг Kubernetes

Отладка и мониторинг

Работа с 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 — для анализа логов. Трассировка помогает понять поведение распределённых приложений.

Комплексный подход к мониторингу, включающий все уровни системы, обеспечивает надёжную работу кластера и быструю диагностику проблем.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff