במדריך DaemonSet זה ל-Kubernetes עבור סוכני מערכת, אנו מכסים דוגמאות של Node Exporter DaemonSet, Fluent Bit DaemonSet ו-Falco DaemonSet, יחד עם תצורת DaemonSet, tolerations ל-DaemonSet, priorityClassName system-node-critical, updateStrategy ל-DaemonSet, ומדריך שלב-אחר-שלב ל-DaemonSet להקמת סוכן DaemonSet.
תארו לעצמכם: אתם מוסיפים צומת חדש לאשכול, מגדירים autoscaling, אבל Node Exporter לא מתחיל על אותו צומת. המדדים מהצומת הזה חסרים, שאילתות ל-Prometheus כוללות פערי נתונים. הסיבה — DaemonSet ללא tolerations לא ירוץ על צמתים עם ה-taint של control-plane. אובדן הנראות מעלה את ה-MTTR ב-30-50% ויוצר כתמים עיוורים בניטור. לפי הנתונים שלנו, מעל 80% מתקריות הניטור שפתרנו נבעו מחוסר tolerations ב-DaemonSet.
DaemonSet מבטיח ש-pod אחד בדיוק ירוץ על כל צומת באשכול. אנו משתמשים במשאב זה כדי לפרוס סוכני ניטור, אספני לוגים, תוספי CNI ואבטחת runtime — כל מה שחייב לרוץ על כל מארח ללא יוצא מן הכלל. ללא DaemonSet, אתם מסתכנים באובדן נראות על צומת חדש או במהלך תקלה. הפחתת MTTR ב-40-60% וחיסכון בעלויות תפעול הם התוצאה של תצורה נכונה.
למה DaemonSet הוא הבחירה הנכונה היחידה עבור סוכני מערכת
כל סוכן שחייב לאסוף נתונים מכל צומת צריך לרוץ דרך DaemonSet. ניסיון להשתמש ב-ReplicaSet או Deployment מוביל לפערי כיסוי. לדוגמה, במהלך scaling אוטומטי או החלפת צומת, pod חדש עלול שלא להתחיל אם ה-controller לא מסונכרן עם מחזור החיים של הצומת. DaemonSet עדיף על Deployment מבחינת כיסוי: 100% מהצמתים לעומת התפלגות הסתברותית, וזה קריטי לניטור.
Node Exporter (Prometheus) — DaemonSet קלאסי. אוסף מדדי CPU, זיכרון, דיסק ורשת מכל צומת. pod אחד לכל צומת, hostNetwork: true לגישה לממשקי הרשת של המארח, hostPID: true לסטטיסטיקות תהליכים. Fluent Bit לאיסוף לוגים קורא /var/log/containers/*.log דרך נפח hostPath. ללא DaemonSet, לוגים מצומת חדש פשוט לא יגיעו לאחסון המרכזי. Falco — סוכן אבטחת runtime, מזהה execve בלתי צפויים, שינויים ב-/etc/passwd, חיבורי רשת חשודים. צומת ללא Falco הוא כתם עיוור.
איך להבטיח שהסוכן ירוץ על כל צומת
פרמטרים מרכזיים של ה-manifest:
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9100"
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoSchedule
hostNetwork: true
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.7.0
args:
- '--path.rootfs=/host'
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 65534
volumeMounts:
- name: host-root
mountPath: /host
readOnly: true
mountPropagation: HostToContainer
volumes:
- name: host-root
hostPath:
path: /
priorityClassName: system-node-critical
נקודות קריטיות:
-
tolerations — בלעדיהם, ה-DaemonSet לא ירוץ על control-plane (taint
apiVersion: apps/v1 kind: DaemonSet metadata: name: node-exporter namespace: monitoring spec: selector: matchLabels: app: node-exporter template: metadata: labels: app: node-exporter annotations: prometheus.io/scrape: "true" prometheus.io/port: "9100" spec: tolerations: - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule - key: node.kubernetes.io/not-ready operator: Exists effect: NoSchedule hostNetwork: true hostPID: true containers: - name: node-exporter image: prom/node-exporter:v1.7.0 args: - '--path.rootfs=/host' securityContext: readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 65534 volumeMounts: - name: host-root mountPath: /host readOnly: true mountPropagation: HostToContainer volumes: - name: host-root hostPath: path: / priorityClassName: system-node-critical) ועל צמתים בעייתיים (NoSchedule). עבור סוכני ניטור, בדיוק רשימה זו נדרשת. - priorityClassName: system-node-critical — הסוכן לא יפונה על ידי pods רגילים במהלך עומס יתר.
- mountPropagation: HostToContainer — אספן הלוגים יראה קבצי לוג חדשים של קונטיינרים שנוצרו לאחר שהפוד התחיל.
מתי להשתמש ב-OnDelete במקום RollingUpdate
| אסטרטגיה | התנהגות | מתי להשתמש |
|---|---|---|
| RollingUpdate | מעדכן pods ברצף, ברירת מחדל NotReady |
סוכנים סטנדרטיים שבהם השבתה קצרה של צומת בודד מקובלת |
| OnDelete | pod חדש מתחיל רק לאחר מחיקה ידנית של הישן | סוכנים קריטיים (eBPF, Falco) שבהם נדרשת שליטה מלאה בגרסה |
עבור אשכול של 200 צמתים, RollingUpdate עשוי לקחת שעות אם בדיקות הבריאות איטיות. במקרים כאלה, השתמשו ב-maxUnavailable: 1 כדי להאיץ.
איך להגביל DaemonSet לצמתים ספציפיים
לא כל סוכן נדרש על כל הצמתים. לדוגמה, מדדי GPU רק על צמתים עם מאיצים:
nodeSelector: accelerator: nvidia-tesla-k80 או דרך maxUnavailable: 10% ללוגיקה מורכבת: אזור, סוג instance, תווית מ-provisioner אוטומטי.
תצורת DaemonSet: מדריך שלב-אחר-שלב
- קבעו אילו צמתים צריכים להריץ את הסוכן: כל הצמתים או רק אלה עם תוויות ספציפיות.
- צרו את manifest של ה-DaemonSet: ציינו tolerations עבור control-plane וצמתים לא מוכנים, וכן priorityClassName.
- הגדירו updateStrategy: RollingUpdate עבור סוכנים רגילים, OnDelete עבור קריטיים.
- הוסיפו משאבים: requests ו-limits עבור CPU וזיכרון בהתבסס על עומס בדיקות.
- בדקו על אשכול staging: ודאו ש-pods מתחילים על כל צומת יעד.
- פרסו לייצור באמצעות GitOps (ArgoCD או Flux).
משאבים אופייניים לסוכנים:
| סוכן | בקשת CPU | בקשת זיכרון | מגבלת CPU | מגבלת זיכרון |
|---|---|---|---|---|
| Node Exporter | 100m | 200Mi | 500m | 500Mi |
| Fluent Bit | 200m | 300Mi | 1 | 1Gi |
| Falco | 500m | 1Gi | 2 | 2Gi |
מקרה בוחן: ביטול כתמים עיוורים בניטור
באשכול ייצור של אחד מלקוחותינו (150 צמתים), גילינו של-DaemonSet של Node Exporter חסרו tolerations עבור control-plane וצמתים לא מוכנים. זה גרם לפער של 30% במדדים במהלך תחזוקת צמתים ותקלות. לאחר שהוספנו tolerations נכונים ו-priorityClassName: system-node-critical, השגנו כיסוי של 100% מהצמתים והפחתנו את ה-MTTR משעות לדקות. השינוי חסך ללקוח כ-$10,000 בחודש בעלויות תפעול על ידי מניעת אובדן כיסוי ניטור והפחתת זמן תגובה לתקריות.
מה כלול בהקמת DaemonSet סוהר
אנו מספקים:
- ביקורת על מצב האשכול הנוכחי וזיהוי סוכנים שרצים בצורה לא נכונה (ללא tolerations, עם עדיפות נמוכה).
- פיתוח manifests של DaemonSet עבור המחסנית שלכם: Node Exporter, Fluent Bit, Falco, תוספי CNI, סוכני eBPF מותאמים אישית.
- תצורה של
nodeSelector: accelerator: nvidia-tesla-k80ו-nodeAffinityתוך התחשבות ב-SLA של השירותים שלכם. - אינטגרציה עם מחסנית הניטור הקיימת (Prometheus, Thanos, Grafana).
- תיעוד ו-runbook להחלפה מהירה של סוכנים ללא אובדן נתונים.
- הדרכת צוות: איך לעדכן DaemonSet, איך לאבחן בעיות.
למה להפקיד את ההקמה בידי אנשי מקצוע?
אנחנו צוות של מהנדסי DevOps עם ניסיון של 10+ שנים באשכולות ייצור (AWS EKS, GCP GKE, Yandex Cloud, bare-metal). השלמנו מעל 100 פרויקטים בהגירה, אופטימיזציה ותמיכה ב-Kubernetes. DaemonSet הוא פרט בסיסי אך קריטי שאנו מגדירים תוך התחשבות בתשתית, בתקציב ובלוח הזמנים שלכם. צרו קשר להערכה ראשונית של הפרויקט שלכם — קבלו ייעוץ על אופטימיזציה של DaemonSet.
לוח זמנים ותמחור
פריסה של סוכן סטנדרטי (Node Exporter, Fluent Bit) עם tolerations ומשאבים נכונים: כמה שעות, החל מ-$1,500. תצורה של מספר סוכנים עם nodeSelector שונים, עדיפויות ואינטגרציה: יום אחד, החל מ-$2,500. הזמינו תצורה — נציע את הפתרון האופטימלי עבור האשכול שלכם.
משאבים נוספים
- DaemonSet — תיעוד רשמי של Kubernetes.
- Node Exporter — מדריך התקנה.







