← Назад к вопросам

Смотрел ли логи в Kubernetes

2.8 Senior🔥 81 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с логами в Kubernetes

Да, я активно работаю с логами в Kubernetes. Это критически важная часть отладки и мониторинга production систем.

Базовые команды kubectl

Каждый день использую:

# Логи одного pod
kubectl logs pod-name -n namespace

# Логи с последних 100 строк
kubectl logs pod-name --tail=100

# В real-time режиме (tail -f)
kubectl logs -f pod-name

# Логи из определенного контейнера
kubectl logs pod-name -c container-name

# Логи удаленного pod
kubectl logs --previous pod-name

Структурированные логи (JSON)

Для production я всегда использую JSON логи:

@Configuration
public class LoggingConfig {
    // Spring Boot с ELK Stack (Elasticsearch, Logstash, Kibana)
    // logback-spring.xml конфиг с JSON encoder
}

@Slf4j
@RestController
public class OrderController {
    @PostMapping("/orders")
    public ResponseEntity createOrder(OrderRequest request) {
        log.info("Order created", 
            kv("orderId", order.getId()),
            kv("customerId", request.getCustomerId()),
            kv("amount", request.getAmount()));
    }
}

Мониторинг множества pods

# Логи всех pods в deployment
kubectl logs -l app=order-service -n production

# Логи всех pods с label
kubectl logs -l tier=backend

# Следить за новыми логами (stream)
kubectl logs -f deployment/order-service

Отладка проблем

Когда pod крашится:

# Статус pod
kubectl describe pod pod-name

# События pod
kubectl get events --field-selector involvedObject.name=pod-name

# Логи перед крашем
kubectl logs --previous pod-name

# Exec в running pod
kubectl exec -it pod-name -- /bin/bash

Логирование приложения

В Java приложении:

@Slf4j
@Service
public class OrderService {
    @Transactional
    public void processOrder(Order order) {
        log.info("Processing order",
            kv("orderId", order.getId()),
            kv("status", order.getStatus()));
        
        try {
            // Process
        } catch (Exception e) {
            log.error("Failed to process order",
                kv("orderId", order.getId()),
                e);
            throw e;
        }
    }
}

ELK Stack integration

Для большого объема логов использую ELK:

  • Elasticsearch для хранения
  • Logstash для парсинга
  • Kibana для визуализации
# Pod логи автоматически идут в Elasticsearch
kubectl logs pod-name | # отправляется в Logstash
# затем в Elasticsearch
# Видим в Kibana dashboard

Helm charts с logging

apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
spec:
  template:
    spec:
      containers:
      - name: order-service
        image: order-service:1.0
        env:
        - name: LOG_LEVEL
          value: "INFO"
        - name: ELASTICSEARCH_HOST
          value: "elasticsearch:9200"

Best Practices

  1. Структурированные логи - JSON с key-value
  2. Log levels - DEBUG, INFO, WARN, ERROR
  3. Correlation IDs - отслеживание request'а через сервисы
  4. Не логируй sensitive данные - passwords, tokens
  5. Асинхронное логирование - не блокировать thread

Проблемы и решения

Проблема: слишком много логов Решение: используй log levels, фильтруй в Kibana

Проблема: не видно логи pod'a Решение: проверь namespace, используй -n flag

Проблема: pod крашится до логирования Решение: используй kubectl logs --previous

Цикл отладки

  1. kubectl get pods - найти pod
  2. kubectl logs pod-name - прочитать логи
  3. kubectl describe pod pod-name - детали
  4. kubectl exec -it pod-name -- bash - exec в pod
  5. В Kibana искать по orderId или correlationId

Это неотъемлемая часть моей работы с production системами в Kubernetes.

Смотрел ли логи в Kubernetes | PrepBro