הגדרת 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 דקות | זמן סרק של צומת לפני הסרה |
כיצד לאבחן בעיות קנה מידה?
- בדוק את מצב 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. - צפה ביומנים:
consolidateAfter: 1m. - ודא ש-metrics-server פועל:
scale-down-delay-after-add. - ודא של-pods יש בקשות: CA לא מגדיל pods ללא בקשות.
- השתמש ב-
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







