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

בדף הזה מוסבר איך ליצור מאגר צמתים ב-GKE ב-AWS ואיך להתאים אישית את הגדרת הצמתים באמצעות קובץ הגדרה.

כדי ליצור מאגר צמתים, צריך לספק את המשאבים הבאים:

  • השם של אשכול AWS קיים שבו רוצים ליצור את מאגר הצמתים
  • פרופיל מכונה של IAM למכונות וירטואליות של מאגר צמתים
  • רשת משנה שבה יפעלו המכונות הווירטואליות של מאגר הצמתים

אם רוצים גישת SSH לצמתים, אפשר ליצור זוג מפתחות EC2.

הדף הזה מיועד לאדמינים ב-IT ולמפעילים שרוצים להגדיר, לנטר ולנהל תשתית ענן. מידע נוסף על תפקידים נפוצים ועל משימות לדוגמה שאנחנו מתייחסים אליהן ב Google Cloud תוכן, זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE.

יצירת מאגר צמתים רגיל

אחרי שהמשאבים האלה יהיו זמינים, תוכלו ליצור מאגר צמתים באמצעות הפקודה הבאה:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --instance-type INSTANCE_TYPE \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

מחליפים את מה שכתוב בשדות הבאים:

  • NODE_POOL_NAME: שם שבחרתם למאגר הצמתים
  • CLUSTER_NAME: השם של האשכול שאליו רוצים לצרף את מאגר הצמתים
  • INSTANCE_TYPE: סוג המכונה הרצוי ב-AWS עבור מאגר הצמתים הזה – לדוגמה, m5.large
  • ROOT_VOLUME_SIZE: הגודל הרצוי של נפח האחסון הבסיסי של כל צומת, בגיגה-בייט
  • NODEPOOL_PROFILE: פרופיל המופע של IAM למכונות וירטואליות במאגר הצמתים. לפרטים על עדכון פרופיל מופע IAM, אפשר לעיין במאמר עדכון פרופיל מופע AWS IAM.
  • NODE_VERSION: גרסת Kubernetes להתקנה בכל צומת במאגר הצמתים (לדוגמה, ‎1.34.1-gke.4700)
  • MIN_NODES: המספר המינימלי של צמתים שיכולים להיות במאגר הצמתים
  • MAX_NODES: המספר המקסימלי של הצמתים שמאגר הצמתים יכול להכיל
  • MAX_PODS_PER_NODE: המספר המקסימלי של פודים שאפשר ליצור בכל צומת יחיד במאגר
  • GOOGLE_CLOUD_LOCATION: השם של Google Cloud המיקום שממנו ינוהל מאגר הצמתים הזה
  • NODEPOOL_SUBNET: המזהה של רשת המשנה שבה יפעל מאגר הצמתים.
    • לא יכול להיות חפיפה בין טווחי כתובות ה-IP של ה-Pod או השירות של האשכול לבין רשת המשנה של מאגר הצמתים. מידע נוסף על בחירת טווחי כתובות IP של Pod ושל שירות לאשכול זמין במאמר בחירת טווחי CIDR לאשכול
    • אם רשת המשנה הזו נמצאת מחוץ לבלוק ה-CIDR הראשי של ה-VPC, צריך לבצע כמה שלבים נוספים. מידע נוסף זמין במאמר בנושא קבוצות אבטחה.
  • SSH_KEY_PAIR_NAME: השם של זוג מפתחות ה-SSH ב-AWS שנוצר לגישת SSH (אופציונלי)
  • CONFIG_KMS_KEY_ARN: שם משאב Amazon‏ (ARN) של מפתח AWS KMS שמצפין את נתוני המשתמש

אם הפרמטר --tags קיים, התג שצוין יוחל על כל הצמתים במאגר הצמתים. בדוגמה הזו, כל הצמתים במאגר מתויגים בשמות של האשכול ומאגר הצמתים שאליהם הצומת שייך.

התאמה אישית של הגדרות המערכת של הצומת

יש כמה שיטות להתאמה אישית של הגדרות הצומת. לדוגמה, אתם יכולים לציין פרמטרים כמו מגבלת ה-CPU של ה-Pod כשאתם יוצרים מאגר צמתים.

אתם יכולים להשתמש בהגדרות של מערכת צמתים כדי לציין הגדרות בהתאמה אישית לסוכן הצמתים של Kubernetes ‏(kubelet) ולתצורות של ליבת Linux ברמה נמוכה (sysctl) במאגרי הצמתים.

הגדרת הסוכן kubelet

כדי להתאים אישית את תצורת הצומת באמצעות kubelet, משתמשים ב-Google Cloud CLI או ב-Terraform.

gcloud

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

  gcloud container aws node-pools create POOL_NAME \
       --cluster CLUSTER_NAME \
       --location=LOCATION \
       --kubelet_config_cpu_manager_policy=static

מחליפים את מה שכתוב בשדות הבאים:

  • POOL_NAME: השם של מאגר הצמתים.
  • CLUSTER_NAME: שם האשכול שאליו רוצים להוסיף מאגר צמתים.
  • LOCATION: אזור המחשוב או האזור של האשכול.

רשימה מלאה של השדות שאפשר להוסיף לפקודה הקודמת מופיעה במאמר אפשרויות ההגדרה של Kubelet.

Terraform

מידע נוסף על Terraform בסביבת AWS זמין במאמר בנושא מאגר צמתים של Terraform.

  1. מגדירים את המשתנים של Terraform על ידי הוספת הבלוק הבא לקובץ variables.tf:

    variable "node_pool_kubelet_config_cpu_manager" {
      default     = "none"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota" {
      default     = "true"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota_period" {
      default     = "100ms"
    }
    
    variable "node_pool_kubelet_config_pod_pids_limit" {
      default     = -1
    }
    
  2. מוסיפים את הבלוק הבא להגדרות של Terraform:

    resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" {
     provider           = google
     cluster            = CLUSTER_NAME
     name               = POOL_NAME
     subnet_id          = SUBNET_ID
     version            = CLUSTER_VERSION
     location           = CLUSTER_LOCATION
    
     kubelet_config {
       cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager
       cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota
       cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period
       pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit
     }
    }
    

    מחליפים את מה שכתוב בשדות הבאים:

    • NODE_POOL_RESOURCE_NAME: השם של משאב מאגר הצמתים בתבנית Terraform.
    • CLUSTER_NAME: השם של האשכול הקיים.
    • POOL_NAME: השם של מאגר הצמתים שרוצים להתאים אישית.
    • SUBNET_ID: תת-הרשת שהוקצתה למאגר הצמתים.
    • CLUSTER_VERSION: הגרסה של מישור הבקרה והצמתים של אשכול GKE ב-AWS.
    • CLUSTER_LOCATION: האזור או התחום של Compute Engine שבו נמצא האשכול.

הגדרת כלי השירות sysctl

כדי להתאים אישית את הגדרות המערכת של הצומת באמצעות sysctl, שולחים בקשת POST אל ה-method‏ awsClusters.awsNodePools.create. בקשת ה-POST הזו יוצרת מאגר צמתים עם ההתאמות האישיות שציינתם. בדוגמה הבאה, הפרמטרים busy_poll ו-busy_read מוגדרים ל-5,000 מיקרו-שניות כל אחד:

POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools

{
    "name": NODE_POOL_NAME,
    "version": CLUSTER_VERSION,
    "config": {
        "linuxNodeConfig": {
            "sysctls": {
                "net.core.busy_poll": "5000",
                "net.core.busy_read": "5000",
            }
        }
    }
}

מחליפים את מה שכתוב בשדות הבאים:

  • ENDPOINT: נקודת הקצה של השירות ב- Google Cloud .
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • GOOGLE_CLOUD_LOCATION: Google Cloud המיקום של האשכול.
  • CLUSTER_NAME: שם האשכול שאליו רוצים להוסיף מאגר צמתים.
  • NODE_POOL_NAME: השם של מאגר הצמתים.
  • CLUSTER_VERSION: מספר הגרסה של האשכול, לדוגמה, 1.31.0-gke.500.

הרשימה המלאה של צמדי מפתח-ערך שאפשר להוסיף לבקשת ה-JSON שלמעלה זמינה באפשרויות ההגדרה של Sysctl.

אפשרויות ההגדרה של סוכן kubelet

בטבלה הבאה מוצגות האפשרויות של kubelet שאפשר לשנות.

הגדרות התצורה של Kubelet הגבלות הגדרת ברירת המחדל תיאור
kubelet_config_cpu_manager_policy הערך חייב להיות none או static "none" ההגדרה הזו קובעת את מדיניות ניהול המעבד של kubelet. ערך ברירת המחדל הוא none, שהוא סכמת זיקת המעבד שמוגדרת כברירת מחדל, ולא מספקת זיקה מעבר למה שתזמן מערכת ההפעלה עושה באופן אוטומטי.

הגדרת הערך הזה ל-static מאפשרת להקצות שימוש בלעדי במעבדים ל-Pods בכיתת QoS מובטחת עם בקשות CPU של מספרים שלמים.
kubelet_config_cpu_cfs_quota הערך חייב להיות true או false true ההגדרה הזו אוכפת את מגבלת המעבד של ה-Pod. אם מגדירים את הערך הזה ל-false, המערכת מתעלמת ממגבלות השימוש במעבד עבור ה-Pods.

יכול להיות שתרצו להתעלם ממגבלות CPU בתרחישים מסוימים שבהם רכיבי Pod רגישים למגבלות CPU. הסיכון בהשבתת cpuCFSQuota הוא ש-Pod לא מורשה עלול לצרוך יותר משאבי CPU מהמתוכנן.
kubelet_config_cpu_cfs_quota_period הערך חייב להיות משך זמן "100ms" ההגדרה הזו קובעת את הערך של תקופת המכסה של CFS במעבד, cpu.cfs_period_us, שמציין את התקופה שבה צריך להקצות מחדש את הגישה של cgroup למשאבי המעבד. האפשרות הזו מאפשרת לכם לשנות את התנהגות ויסות הנתונים (throttle) של יחידת העיבוד המרכזית (CPU).
kubelet_config_pod_pids_limit הערך צריך להיות בין 1024 ל-4194304 -1 ההגדרה הזו קובעת את המספר המקסימלי של מזהי תהליכים (PIDs) שכל Pod יכול להשתמש בהם. אם הערך מוגדר כברירת המחדל, המגבלה של מזהי התהליך משתנה אוטומטית בהתאם לגודל המכונה הבסיסית.

אפשרויות ההגדרה של כלי השירות sysctl

כדי לשפר את הביצועים של המערכת, אפשר לשנות את המאפיינים הבאים:

מאגרי צמתים של מכונות Spot

‫GKE ב-AWS תומך במאגרי צמתים של AWS spot instance כגרסת Preview. מאגרי צמתים של מכונות Spot הם מאגרים של מכונות Spot של Amazon EC2 שזמינות ב-AWS בעלות נמוכה יותר.

שימוש במופעי Spot יכול להוביל לחיסכון בעלויות של אפליקציות גמישות, עמידות בכשלים וחסרות מצב. עם זאת, הם לא מתאימים לעומסי עבודה (workload) לא גמישים, מבוססי מצב, לא סובלניים לתקלות או עם צימוד הדוק בין צמתי מופעים. יכול להיות ש-Amazon EC2 יפריעו למכונות Spot אם הם יצטרכו את הקיבולת בחזרה, ולכן הן כפופות לתנודות בשוק Spot. אם עומסי העבודה שלכם דורשים קיבולת מובטחת ולא יכולים לסבול תקופות של חוסר זמינות מדי פעם, כדאי לבחור במאגר צמתים רגיל במקום במאגר צמתים של מופעים זמניים.

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

יצירת מאגר צמתים מסוג Spot

כדי ליצור מאגר צמתים של Spot Instance, מריצים את הפקודה הבאה:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --spot-instance-types INSTANCE_TYPE_LIST \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

מחליפים את מה שכתוב בשדות הבאים:

  • NODE_POOL_NAME: השם שרוצים להקצות למאגר הצמתים הזה.
  • CLUSTER_NAME: שם האשכול שאליו רוצים לצרף את מאגר הצמתים הזה.
  • INSTANCE_TYPE_LIST: רשימה מופרדת בפסיקים של סוגי מכונות AWS EC2. מאגר הצמתים מספק מכונות Spot עם סוגי המכונות האלה. סוגי המופעים צריכים להיות בעלי ארכיטקטורת CPU זהה, מספר CPU זהה וכמות זיכרון זהה. לדוגמה: ‎"c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium". אפשר להשתמש בכלי Amazon EC2 Instance Selector כדי למצוא סוגי מכונות עם הגדרות זהות של יחידת העיבוד המרכזית (CPU) וזיכרון.
  • ROOT_VOLUME_SIZE: הגודל הרצוי של נפח האחסון הבסיסי של כל צומת, בגיגה-בייט
  • NODEPOOL_PROFILE: פרופיל מופע IAM למכונות וירטואליות במאגר הצמתים
  • NODE_VERSION: גרסת Kubernetes להתקנה בכל צומת במאגר הצמתים (לדוגמה, ‎1.34.1-gke.4700)
  • MIN_NODES: המספר המינימלי של צמתים שיכולים להיות במאגר הצמתים
  • MAX_NODES: המספר המקסימלי של הצמתים שמאגר הצמתים יכול להכיל
  • MAX_PODS_PER_NODE: המספר המקסימלי של פודים שאפשר ליצור בכל צומת יחיד במאגר
  • GOOGLE_CLOUD_LOCATION: השם של Google Cloud המיקום שממנו ינוהל מאגר הצמתים הזה
  • NODEPOOL_SUBNET: המזהה של רשת המשנה שבה יפעל מאגר הצמתים.
    • לא יכול להיות חפיפה בין טווחי כתובות ה-IP של ה-Pod או השירות של האשכול לבין רשת המשנה של מאגר הצמתים. מידע נוסף על בחירת טווחי כתובות IP של Pod ושל שירות לאשכול זמין במאמר בחירת טווחי CIDR לאשכול
    • אם רשת המשנה הזו נמצאת מחוץ לבלוק ה-CIDR הראשי של ה-VPC, צריך לבצע כמה שלבים נוספים. מידע נוסף זמין במאמר בנושא קבוצות אבטחה.
  • SSH_KEY_PAIR_NAME: השם של זוג מפתחות ה-SSH ב-AWS שנוצר לגישת SSH (אופציונלי)
  • CONFIG_KMS_KEY_ARN: שם משאב Amazon‏ (ARN) של מפתח AWS KMS שמצפין את נתוני המשתמש

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

שימו לב: השדה spot-instance-types לא יכול להתקיים בו-זמנית עם השדה instance-type. המשמעות היא שאפשר לספק רק אחד מהשדות האלה ולא את שניהם.