הגדרת Kubernetes Cluster Autoscaler (אוטוסקיילינג של צמתים)

כאשר פודים ב-Kubernetes נשארים במצב Pending ומכונות חדשות אינן מתווספות, העסק מאבד זמן וכסף. אנו מגדירים את Cluster Autoscaler ו-Node Autoscaling כך שהתשתית מגיבה אוטומטית לגידול בעומס. הצוות שלנו מטפל בכל המחזור—מאבחון ועד הטמעה ותמיכה שוטפת, תוך הבטחת פעילות יציבה של הקלאסטר.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הגדרת Kubernetes Cluster Autoscaler (אוטוסקיילינג של צמתים)

לאחר פריסת קלאסטר Kubernetes עם HPA, אתה מבחין ש-pods מתקשמים אך לא מתווספים צמתים חדשים. יומני Cluster Autoscaler שקטים, ו-pods נתקעים במצב Pending. מקרה טיפוסי: בפרויקט אחד, לקוח איבד 3 שעות של זמינות ייצור עקב הגדרת CA שגויה. אנחנו פותרים בעיות כאלה באופן קבוע — 5 שנות ניסיון עם k8s על 30+ פרויקטים. Cluster Autoscaler (CA) הופך את קנה המידה של הצמתים לאוטומטי: הוא מוסיף משאבי מחשוב כאשר pods לא יכולים להיות מתוזמנים עקב מחסור ב-CPU או בזיכרון, ומסיר צמתים כאשר העומס יורד. אבל ההתנהגות שלו תלויה מאוד בהגדרות ספק הענן ובמדיניות ה-scheduler.

CA עובד ברמת הצומת: הוא מוסיף ומסיר צמתים בהתבסס על pods ממתינים עקב מחסור במשאבים. בשילוב עם HPA או KEDA, זהו מחזור מלא: עומס גדל → HPA מוסיף pods → pods לא נכנסים → CA מוסיף צומת → pods מתחילים. במציאות, התהליך נשבר לעתים קרובות עקב הגדרות עדינות.

מדוע צמתים חדשים לא מופיעים?

התרחיש הנפוץ ביותר: CA מוגדר, pods נמצאים במצב Pending, אך צמתים לא מתווספים. הפקודה Pending תראה את הסיבה המדויקת. סיבות טיפוסיות:

  • ה-pod לא ניתן לתזמון לא בגלל משאבים, אלא בגלל affinity/taints. לדוגמה, אם pod משתמש ב-kubectl describe pod <pending-pod> ולמאגר אין מופעי GPU, CA לא יכול לעזור — הוא יוצר צמתים רק מקבוצות צמתים קיימות.
  • PodDisruptionBudget (PDB) חוסם קנה מידה מטה. CA מנסה להסיר צומת על ידי פינוי pods, אך PDB מונע פינוי. הצומת נשאר, ואין חיסכון במשאבים.
  • קנה מידה מטה חסום על ידי pods מערכתיים. CA לא מסיר צמתים עם pods חסרי PDB, pods עצמאיים, pods עם annotation nodeSelector: gpu: "true" או נפחי cluster-autoscaler.kubernetes.io/safe-to-evict: "false". לאבחון, השתמש ב-hostPath.
דוגמת אבחון
kubectl get pods --field-selector=status.phase=Pending kubectl describe pod pending-pod-name 

שים לב לאירועים ולתנאים. אם הסיבה היא kubectl describe node <node> | grep -A5 "Annotations", CA אמור לפעול.

כיצד Cluster Autoscaler מתקשר עם HPA?

HPA מגדיל את מספר ה-pods תחת עומס. כאשר משאבי הצומת הנוכחיים מנוצלים, pods חדשים עוברים למצב kubectl get pods --field-selector=status.phase=Pending kubectl describe pod pending-pod-name , ו-CA מוסיף צומת. חשוב להגדיר עיכובים: 0/1 nodes are available: 1 Insufficient cpu מונע מ-CA להסיר צומת מיד לאחר הופעתו, ו-Pending קובע זמן סרק לפני הסרה. זה מונע תנודות בזמני עומס שיא. לפי הנתונים שלנו, עיכובים נכונים מפחיתים קנה מידה מיותר ב-40%.

תצורה עבור ספקי ענן

AWS (EKS)

---
command:
  - ./cluster-autoscaler
    - --v=4
    - --stderrthreshold=info
    - --cloud-provider=aws
    - --skip-nodes-with-local-storage=false
    - --expander=least-waste
    - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster
    - --balance-similar-node-groups
    - --scale-down-delay-after-add=10m
    - --scale-down-unneeded-time=10m
---

--scale-down-delay-after-add=10m בוחר את קבוצת הצמתים שמנצלת ביעילות את משאבי הצומת החדש. חלופות: --scale-down-unneeded-time=10m, command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster - --balance-similar-node-groups - --scale-down-delay-after-add=10m - --scale-down-unneeded-time=10m , --expander=least-waste (עם עדיפויות קבוצת צמתים מוגדרות במפורש).

random מאזן צמתים בין קבוצות דומות — חשוב לפריסה מרובת אזורי זמינות כדי לפזר צמתים על פני אזורי זמינות.

GKE (Standard)

ב-GKE, Cluster Autoscaler מנוהל דרך most-pods בעת יצירת מאגר צמתים:

gcloud container node-pools create general \
  --cluster=my-cluster \
  --enable-autoscaling \
  --min-nodes=1 \
  --max-nodes=20 \
  --machine-type=n2-standard-4

ב-bare metal או בקלאסטרים של kubeadm, CA עובד רק אם קיים API לניהול צמתים — לדוגמה, דרך cloud-controller-manager או ספק מותאם אישית.

מתי לבחור ב-Karpenter במקום Cluster Autoscaler?

ב-AWS, Karpenter הוא פתרון גמיש יותר. הוא לא קשור לקבוצות Auto Scaling שנוצרו מראש: הוא בוחר את סוג המופע בהתבסס על דרישות ה-pod ומספק אותו דרך EC2 API. ההבדל: CA מוסיף צומת ממאגר צמתים קבוע עם סוג מופע ספציפי, בעוד Karpenter מסתכל על הבקשות של כל ה-pods הממתינים ובוחר את הסוג הזול ביותר המתאים — יכול להיות priority או --balance-similar-node-groups. מופעי Spot נתמכים באופן טבעי.

Karpenter gcloud:

---
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: general
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot", "on-demand"]
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
      limits:
        cpu: 1000
  disruption:
    consolidationPolicy: WhenUnderutilized
    consolidateAfter: 1m

gcloud container node-pools create general \ --cluster=my-cluster \ --enable-autoscaling \ --min-nodes=1 \ --max-nodes=20 \ --machine-type=n2-standard-4 — Karpenter ממזג באופן אגרסיבי: אם צמתים לא מנוצלים, הוא מעביר pods ומסיר צמתים מיותרים. זה מפחית עלויות AWS ב-30-50% לפי ההערכות שלנו. Karpenter מגיב מהר יותר לשינויים: המיזוג מתרחש תוך דקה, לא תוך 10 דקות כמו עם CA.

השוואה בין Cluster Autoscaler ל-Karpenter

פרמטר Cluster Autoscaler Karpenter
סוגי מופעים קבוע מ-ASG בחירה דינמית
מופעי Spot דרך ASG תמיכה טבעית
מיזוג בסיסי אגרסיבי (דקה)
תצורה דגלי CA משאב מותאם אישית
ספקים AWS, GCP, Azure AWS (כרגע)

פרמטרי עיכוב טיפוסיים של CA

פרמטר ערך ברירת מחדל מומלץ תיאור
requests 10 דקות 10 דקות עיכוב לאחר הוספת צומת לפני הסרה אפשרית
m5.large 0 שניות 10 שניות עיכוב לאחר מחיקת צומת
c6i.2xlarge 3 דקות 3 דקות עיכוב לאחר קנה מידה שנכשל
NodePool 10 דקות 5-10 דקות זמן סרק של צומת לפני הסרה

כיצד לאבחן בעיות קנה מידה?

  1. בדוק את מצב CA: apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: general spec: template: spec: requirements: - key: karpenter.sh/capacity-type operator: In values: ["spot", "on-demand"] - key: kubernetes.io/arch operator: In values: ["amd64"] limits: cpu: 1000 disruption: consolidationPolicy: WhenUnderutilized consolidateAfter: 1m .
  2. צפה ביומנים: consolidateAfter: 1m.
  3. ודא ש-metrics-server פועל: scale-down-delay-after-add.
  4. ודא של-pods יש בקשות: CA לא מגדיל pods ללא בקשות.
  5. השתמש ב-scale-down-delay-after-delete לניתוח אירועים.

מה כוללת העבודה שלנו

  • ביקורת על תצורת הקלאסטר והעומס הנוכחיים.
  • בחירת אסטרטגיה: CA או Karpenter.
  • הגדרת CA עם expander מתאים, עיכובים, איזון.
  • הגדרת PDB עבור pods מערכתיים.
  • אינטגרציה עם ניטור (Prometheus+Grafana).
  • תיעוד תפעולי ו-runbook.

לוחות זמנים ועלות

הגדרת CA בסיסית עבור ספק ענן אחד עם פרמטרים סטנדרטיים — מיום אחד. הגדרה מלאה עם ריבוי אזורי זמינות, PDB, ניטור — מיום עד 3 ימים. מעבר ל-Karpenter — מיומיים. העלות מחושבת באופן אישי לאחר ביקורת. בפנייתך אלינו, אתה מקבל אחריות לפעולה נכונה של Cluster Autoscaler בייצור. צור קשר להערכת פרויקט — נעזור לייעל את עלויות משאבי הענן.

המהנדסים שלנו מביאים 5+ שנות ניסיון עם Kubernetes, מעל 30 פרויקטים מוצלחים של אוטומציית תשתית. הגדרת CA נכונה חוסכת בין $500 ל-$3,000 בחודש בהתאם להיקף.

ניטור

מדדי CA ב-Prometheus: scale-down-delay-after-failure, scale-down-unneeded-time, kubectl get pods -n kube-system | grep cluster-autoscaler. התראה על kubectl logs -n kube-system deployment/cluster-autoscaler --tail=50 — סימן ש-CA לא יכול להגדיל עקב שגיאות API של ספק הענן. הגדר לוח מחוונים של Grafana להמחשת מגמות.

מקור: תיעוד רשמי של Cluster Autoscaler ב-GitHub