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

סקירה כללית

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

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

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

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

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

מגבלות מקסימליות של מזהים ב-Kernel
‫
    - Kube reserved
    - נפח שהמערכת שומרת
    - סף פינוי
‫= ניתן להקצאה
  • מגבלות על מזהה מקסימלי של ליבה: נקבעות על ידי מערכת ההפעלה והגדרות הליבה שלה. מכיוון ש-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 קיימות בצומת.

  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 הוא הסוכן שפועל ב-pods ובקונטיינרים, ומוודא שהם פועלים בהתאם ל-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 ומחילים מסננים. במדד הזה מוצג השימוש האחרון במזהי תהליכים, ואפשר להשתמש בו כנקודת התייחסות כשבוחרים מגבלה של מזהי תהליכים.

Metrics Explorer

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

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

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

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

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

התהליך

ההליכים לניהול המגבלות של מזהי התהליך של ה-Pod שונים בפלטפורמות GKE ובפלטפורמות שאינן 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 של פודים וההמלצות לשימוש בכלי ניהול שונות בפלטפורמות שונות. פקודות מפורטות מופיעות במסמכי התיעוד של הפלטפורמות הרלוונטיות. בהמשך מופיעים קישורים לתיעוד של פלטפורמות שאינן 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, ה-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 של ה-pod המתאים. מקבלים את 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 כך שיהיה בטווח הנדרש.