Konteyner Loglama: Docker ve Kubernetes Log Yönetimi
Docker log sürücüleri, docker logs komutu, Kubernetes pod logları, merkezi log toplama (Loki, ELK Stack), log rotasyonu ve production ortamında log yönetimi en iyi pratikleri.
İçindekiler
Konteyner Loglama: Docker ve Kubernetes Log Yönetimi
Konteyner ortamlarında loglama, geleneksel sunucu loglamasından farklıdır. Konteynerler geçici olduğundan, logların konteyner dışında merkezi bir yerde toplanması kritik önem taşır. Bu rehberde Docker ve Kubernetes log yönetimini, merkezi log toplama çözümlerini ve production en iyi pratiklerini ele alacağız.
Docker Log Temelleri
docker logs Komutu
# Konteyner loglarını görüntüle
docker logs CONTAINER_NAME
# Son N satırı görüntüle
docker logs --tail 100 CONTAINER_NAME
# Canlı log takibi
docker logs -f CONTAINER_NAME
# Zaman damgası ile görüntüle
docker logs -t CONTAINER_NAME
# Belirli zamandan itibaren
docker logs --since 2024-01-01T00:00:00 CONTAINER_NAME
docker logs --since 1h CONTAINER_NAME # Son 1 saat
# Belirli zaman aralığı
docker logs --since 2h --until 1h CONTAINER_NAME
# Canlı + zaman damgası
docker logs -f -t CONTAINER_NAME
Docker Log Sürücüleri
Docker farklı log sürücülerini destekler:
# Mevcut log sürücüsünü kontrol et
docker info | grep 'Logging Driver'
# Konteyner log sürücüsünü görüntüle
docker inspect CONTAINER_NAME | grep LogConfig -A 5
Log Sürücüsü Yapılandırması
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
# Docker daemon'ı yeniden başlat
systemctl restart docker
Konteyner Başlatırken Log Sürücüsü
# json-file ile log rotasyonu
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
# Syslog'a yönlendir
docker run -d \
--name myapp \
--log-driver syslog \
--log-opt syslog-address=udp://localhost:514 \
myapp:latest
# Loglama devre dışı (performans kritik)
docker run -d \
--name myapp \
--log-driver none \
myapp:latest
Docker Compose ile Log Yapılandırması
# docker-compose.yml
version: '3.8'
services:
app:
image: myapp:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
compress: "true"
labels: "app,environment"
labels:
- "app=myapp"
- "environment=production"
nginx:
image: nginx:latest
logging:
driver: json-file
options:
max-size: "5m"
max-file: "3"
Kubernetes Pod Logları
# Pod loglarını görüntüle
kubectl logs POD_NAME
# Belirli container'ın logları (multi-container pod)
kubectl logs POD_NAME -c CONTAINER_NAME
# Canlı log takibi
kubectl logs -f POD_NAME
# Son N satır
kubectl logs --tail=100 POD_NAME
# Belirli zamandan itibaren
kubectl logs --since=1h POD_NAME
# Önceki container'ın logları (crash sonrası)
kubectl logs --previous POD_NAME
# Deployment'taki tüm pod'ların logları
kubectl logs -l app=myapp --all-containers
# Namespace belirterek
kubectl logs -n production POD_NAME
Merkezi Log Toplama: Loki + Grafana
Docker Compose ile Loki Stack
# 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=GucluSifre123!
volumes:
- grafana-data:/var/lib/grafana
volumes:
loki-data:
grafana-data:
Promtail Yapılandırması
# promtail-config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*?)'
target_label: 'container'
- source_labels: ['__meta_docker_container_log_stream']
target_label: 'logstream'
Docker Log Sürücüsü ile Loki
# Loki Docker plugin kur
docker plugin install grafana/loki-docker-driver:latest \
--alias loki \
--grant-all-permissions
# Konteyner başlatırken Loki'ye gönder
docker run -d \
--name myapp \
--log-driver loki \
--log-opt loki-url="http://localhost:3100/loki/api/v1/push" \
--log-opt loki-batch-size=400 \
myapp:latest
// /etc/docker/daemon.json — Tüm konteynerler için Loki
{
"log-driver": "loki",
"log-opts": {
"loki-url": "http://localhost:3100/loki/api/v1/push",
"loki-batch-size": "400",
"loki-retries": "3",
"loki-max-backoff": "800ms",
"loki-timeout": "1s"
}
}
Kubernetes'te Merkezi Loglama
Fluent Bit ile Log Toplama
# fluent-bit-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluent-bit
namespace: kube-system
spec:
selector:
matchLabels:
app: fluent-bit
template:
metadata:
labels:
app: fluent-bit
spec:
containers:
- name: fluent-bit
image: fluent/fluent-bit:latest
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: fluent-bit-config
mountPath: /fluent-bit/etc/
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: fluent-bit-config
configMap:
name: fluent-bit-config
Log Rotasyonu ve Disk Yönetimi
# Docker log dosyalarının boyutunu kontrol et
du -sh /var/lib/docker/containers/*/*-json.log
# Tüm konteyner loglarını temizle (dikkatli!)
truncate -s 0 /var/lib/docker/containers/*/*-json.log
# Belirli konteynerin logunu temizle
truncate -s 0 $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)
# Logrotate ile otomatik rotasyon
cat > /etc/logrotate.d/docker-containers << 'EOF'
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=10M
missingok
delaycompress
copytruncate
}
EOF
Yapılandırılmış Loglama (JSON)
// Node.js — Winston ile JSON loglama
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()
]
});
// Kullanım
logger.info('Kullanıcı girişi', {
userId: 123,
action: 'login',
ip: '192.168.1.1'
});
logger.error('Veritabanı hatası', {
error: err.message,
query: 'SELECT * FROM users'
});
Sonuç
Etkili konteyner loglaması, production ortamlarında sorun tespiti ve sistem sağlığı izleme için vazgeçilmezdir. Docker'da log rotasyonu ile disk dolmasını önleyin, Loki veya ELK Stack ile merkezi log toplama kurun ve yapılandırılmış JSON logları ile log analizini kolaylaştırın. REXE sunucularında bu yapılandırmalar ile konteyner altyapınızı tam görünürlükle yönetebilirsiniz.
İlgili Makaleler
K3s ile Kubernetes Kurulumu: Hafif Konteyner Orkestrasyonu
K3s ile tek node ve çok node Kubernetes cluster kurulumu, kubectl kullanımı, deployment ve service oluşturma, Helm ile uygulama yönetimi. VPS üzerinde Kubernetes rehberi.
Docker Volume ve Network Yönetimi: Kalıcı Depolama ve Ağ Yapılandırması
Docker volume türleri (named, bind mount, tmpfs), volume yönetimi, Docker network modları (bridge, host, overlay), özel ağ oluşturma ve konteyner iletişimi. Kapsamlı rehber.
Docker Güvenliği: Konteyner Ortamını Sertleştirme
Docker güvenlik en iyi pratikleri: root olmayan kullanıcı, read-only filesystem, seccomp profilleri, image tarama, Docker socket güvenliği, network izolasyonu ve secrets yönetimi.