סקירה כללית
הגבלה של מזהה תהליך (PID) היא הגבלת משאבים ב-Kubernetes על צמתים וקבוצות Pod, שמטרתה למנוע יצירה מוגזמת של תהליכים, שעלולה להשפיע על יציבות הצומת. Apigee Hybrid תומך בתכונה של Kubernetes להגדרת מגבלות על מזהי תהליכים. במסמך הזה מוסבר איך להגדיר את המגבלות האלה, ומופיעות בו המלצות לערכים של שירותי Apigee בפלטפורמות ספציפיות.
כשמשתמשי Apigee hybrid מנהלים את האשכולות שלהם, הגדרת מגבלות PID ב-Kubernetes יכולה לשפר את יציבות המערכת, האבטחה וניהול המשאבים. ההתנהגות הזו עולה בקנה אחד עם השיטות המומלצות לשימוש ב-Kubernetes.
הגדרות של מגבלות על מזהי תהליכים
מגבלות מזהי התהליכים כוללות מגבלות מזהי תהליכים של צמתים ומגבלות מזהי תהליכים של פודים.
מגבלות ה-PID של הצומת כוללות את ה-PID שמור ל-Kube ואת ה-PID שמור למערכת. המספר הכולל של מזהי תהליכים (PID) שניתנים להקצאה הוא המקסימום של הליבה פחות מזהי התהליכים ששמורים ל-kube, פחות מזהי התהליכים ששמורים למערכת, פחות מזהי התהליכים של סף הפינוי:
| מגבלות על מספרים מקסימליים של מזהים בליבה |
|
|
|
| = 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_IDexport CLUSTER_NAME=MY_CLUSTER_NAMEexport LOCATION=MY_CLUSTER_LOCATIONexport APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee
אימות הגישה
לפני שמגדירים את המגבלה של מזהה התהליך, צריך לוודא שיש לכם גישה לעריכת אשכולות Kubernetes.
השלבים הבאים מיועדים להתקנות ב-GKE. למידע על פלטפורמות אחרות, אפשר לעיין במסמכי התיעוד של הפלטפורמה.
-
בודקים אם יש לכם את התפקידים roles/container.clusterAdmin במדיניות IAM:
gcloud projects get-iam-policy ${PROJECT_ID} \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:your_account_email" - אם אין לכם גישה, אתם צריכים להוסיף את התפקיד לחשבון:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:your_account_email \ --role roles/container.clusterAdmin
אימות מגבלות קיימות של PID
לפני שמגדירים מגבלות חדשות, צריך לבדוק אם יש מגבלות PID קיימות בצומת.
-
מקבלים צומת מהאשכול כדי לבדוק ערכים. תצטרכו לבדוק צמתים ממאגרי הצמתים
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 -
מייצאים את שם הצומת מהפלט של השלב הקודם. מריצים את השלב הבא קודם לצומת
apigee-dataושוב לצומתapigee-runtime:קוד
export NODE_NAME=MY_NODE_NAME
דוגמה
export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
- בודקים את מגבלות ה-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' - בודקים את מגבלת ה-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.
התהליך
-
יוצרים קובץ תצורה של Kubelet בשם
kubelet-config.yaml.apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration kubeReserved: pid: PID_VALUE # Example: 1000
מידע נוסף על ההגדרות זמין במאמר Kube Reserved במאמרי העזרה של Kubernetes.
-
מחילים את ההגדרה של 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.
בפלטפורמות שאינן 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 כוללת:
- GKE ב-Google Cloud: ראו gcloud container node-pools.
- Google Distributed Cloud (תוכנה בלבד) ב-VMware: ראו gcloud container vmware node-pools
- Google Distributed Cloud (תוכנה בלבד) בשרת פיזי: ראו gcloud container bare-metal node-pools
המגבלה של מזהה התהליך (PID) של ה-Pod נשלטת על ידי הגדרות המערכת של הצומת. ב-GKE יש טווח חובה לערך: [1024, 4194304]. מידע נוסף זמין במאמר בנושא NodeKubeletConfig.
-
יוצרים הגדרת מערכת של צומת בשם
node-config.yamlעם מגבלת PID ייעודית של פוד עם התוכן הבא:kubeletConfig: podPidsLimit: POD_PID_VALUE # Example: 1024
-
מחילים את ההגדרה על מאגרי הצמתים 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.
-
יוצרים קובץ הגדרות של Kubelet בשם
kubelet-config.yamlעם התוכן הבא:apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration podPidsLimit: POD_PID_VALUE # Example: 1024
-
מפעילים את ההגדרה. כדי להגדיר את podPidsLimit, צריך להפעיל מחדש את הצומת המושפע, מה שעלול לגרום להשבתה:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
- מאמתים את ההגדרה. הוראות מפורטות זמינות במאמר בנושא אימות מגבלות קיימות של מזהי תהליך.
פקודות ההגדרה של מגבלות ה-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.
-
מאחזרים את העמודה Node:
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide -
בודקים אם יש תנאי
PIDPressure:kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure -
אפשר גם לבדוק את
ApigeeDeploymentשל הפוד המתאים. מקבלים את הערךApigeeDeploymentמהתוצאה שיש לה את אותו קידומת כמו ל-Pod שבו התרחשה השגיאה.kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE} -
בודקים אם בהודעות השגיאה האחרונות של
Eventsיש הודעות שגיאה שקשורות ל-PID:kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME} - אם הסיבה היא חריגה ממגבלת ה-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 כך שיהיה בטווח הנדרש.