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 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.
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.
# 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 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
// /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
# 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.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"
# 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
# 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-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'
# 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"
}
}
# 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
# 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
// 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'
});
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.
Varsayılan json-file sürücüsü ile loglar /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log dosyasında saklanır. docker inspect CONTAINER_NAME | grep LogPath komutu ile tam yolu öğrenebilirsiniz. Log rotasyonu yapılandırmazsanız bu dosyalar zamanla disk dolmasına neden olabilir.
Konteyner silindiğinde logları da kaybolur. Bu nedenle production ortamında merkezi log toplama (Loki, ELK, Fluentd) kullanmak kritiktir. Alternatif olarak --log-driver syslog ile sistem loglarına yönlendirebilir veya uygulama içinde dosyaya yazıp volume ile kalıcı hale getirebilirsiniz.
İki yöntem: 1) Docker daemon seviyesinde /etc/docker/daemon.json dosyasına max-size ve max-file ayarlarını ekleyin (tüm konteynerler için geçerli olur). 2) Konteyner başlatırken --log-opt max-size=10m --log-opt max-file=3 parametrelerini kullanın. Değişiklik sonrası Docker'ı yeniden başlatmayı unutmayın.
kubectl logs -l app=myapp --all-containers komutu ile label selector kullanarak birden fazla pod'un loglarını aynı anda görüntüleyebilirsiniz. Daha gelişmiş çözüm için stern veya kubetail gibi araçları kullanın. Production'da Loki veya ELK Stack ile merkezi log toplama önerilir.
JSON logları yapılandırılmış olduğundan Loki, Elasticsearch gibi sistemler tarafından otomatik parse edilebilir. Belirli alanlara göre filtreleme ve arama yapılabilir (örn: userId=123 olan tüm loglar). Düz metin logları ise regex ile parse edilmesi gerekir, bu hem yavaş hem de hata prone'dur.
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 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ü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.