Установка 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, сетевые режимы (bridge, host, overlay), свои сети и связь между контейнерами.
Безопасность Docker: пользователь без root, read-only файловая система, профили seccomp, сканирование образов, Docker socket, изоляция сети и секреты.