התאמה לעומס (scaling) של אשכולות משתמשים

כדי לשנות את גודל עומסי העבודה ב-GKE ב-AWS, אתם יכולים להגדיר את ה-AWSNodePools כך שהגודל שלהם ישתנה אוטומטית, או ליצור ולמחוק AWSNodePools באופן ידני כדי להגדיל או להקטין את הגודל.

Cluster Autoscaler

‫GKE ב-AWS מטמיע את המידרוג האוטומטי של אשכולות ב-Kubernetes. כשהביקוש לצמתים גבוה, Cluster Autoscaler מוסיף צמתים למאגר הצמתים. כשהביקוש נמוך, Cluster Autoscaler מצמצם את גודל האשכול לגודל מינימלי שאתם מגדירים. כך תוכלו להגדיל את הזמינות של עומסי העבודה כשאתם צריכים אותם, תוך שליטה בעלויות.

סקירה כללית

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

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

איך פועל המידרוג האוטומטי של האשכול

מידרוג אוטומטי של אשכול פועל על בסיס מאגר צמתים. כשיוצרים מאגר צמתים, מציינים גודל מינימלי ומקסימלי למאגר הצמתים במשאב Kubernetes‏ AWSNodePool.

כדי להשבית את המידרוג האוטומטי באשכול, צריך להגדיר את spec.minNodeCount לערך spec.maxNodeCount ב-AWSNodePools.

הכלי Cluster Autoscaler מגדיל או מקטין את הגודל של מאגר הצמתים באופן אוטומטי, על סמך בקשות המשאבים (ולא על סמך ניצול המשאבים בפועל) של ה-Pods שפועלים בצמתים של מאגר הצמתים הזה. הוא בודק מעת לעת את הסטטוס של ה-Pods והצמתים, ופועל בהתאם:

אם אי אפשר לתזמן את הפודים כי אין מספיק צמתים במאגר הצמתים, Cluster Autoscaler מוסיף צמתים עד לגודל המקסימלי של מאגר הצמתים. אם הצמתים לא מנוצלים מספיק, ואפשר לתזמן את כל ה-Pods גם עם פחות צמתים במאגר הצמתים, Cluster Autoscaler מסיר צמתים, עד לגודל המינימלי של מאגר הצמתים. אם אי אפשר לנקז את הצומת בצורה תקינה אחרי תקופת המתנה (10 דקות), הצומת מסתיים בכפייה. אי אפשר להגדיר את תקופת החסד.

אם ה-Pods שלכם ביקשו מעט מדי משאבים (לדוגמה, אם ערכי ברירת המחדל לא מספיקים), Cluster Autoscaler לא יתקן את המצב. כדי לוודא שהמידרוג האוטומטי של האשכול פועל בצורה מדויקת ככל האפשר, מומלץ ליצור בקשות מתאימות למשאבים לכל עומסי העבודה.

קריטריונים להפעלה

ההנחות הבאות מבוססות על המידרוג האוטומטי של האשכול כשמשנים את הגודל של מאגר צמתים:

  • אפשר להפעיל מחדש את כל ה-Pods המשוכפלים בצומת אחר, מה שעשוי לגרום לשיבוש קצר. אם השירותים שלכם לא יכולים לסבול שיבושים, לא מומלץ להשתמש ב-Cluster Autoscaler.

  • לכל הצמתים במאגר צמתים יחיד יש את אותו סט של תוויות.

  • אם יש לכם AWSNodePools עם סוגים שונים של מופעים, Cluster Autoscaler לוקח בחשבון את העלות היחסית של הפעלת צמתים חדשים ומנסה להרחיב את מאגר הצמתים הכי זול.

  • תוויות שנוספו ידנית אחרי היצירה הראשונית של אשכול או מאגר צמתים לא נכללות במעקב. לצמתים שנוצרו על ידי Cluster Autoscaler מוקצות תוויות שצוינו באמצעות ‎--node-labels בזמן יצירת מאגר הצמתים.

שינוי הגודל של מאגר צמתים

AWSNodePool כולל את השדות minNodeCount ו-maxNodeCount. בשדות האלה מצהירים על מספר מינימלי ומספר מקסימלי של צמתי עובדים במאגר. אפשר לערוך את הערכים האלה לפני או אחרי שיוצרים את ה-AWSNodePool.

לפני שמתחילים

מפעילים אשכול באמצעות ההוראות במאמר יצירת אשכול משתמשים. קובץ ה-YAML (לדוגמה, cluster-0.yaml) שיוצר את האשכול זמין.

הפעלת שינוי גודל אוטומטי של מאגר צמתים

  1. בספרייה של anthos-aws, משתמשים ב-anthos-gke כדי להעביר את ההקשר לשירות הניהול.

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. כדי להפעיל את המידרוג האוטומטי של האשכול, עורכים את המניפסט של ה-AWSNodePool. עורכים את הקובץ cluster-0.yaml ומחפשים את הקטע AWSNodePool. משנים את הערכים של spec.minNodeCount ושל spec.maxNodeCount.

    בדוגמה שלמטה, הגודל המינימלי של מאגר הצמתים הזה הוא 3 צמתים, אבל מופעלת התכונה 'מידרוג אוטומטי של אשכולות' כדי להגדיל את הגודל ל-10 צמתים.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: cluster-0-pool-0
    spec:
      clusterName: cluster-0
      version: 1.25.5-gke.2100
      minNodeCount: 3
      maxNodeCount: 10
      ...
    
  3. בשלב הבא, מחילים את קובץ ה-YAML כדי לשנות את הגודל של מאגר הצמתים.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl apply -f cluster-0.yaml
    
  4. המשאב AWSNodePool יעבור למצב Resizing. כשהשינוי של גודל ה-AWSNodePool מסתיים, הוא עובר למצב Provisioned.

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl get AWSNodePools
    

    הפלט מראה שה-AWSNodePool הוא Resizing. פעולות שינוי הגודל נמשכות כמה דקות.

    NAME               CLUSTER     STATE     AGE   VERSION
    cluster-0-pool-0   cluster-0   Resizing  3h    1.25.5-gke.2100
    

יצירה ידנית של AWSNodePool חדש

אפשר גם להגדיל את האשכול על ידי יצירת AWSNodePools חדשים. כשיוצרים AWSNodePool חדש, אפשר גם להגדיל או להקטין את גודלי המופעים.

  1. אפשר לאחזר את מניפסט ההגדרה של AWSNodePool קיים באמצעות kubectl get.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. עורכים את new_nodepool.yaml ומסירים את הקטעים שלא מופיעים בדוגמה הבאה. שומרים את הקובץ.

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional 
    
  3. כדי ליצור AWSNodePool חדש, מחילים את המניפסט על אשכול הניהול.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f new_nodepool.yaml
    

המאמרים הבאים

פריסת שירות שמגובה על ידי Ingress.

אפשרויות נוספות מפורטות במאמרי העזרה בנושא AWSNodePool.