انتقل إلى المحتوى الرئيسي

الفصل 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​

الخاصيةDeploymentDaemonSet
عدد البوداتمحدد (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