סקירה כללית
מגבלת מזהה תהליך (PID) היא מגבלת משאבים ב-Kubernetes בצמתים ובקבוצות Pod, שמטרתה למנוע יצירה מוגזמת של תהליכים, שעלולה להשפיע על יציבות הצומת. Apigee Hybrid תומך בתכונה של Kubernetes להגדרת מגבלות על מזהי תהליכים. במסמך הזה מוסבר איך להגדיר את המגבלות האלה, ומופיעות בו המלצות לערכים של שירותי Apigee בפלטפורמות ספציפיות.
כשמשתמשי Apigee hybrid מנהלים את האשכולות שלהם, הגדרת מגבלות PID ב-Kubernetes יכולה לשפר את היציבות, האבטחה וניהול המשאבים של המערכת. הגישה הזו עולה בקנה אחד עם השיטות המומלצות לשימוש ב-Kubernetes.
הגדרות של מגבלות על מזהי תהליכים
מגבלות מזהי התהליכים כוללות מגבלות מזהי תהליכים של צמתים ומגבלות מזהי תהליכים של Pod.
מגבלות ה-PID של הצומת כוללות PIDs שמורים ל-kube ו-PIDs שמורים למערכת. המספר הכולל של מזהי תהליכים (PID) שניתן להקצות הוא המקסימום של הליבה פחות מזהי התהליכים ששמורים ל-kube, פחות מזהי התהליכים ששמורים למערכת, פחות מזהי התהליכים של סף הפינוי:
| מגבלות מקסימליות של מזהים ב-Kernel |
|
|
|
| = ניתן להקצאה |
- מגבלות על מזהה מקסימלי של ליבה: נקבעות על ידי מערכת ההפעלה והגדרות הליבה שלה. מכיוון ש-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 קיימות בצומת.
-
אפשר לקבל צומת מהאשכול כדי לבדוק את הערכים. תצטרכו לבדוק צמתים ממאגרי הצמתים
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 הוא הסוכן שפועל ב-pods ובקונטיינרים, ומוודא שהם פועלים בהתאם ל-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 ומחילים מסננים. במדד הזה מוצג השימוש האחרון במזהי תהליכים, ואפשר להשתמש בו כנקודת התייחסות כשבוחרים מגבלה של מזהי תהליכים.
בפלטפורמות שאינן GKE, יכול להיות שיהיו זמינות אפשרויות שונות למעקב. כדי לבדוק את המדדים, אפשר לעיין במאמרי העזרה של Kubernetes בפלטפורמה המתאימה.
הדרישות לגבי מזהה התהליך (PID) של פודים ב-Apigee
Apigee Hybrid משתמש ב-2 מאגרי צמתים, apigee-data ו-apigee-runtime. חלק מרכיבי Apigee נפרסים בשני מאגרי הצמתים, ולכן מגבלת ה-PID של ה-Pod תהיה זהה בשני מאגרי הצמתים. המגבלה של מזהי התהליך ב-Pod צריכה להיות גבוהה גם מהמספר המקסימלי של מזהי התהליך שנדרשים בכל ה-Pods של Apigee. הערך המקסימלי של PID של Apigee Pod הוא 1,000, שזה נמוך ממספר המינימום הנדרש לפלטפורמות GKE.
מגבלת מזהי Pod מומלצת
בפלטפורמות מסוימות יש דרישה לערך מינימלי למספר של מזהי ה-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 כוללת:
- 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 של פודים וההמלצות לשימוש בכלי ניהול שונות בפלטפורמות שונות. פקודות מפורטות מופיעות במסמכי התיעוד של הפלטפורמות הרלוונטיות. בהמשך מופיעים קישורים לתיעוד של פלטפורמות שאינן 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.
-
קבלת העמודה Node:
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide -
בודקים אם יש תנאי
PIDPressure:kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure -
אפשר גם לבדוק את
ApigeeDeploymentשל ה-pod המתאים. מקבלים את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 כך שיהיה בטווח הנדרש.