Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.
Логирование в контейнерных средах отличается от традиционного серверного логирования. Поскольку контейнеры эфемерны, централизованный сбор логов за пределами контейнера критически важен. В этом руководстве рассматривается управление логами Docker и Kubernetes, решения для централизованного сбора логов и лучшие практики для production.
# Просмотр логов контейнера
docker logs CONTAINER_NAME
# Последние N строк
docker logs --tail 100 CONTAINER_NAME
# Потоковая передача логов в реальном времени
docker logs -f CONTAINER_NAME
# С временными метками
docker logs -t CONTAINER_NAME
# С определённого времени
docker logs --since 1h CONTAINER_NAME # Последний 1 час
# Определённый временной диапазон
docker logs --since 2h --until 1h CONTAINER_NAME
# Проверить текущий драйвер логов
docker info | grep 'Logging Driver'
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
# Перезапустить Docker daemon
systemctl restart docker
# json-file с ротацией логов
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
# Перенаправить в syslog
docker run -d \
--name myapp \
--log-driver syslog \
--log-opt syslog-address=udp://localhost:514 \
myapp:latest
version: '3.8'
services:
app:
image: myapp:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
compress: "true"
nginx:
image: nginx:latest
logging:
driver: json-file
options:
max-size: "5m"
max-file: "3"
# Просмотр логов пода
kubectl logs POD_NAME
# Конкретный контейнер (мульти-контейнерный под)
kubectl logs POD_NAME -c CONTAINER_NAME
# Потоковая передача логов
kubectl logs -f POD_NAME
# Последние N строк
kubectl logs --tail=100 POD_NAME
# С определённого времени
kubectl logs --since=1h POD_NAME
# Логи предыдущего контейнера (после сбоя)
kubectl logs --previous POD_NAME
# Логи всех подов в deployment
kubectl logs -l app=myapp --all-containers
# loki-stack.yml
version: '3.8'
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
volumes:
- loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=StrongPass123!
volumes:
- grafana-data:/var/lib/grafana
volumes:
loki-data:
grafana-data:
# Проверить размеры файлов логов Docker
du -sh /var/lib/docker/containers/*/*-json.log
# Очистить лог конкретного контейнера
truncate -s 0 $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)
# Автоматическая ротация с logrotate
cat > /etc/logrotate.d/docker-containers << 'EOF'
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=10M
missingok
delaycompress
copytruncate
}
EOF
// Node.js — JSON-логирование с Winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.Console()
]
});
logger.info('Вход пользователя', {
userId: 123,
action: 'login',
ip: '192.168.1.1'
});
logger.error('Ошибка базы данных', {
error: err.message,
query: 'SELECT * FROM users'
});
Эффективное логирование контейнеров необходимо для устранения неполадок и мониторинга состояния системы в production-окружениях. Предотвращайте переполнение диска с ротацией логов Docker, настраивайте централизованный сбор логов с Loki или ELK Stack и упрощайте анализ логов со структурированными JSON-логами. С этими конфигурациями на серверах REXE вы можете управлять контейнерной инфраструктурой с полной видимостью.
При использовании стандартного драйвера json-file логи хранятся в /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log. Используйте docker inspect CONTAINER_NAME | grep LogPath для нахождения точного пути. Без настроенной ротации логов эти файлы со временем могут заполнить диск.
При удалении контейнера его логи тоже теряются. Поэтому использование централизованного сбора логов (Loki, ELK, Fluentd) в production критически важно. Альтернативно можно перенаправить в syslog с --log-driver syslog или писать в файл внутри приложения и сделать его постоянным с помощью volume.
Два метода: 1) На уровне Docker daemon добавьте max-size и max-file в /etc/docker/daemon.json (применяется ко всем контейнерам). 2) При запуске контейнера используйте --log-opt max-size=10m --log-opt max-file=3. Не забудьте перезапустить Docker после изменений.
Используйте kubectl logs -l app=myapp --all-containers с селектором меток для одновременного просмотра логов нескольких подов. Для более продвинутых решений используйте инструменты stern или kubetail. В production рекомендуется централизованный сбор логов с Loki или ELK Stack.
JSON-логи структурированы и могут автоматически парситься системами вроде Loki и Elasticsearch. Можно фильтровать и искать по конкретным полям (например, все логи с userId=123). Текстовые логи требуют парсинга с помощью regex, что медленно и подвержено ошибкам.
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.
Лучшие практики безопасности Docker: пользователь без root, файловая система только для чтения, профили seccomp, сканирование образов, безопасность Docker socket, сетевая изоляция и управление секретами.