התאמה אופקית של קבוצות Pod לעומס מאפשרת לכם לשנות באופן אוטומטי את מספר קבוצות ה-Pod שפועלות בעומסי עבודה קיימים ללא שמירת מצב (stateless) באשכול, על סמך הביקוש בזמן אמת. הכלי להגדלת קנה מידה באופן אוטומטי מוסיף Pods כשהעומס גדל ומסיר אותם כשהביקוש יורד. כך אפשר לשמור על זמינות האפליקציה, להשתמש במשאבים ביעילות ולשלוט בעלויות בלי התערבות ידנית. אפשר לשנות את קנה המידה על סמך מדדי משאבים סטנדרטיים, כמו ניצול המעבד (CPU), או על סמך מדדי אפליקציות בהתאמה אישית מ-Prometheus, כמו קצבי בקשות HTTP.
שינוי קנה המידה של פריסה
משתמשים בפונקציונליות של שינוי קנה המידה ב-Kubernetes כדי לשנות את כמות ה-Pods שפועלים בפריסה.
התאמה אוטומטית לעומס של ה-Pods ב-Deployment
ב-Kubernetes יש התאמה אוטומטית לעומס, כך שלא צריך לעדכן ידנית את הפריסה כשהביקוש משתנה. השלם את השלבים הבאים כדי להתאים אוטומטית לעומס (autoscale) את ה-Pods של ה-Deployment (פריסה):
כדי לוודא שה-Horizontal Pod Autoscaler יכול למדוד כראוי את אחוז המעבד (CPU), מגדירים את בקשת משאב המעבד (CPU) בפריסה.
מגדירים את ה-Horizontal Pod Autoscaler (HPA) בפריסה:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE \ autoscale deployment DEPLOYMENT_NAME \ --cpu-percent=CPU_PERCENT \ --min=MIN_NUMBER_REPLICAS \ --max=MAX_NUMBER_REPLICASמחליפים את מה שכתוב בשדות הבאים:
CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול.
NAMESPACE: מרחב השמות. באשכולות משותפים, צריך להשתמש במרחב שמות של פרויקט. באשכולות רגילים, אפשר להשתמש בכל מרחב שמות.
DEPLOYMENT_NAME: שם הפריסה שרוצים להתאים אוטומטית לעומס.
CPU_PERCENT: היעד הממוצע של ניצול המעבד (CPU) שצריך לבקש, מיוצג באחוזים, בכל ה-pods.
MIN_NUMBER_REPLICAS: הגבול התחתון של מספר ה-Pods שהמידרוג האוטומטי יכול להקצות.
MAX_NUMBER_REPLICAS: הגבול העליון של מספר ה-Pod-ים שהמידרוג האוטומטי יכול להקצות.
בודקים את הסטטוס הנוכחי של ה-Horizontal Pod Autoscaler:
kubectl get hpaהפלט אמור להיראות כך:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE DEPLOYMENT_NAME Deployment/DEPLOYMENT_NAME/scale 0% / 50% 1 10 1 18s
שינוי ידני של קנה המידה של הפודים בפריסה
אם אתם מעדיפים לשנות את קנה המידה של פריסה באופן ידני, הריצו את הפקודה:
kubectl --kubeconfig CLUSTER_KUBECONFIG \
-n NAMESPACE \
scale deployment DEPLOYMENT_NAME \
--replicas NUMBER_OF_REPLICAS
מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_KUBECONFIG: קובץ ה-kubeconfig של האשכול.
NAMESPACE: מרחב השמות. באשכולות משותפים, צריך להשתמש במרחב שמות של פרויקט. באשכולות רגילים, אפשר להשתמש בכל מרחב שמות.
DEPLOYMENT_NAME: שם הפריסה שבה רוצים להגדיר התאמה אוטומטית לעומס.
DEPLOYMENT_NAME: מספר האובייקטים המשוכפלים שלPodבפריסה.
שימוש במדדים מותאמים אישית מ-Prometheus להתאמה לעומס (autoscaling)
כברירת מחדל, התאמה אופקית של קבוצות Pod לעומס משתמשת במדדי משאבים סטנדרטיים כמו ניצול מעבד (CPU) וזיכרון. מדדים סטנדרטיים מתאימים לשינוי קנה מידה כללי, אבל לא שימושיים לעומסים של אפליקציות מיוחדות.
כשמשתמשים בהתאמה אופקית של קבוצות Pod לעומס עם מדדים מותאמים אישית מ-Prometheus, אפשר לשנות את קנה המידה של עומסי העבודה על סמך מדדים ספציפיים לאפליקציה, כמו שיעורי בקשות HTTP, עומק התור וזמן האחזור של העיבוד. האשכול יכול להגיב בצורה מדויקת יותר לביקוש בעולם האמיתי, על ידי שימוש בנתונים העשירים שכבר נאספו על ידי מחסנית הניטור של Prometheus.
דרישות מוקדמות לשימוש ב-Prometheus עם התאמה אופקית של קבוצות Pod לעומס
כדי להפעיל את התכונה, התנאים הבאים חייבים להתקיים:
שרת Prometheus קיים: צריך לפרוס שרת Prometheus ולוודא שיש גישה לרשת מתוך האשכול (בקר ה-HPA לא מנהל את מכונת Prometheus עצמה). מידע נוסף זמין במאמר איך פורסים ומגדירים את Prometheus Operator ב-Kubernetes.
הרשאות אדמין: צריכות להיות לכם ההרשאות הנדרשות כדי לשנות את המשאב בהתאמה אישית של האשכול.
אין התנגשויות ב-API: בדיקה מקדימה מוודאת שאף רכיב אחר לא רשם כבר APIService עבור
custom.metrics.k8s.io. אם יש התנגשות, אי אפשר להפעיל את המתאם.
הפעלה והגדרה של Prometheus
התהליך כולל הגדרה של כללי מדדים ועדכון של הגדרות האשכול:
יוצרים ConfigMap אחד או יותר של כללי מדדים.
מגדירים את הכללים שמבוססים על PromQL למדדים המותאמים אישית באחד או יותר ConfigMaps במרחב השמות של אשכול היעד. הבקר עוקב אחרי ה-ConfigMaps האלה, ממזג אותם ומחיל אותם באופן אוטומטי על המתאם.
למידע נוסף על הגדרת כללים, ראו Metrics Discovery and Presentation Configuration ב-kubernetes-sigs/prometheus-adapter.
בדוגמה הבאה מוצג ConfigMap עם כללים שמוגדרים ל-
http_requests_per_secondבשדהdata:apiVersion: v1 kind: ConfigMap metadata: name: my-app-rules namespace: <cluster-namespace> data: config.yaml: | rules: - seriesQuery: 'http_requests_total' resources: overrides: namespace_name: {resource: "namespace"} pod_name: {resource: "pod"} name: matches: "^(.*)_total$" as: "${1}_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'אם שרת Prometheus דורש אימות, כמו אבטחה הדדית של שכבת התעבורה (mTLS), צריך ליצור סוד של Kubernetes בפורמט kubeconfig שמכיל את פרטי הכניסה הנדרשים.
בדוגמה הבאה מוצג סוד שתומך באימות בסיסי:
apiVersion: v1 kind: Secret metadata: name: prometheus-auth-secret namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: config: authentication-credentialsמעדכנים את המשאב המותאם אישית של האשכול:
מוסיפים את ההערה
preview.baremetal.cluster.gke.io/metrics-adapter: "true"ל-metadataשל המשאב המותאם אישית של האשכול.מוסיפים את הקטע
spec.metricsAdapterכדי להגדיר את כתובת ה-URL של Prometheus ולהפנות ל-ConfigMaps של הכללים.apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: <cluster-name> namespace: <cluster-namespace> annotations: preview.baremetal.cluster.gke.io/metrics-adapter: "true" spec: # ... other existing cluster configurations ... metricsAdapter: prometheus: url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" orgID: "production-environment" auth: configSecretRef: name: prometheus-auth-secret key: config # This is the key within the Secret's 'data' field rules: configMapKeyRefs: - name: my-app-rules key: config.yaml # This is the key within the ConfigMap's 'data' field # - name: base-system-rules # key: config.yamlאם במכונה של Prometheus לא נדרש אימות, אפשר להשמיט את הקטע
metricsAdapter.prometheus.authמהמפרט של האשכול.
מחילים את המשאב המותאם אישית המעודכן של האשכול.
הבקר פורס באופן אוטומטי את מתאם Prometheus במרחב השמות
kube-system.כדי להשתמש במדדים המותאמים אישית להתאמה אופקית של קבוצות Pod לעומס, יוצרים משאב HorizontalPodAutoscaler שמטרגט את המדדים המותאמים אישית שמוגדרים בשדות
rulesשל ConfigMaps.הדוגמה של ConfigMap משלב קודם הגדירה מדד מותאם אישית של
http_requests_per_second. כדי להשתמש במדד הזה, המשאב HorizontalPodAutoscaler צריך להיראות כמו בדוגמה הבאה:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <name> namespace: <namespace> spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: <workload-name> minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 10
השבתת Prometheus
כדי להשבית את השימוש ב-Prometheus עם התאמה אופקית של קבוצות Pod לעומס, מסירים את הקטע spec.metricsAdapter מהמשאב המותאם אישית של האשכול.