تثبيت Kubernetes مع K3s: تنسيق الحاويات الخفيف
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.
يختلف التسجيل في بيئات الحاويات عن تسجيل الخوادم التقليدية. نظراً لأن الحاويات مؤقتة، فإن جمع السجلات مركزياً خارج الحاوية أمر بالغ الأهمية. يتناول هذا الدليل إدارة سجلات Docker و Kubernetes وحلول جمع السجلات المركزية وأفضل ممارسات الإنتاج.
# عرض سجلات الحاوية
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 # آخر ساعة
# نطاق زمني محدد
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"
# عرض سجلات الـ pod
kubectl logs POD_NAME
# حاوية محددة (pod متعدد الحاويات)
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
# سجلات جميع الـ pods في 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'
});
تسجيل الحاويات الفعّال ضروري لاستكشاف الأخطاء ومراقبة صحة النظام في بيئات الإنتاج. امنع امتلاء القرص بتدوير سجلات 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) في الإنتاج أمراً بالغ الأهمية. بديلاً يمكن إعادة التوجيه إلى 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 مع محدد التسمية لعرض سجلات عدة pods في آنٍ واحد. لحلول أكثر تقدماً استخدم أدوات مثل stern أو kubetail. في الإنتاج يُنصح بجمع السجلات المركزي مع 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، عزل الشبكة وإدارة الأسرار.