الفصل 7.2 - DaemonSets
الأهداف التعليمية
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم ما هو DaemonSet
- نشر DaemonSets
- استخدام node selectors و affinities
- إدارة DaemonSets مع تحديثات العقد
- فهم حالات الاستخدام النموذجية
- تكوين DaemonSets لعقد محددة
مقدمة
يضمن DaemonSet تشغيل بود على جميع (أو بعض) العقد في العنقود. على عكس Deployments التي تدير عددًا محددًا من البودات، تقوم DaemonSets بإنشاء بود واحد لكل عقدة.
ما هو DaemonSet؟
يضمن DaemonSet تشغيل نسخة من بود على كل عقدة (أو على العقد المحددة) في العنقود.
الخصائص
- بود واحد لكل عقدة: يتم نشره تلقائيًا على كل عقدة
- الإدارة الذاتية: ينشئ/يحذف البودات عند إضافة/حذف العقد
- مخصص للعقد: يمكن استهداف عقد محددة باستخدام selectors
- على مستوى النظام: مثالي للخدمات النظامية
حالات الاستخدام النموذجية
1. وكلاء تسجيل الأحداث
جمع السجلات من جميع العقد:
2. وكلاء المراقبة
جمع المقاييس من جميع العقد:
- Prometheus Node Exporter
- Datadog Agent
- New Relic Agent
3. وكلاء الأمان
- مكافحة الفيروسات
- كشف التسلل
- ماسحات الامتثال
4. الشبكة
- kube-proxy (بالفعل DaemonSet في Kubernetes)
- CNI plugins
- تنفيذ سياسات الشبكة
5. التخزين
- برامج تشغيل التخزين
- مكونات إضافية للحجم
مثال: Fluentd لتسجيل الأحداث
DaemonSet Fluentd
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
Node Selectors
النشر فقط على بعض العقد:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-agent
spec:
template:
spec:
nodeSelector:
monitoring: "enabled"
containers:
- name: agent
image: monitoring-agent:1.0
النتيجة: يقوم DaemonSet بإنشاء بودات فقط على العقد التي تحمل التسمية monitoring=enabled.
Node Affinities
التحكم الأكثر تقدمًا باستخدام affinities:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: gpu-monitor
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: accelerator
operator: In
values:
- nvidia-tesla-k80
- nvidia-tesla-v100
containers:
- name: gpu-monitor
image: gpu-monitor:1.0
Tolerations
يمكن لـ DaemonSets تحمل taints للتشغيل على العقد الملوثة:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: system-monitor
spec:
template:
spec:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers:
- name: monitor
image: system-monitor:1.0
النتيجة: يعمل DaemonSet أيضًا على العقد master/control-plane.
مثال: Prometheus Node Exporter
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.5.0
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
التحديثات
Rolling Update (الإعداد الافتراضي)
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
العملية: تحديث تدريجي للبودات على كل عقدة.
OnDelete
spec:
updateStrategy:
type: OnDelete
العملية: التحديث فقط عند حذف بود يدويًا.
الأوامر المفيدة
الإدارة
# عرض DaemonSets
kubectl get daemonset
kubectl get ds
# التفاصيل
kubectl describe daemonset fluentd
# عرض البودات
kubectl get pods -l name=fluentd
# السجلات
kubectl logs -l name=fluentd
التحديثات
# تحديث الصورة
kubectl set image daemonset/fluentd fluentd=fluent/fluentd:v2
# عرض الحالة
kubectl rollout status daemonset/fluentd
# التراجع
kubectl rollout undo daemonset/fluentd
الفروقات: DaemonSet مقابل Deployment
| الخاصية | Deployment | DaemonSet |
|---|---|---|
| عدد البودات | محدد (replicas) | واحد لكل عقدة |
| الموقع | عشوائي | على كل عقدة |
| حالات الاستخدام | التطبيقات | خدمات النظام |
| التوسع | يدوي | تلقائي (حسب العقد) |
| تحديثات العقد | غير مُدار | مُدار تلقائيًا |
الممارسات الجيدة
1. الاستخدام لخدمات النظام
DaemonSets لوكلاء النظام، وليس للتطبيقات التجارية.
2. الموارد المناسبة
تحديد حدود الموارد لتجنب الاستنزاف.
3. Tolerations
إضافة tolerations للعقد الملوثة إذا لزم الأمر.
4. المراقبة
مراقبة أن جميع العقد تحتوي على بود من DaemonSet.
5. Namespace
وضع DaemonSets النظامية في kube-system أو namespace مخصص.
الملخص
في هذا الفصل، تعلمت:
DaemonSet: بود واحد لكل عقدة في العنقود
حالات الاستخدام: وكلاء تسجيل الأحداث، المراقبة، الأمان، الشبكة
Node selectors: النشر على عقد محددة
Tolerations: التشغيل على العقد الملوثة
التحديثات: RollingUpdate أو OnDelete
الفروقات: واحد لكل عقدة مقابل عدد محدد
الممارسات الجيدة: خدمات النظام، الموارد، المراقبة
الخطوات التالية
الفصل 7.3: Jobs
الفصل 7.4: CronJobs
تم إنشاء الفصل في: ديسمبر 2024