ניהול מגבלות של מזהי תהליכים

סקירה כללית

הגבלה של מזהה תהליך (PID) היא הגבלת משאבים ב-Kubernetes על צמתים וקבוצות Pod, שמטרתה למנוע יצירה מוגזמת של תהליכים, שעלולה להשפיע על יציבות הצומת. ‫Apigee Hybrid תומך בתכונה של Kubernetes להגדרת מגבלות על מזהי תהליכים. במסמך הזה מוסבר איך להגדיר את המגבלות האלה, ומופיעות בו המלצות לערכים של שירותי Apigee בפלטפורמות ספציפיות.

כשמשתמשי Apigee hybrid מנהלים את האשכולות שלהם, הגדרת מגבלות PID ב-Kubernetes יכולה לשפר את יציבות המערכת, האבטחה וניהול המשאבים. ההתנהגות הזו עולה בקנה אחד עם השיטות המומלצות לשימוש ב-Kubernetes.

הגדרות של מגבלות על מזהי תהליכים

מגבלות מזהי התהליכים כוללות מגבלות מזהי תהליכים של צמתים ומגבלות מזהי תהליכים של פודים.

מגבלות ה-PID של הצומת כוללות את ה-PID שמור ל-Kube ואת ה-PID שמור למערכת. המספר הכולל של מזהי תהליכים (PID) שניתנים להקצאה הוא המקסימום של הליבה פחות מזהי התהליכים ששמורים ל-kube, פחות מזהי התהליכים ששמורים למערכת, פחות מזהי התהליכים של סף הפינוי:

מגבלות על מספרים מקסימליים של מזהים בליבה
‫
    - Kube reserved
‫
    - שמור למערכת
    - סף פינוי
‫= Allocatable
  • מגבלות על מזהה מקסימלי של ליבה: נקבעות על ידי מערכת ההפעלה והגדרות הליבה שלה. מכיוון ש-Apigee Hybrid פועל באופן בלעדי על ליבת Linux, במדריך הזה מוסבר על מגבלות מבוססות-Linux בצמתי Kubernetes. מספר מזהי התהליך המקסימלי לליבת לינוקס הוא 4,194,304.
  • ‫Kube-reserved ו-system-reserved: להזמנת משאבים עבור Kubernetes או עבור דמונים של מערכת ההפעלה.
  • סף ההוצאה: המגבלה שמציינת לחץ על הצומת. הצומת יסולק כשהסף יושג. פרטים נוספים מופיעים במאמר בנושא הסרה על סמך PID.
  • ניתן להקצאה: מספר מזהי התהליך שזמינים. מידע נוסף זמין במאמר Kubernetes: Node Allocatable. אפשר להגדיר את kube-reserved ואת system-reserved באמצעות הגדרות של מגבלת PID של הצומת.

אפשר להגדיר את מגבלת ה-PID של הפוד עבור הצומת ולשתף אותה בין כל הפודים בצומת.

הכנה לניהול של מגבלות מזהי התהליכים

בנהלים האלה נעשה שימוש במשתני הסביבה הבאים:

export PROJECT_ID=MY_PROJECT_ID
export CLUSTER_NAME=MY_CLUSTER_NAME
export LOCATION=MY_CLUSTER_LOCATION
export APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee

אימות הגישה

לפני שמגדירים את המגבלה של מזהה התהליך, צריך לוודא שיש לכם גישה לעריכת אשכולות Kubernetes.

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

  1. בודקים אם יש לכם את התפקידים roles/container.clusterAdmin במדיניות IAM:
    gcloud projects get-iam-policy ${PROJECT_ID}  \
     --flatten="bindings[].members" \
     --format='table(bindings.role)' \
     --filter="bindings.members:your_account_email"
    
  2. אם אין לכם גישה, אתם צריכים להוסיף את התפקיד לחשבון:
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
     --member user:your_account_email \
     --role roles/container.clusterAdmin

אימות מגבלות קיימות של PID

לפני שמגדירים מגבלות חדשות, צריך לבדוק אם יש מגבלות PID קיימות בצומת.

  1. מקבלים צומת מהאשכול כדי לבדוק ערכים. תצטרכו לבדוק צמתים ממאגרי הצמתים apigee-data ו-apigee-runtime:
    kubectl get nodes -n ${APIGEE_NAMESPACE}
    

    הפלט אמור להיראות כך:

    NAME                                      STATUS   ROLES    AGE    VERSION
    gke-my-hybrid-apigee-data-0a1b2c3d-efgh      Ready       2d8h   v1.31.5-gke.1169000
    gke-my-hybrid-apigee-runtime-1b2c3d4e-fghi   Ready       2d8h   v1.31.5-gke.1169000
    
  2. מייצאים את שם הצומת מהפלט של השלב הקודם. מריצים את השלב הבא קודם לצומת apigee-data ושוב לצומת apigee-runtime:

    קוד

    export NODE_NAME=MY_NODE_NAME
    

    דוגמה

    export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
    
  3. בודקים את מגבלות ה-PID של הצומת. משתמשים בפקודות הבאות כדי לבדוק את הערכים השמורים. אם הערך הוא null, הערך לא מוגדר:
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.kubeReserved'
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.systemReserved'
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.evictionHard'
    
  4. בודקים את מגבלת ה-PID של ה-pod. כדי לבדוק את מגבלת ה-PID הקיימת של ה-Pod, משתמשים בפקודה הבאה. אם הערך שמוחזר הוא -1 או ריק, המגבלה לא מוגדרת:
    kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.podPidsLimit'
    

ניהול המגבלות של מזהי התהליכים

ניהול המגבלות של מזהי התהליך (PID) של הצומת

במקרה של התקנות ב-GKE, משאבי התשתית של צמתי Kubernetes מנוהלים באופן פנימי, ולא צריך להגדיר אותם. אפשר לראות את הקיבולת הנוכחית ואת המשאבים שניתנים להקצאה במאמר משאבים שניתנים להקצאה לצומת במסמכי Google Kubernetes Engine.

בפלטפורמות שאינן GKE, אפשר לעיין במסמכי Kubernetes המתאימים לפלטפורמה. אם האשכול או הצומת מנוהלים על ידי המשתמש (בניגוד לניהול מלא), אפשר להגדיר את מגבלת ה-PID של kube-reserved ואת מגבלת ה-PID של system-reserved באמצעות Kubelet. מידע נוסף זמין במאמר Node PID limits (הגבלות על מספר ה-PID של הצומת) במאמרי העזרה של Kubernetes.

כלים

בפרוצדורה הזו נעשה שימוש ב-Kubelet כדי לנהל את המגבלה של מזהה התהליך. ‫Kubelet הוא הסוכן שפועל בתרמילים ובקונטיינרים, ומוודא שהם פועלים בהתאם ל-PodSpec שלהם. אם אתם צריכים להתקין את Kubelet, אתם יכולים לפעול לפי ההוראות במסמכי Kubernetes בנושא התקנה של kubeadm, ‏ kubelet ו-kubectl.

התהליך

  1. יוצרים קובץ תצורה של Kubelet בשם kubelet-config.yaml.
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    kubeReserved:
     pid: PID_VALUE # Example: 1000
    

    מידע נוסף על ההגדרות זמין במאמר Kube Reserved במאמרי העזרה של Kubernetes.

  2. מחילים את ההגדרה של Kubelet:
    kubelet --config PATH_TO_KUBELET_CONFIG_YAML
    

ניהול המגבלות על מזהי התהליך (PID) של ה-Pod

בחירת המגבלה

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

ב-GKE יש טווח חובה לערך: [1024, 4194304]. בפלטפורמות GKE אפשר לראות את הסטטוס של חשבונות השירות של Kubernetes ב Google Cloud console Metrics Explorer. בוחרים את המדדים Kubernetes Node - PID usage ומחילים מסננים. במדד הזה מוצג השימוש האחרון במזהי תהליכים, ואפשר להסתמך עליו כשבוחרים מגבלת PID.

Metrics Explorer

בפלטפורמות שאינן GKE, יכול להיות שיהיו זמינות אפשרויות שונות למעקב. כדי לבדוק את המדדים, אפשר לעיין במסמכי Kubernetes של הפלטפורמה המתאימה.

הדרישות לגבי מזהה התהליך (PID) של פודים ב-Apigee

‫Apigee Hybrid משתמש ב-2 מאגרי צמתים, apigee-data ו-apigee-runtime. חלק מרכיבי Apigee נפרסים בשני מאגרי הצמתים, ולכן מגבלת ה-PID של ה-Pod תהיה זהה בשני מאגרי הצמתים. גם מגבלת ה-PID של ה-Pod צריכה להיות גבוהה ממספר ה-PID המקסימלי שנדרש בכל ה-Pods של Apigee. ההגבלה הנדרשת של מזהה התהליך (PID) של Apigee Pod היא 1,000, שזה מתחת למספר המינימלי הנדרש לפלטפורמות GKE.

בפלטפורמות מסוימות יש דרישה לערך מינימלי למספר מזהי ה-Pod, ובמקרה כזה נבחרת הדרישה לערך מינימלי.

פלטפורמה מגבלת PID מינימלית של Pod
GKE on Google Cloud 1024
‫Google Distributed Cloud (תוכנה בלבד) ב-VMware 1024
‫Google Distributed Cloud (תוכנה בלבד) ב-Bare Metal 1024
EKS 1000
AKS 1000
OpenShift 1000
‫Rancher Kubernetes Engine ‏ (RKE) 1000

התהליך

התהליכים לניהול מגבלות ה-PID של ה-Pod שונים בפלטפורמות GKE ובפלטפורמות אחרות.

פלטפורמת GKE

פלטפורמת GKE שתומכת בעדכון של מגבלת PID כוללת:

המגבלה של מזהה התהליך (PID) של ה-Pod נשלטת על ידי הגדרות המערכת של הצומת. ב-GKE יש טווח חובה לערך: [1024, 4194304]. מידע נוסף זמין במאמר בנושא NodeKubeletConfig.

  1. יוצרים הגדרת מערכת של צומת בשם node-config.yaml עם מגבלת PID ייעודית של פוד עם התוכן הבא:
    kubeletConfig:
     podPidsLimit: POD_PID_VALUE # Example: 1024
    
  2. מחילים את ההגדרה על מאגרי הצמתים apigee apigee-data ו-apigee-runtime. כשמחילים את ההגדרה, הצומת מתחיל בהשקה עם אחת משיטות השדרוג של הצומת ללא השבתה.
    gcloud container OPTIONAL_HOST_PLATFORM node-pools update NODE_POOL_NAME \
       --cluster CLUSTER_NAME \
       --region CLUSTER_LOCATION \
       --system-config-from-file=node-config.yaml \
       --project PROJECT_ID
    

פלטפורמות שאינן GKE

בפלטפורמות שאינן GKE, מגבלת ה-PID של ה-Pod נשלטת על ידי Kubelet. המגבלה מוגדרת בשדה podPidsLimit בקובץ התצורה של Kubelet.

  1. יוצרים קובץ הגדרות של Kubelet בשם kubelet-config.yaml עם התוכן הבא:
    apiVersion: kubelet.config.k8s.io/v1beta1
    kind: KubeletConfiguration
    podPidsLimit: POD_PID_VALUE # Example: 1024
    
  2. מפעילים את ההגדרה. כדי להגדיר את podPidsLimit, צריך להפעיל מחדש את הצומת המושפע, מה שעלול לגרום להשבתה:
    kubelet --config PATH_TO_KUBELET_CONFIG_YAML
    
  3. מאמתים את ההגדרה. הוראות מפורטות זמינות במאמר בנושא אימות מגבלות קיימות של מזהי תהליך.

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

פלטפורמה מאמרי עזרה
EKS התאמה אישית של צמתים מנוהלים באמצעות תבניות הפעלה
AKS התאמה אישית של הגדרת הצומת עבור מאגרי צמתים ב-Azure Kubernetes Service‏ (AKS)
OpenShift סיכונים בהגדרת מגבלות גבוהות יותר של מזהי תהליכים (PID) עבור פודים של Red Hat OpenShift Service ב-AWS
‫Rancher Kubernetes Engine ‏ (RKE) גישה לאשכול באמצעות Kubectl ו-kubeconfig

פתרון בעיות שקשורות למגבלות של מזהי תהליכים

רכיב ה-Pod תקוע בסטטוס Pending עם שגיאה FailedScheduling

כשהמגבלה של מזהי התהליכים (PID) של הצומת או של ה-Pod גורמת להוצאה של ה-Pod או מגבילה את ההפעלה שלו, ה-Pod נתקע בסטטוס Pending ונכשל עם השגיאה FailedScheduling.

  1. מאחזרים את העמודה Node:
    kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
    
  2. בודקים אם יש תנאי PIDPressure:
    kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
    
  3. אפשר גם לבדוק את ApigeeDeployment של הפוד המתאים. מקבלים את הערך ApigeeDeployment מהתוצאה שיש לה את אותו קידומת כמו ל-Pod שבו התרחשה השגיאה.
    kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
    
  4. בודקים אם בהודעות השגיאה האחרונות של Events יש הודעות שגיאה שקשורות ל-PID:
    kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
    
  5. אם הסיבה היא חריגה ממגבלת ה-PID, פועלים לפי השלבים במאמר ניהול מגבלות ה-PID של הצומת כדי לעדכן את מגבלת ה-PID לערך גבוה יותר.

השדה podPidsLimit לא חוקי

כשמגדירים את המגבלה ל-GKE, אם podPidsLimit חורג מהמגבלה, תוצג שגיאה:

ERROR: (gcloud.container.node-pools.update) ResponseError: code=400, message=Invalid podPidsLimit : value must be 1024 <= podPidsLimit <= 4194304.

מעדכנים את הערך של podPidsLimit כך שיהיה בטווח הנדרש.