זמן ההפעלה של ה-Pod
בקטע הזה מוסבר על בעיות נפוצות שקשורות לזמן ההפעלה של פודים ב-Cloud Service Mesh ואיך לפתור אותן. לקבלת עזרה נוספת, אפשר לעיין במאמר בנושא קבלת תמיכה.
הפעלה של Pod וסנכרון של הגדרות Envoy
בעיה נפוצה שנצפית במהלך הפעלת pod בסביבות מסוימות של Cloud Service Mesh ו-Istio קשורה לסנכרון בין מוכנות האפליקציה לבין הגדרת Envoy proxy. הבעיה נובעת מההפעלה בו-זמנית של קונטיינר האפליקציה ושל Envoy sidecar. יכול להיות שהאפליקציה תאותת על מוכנות לפני שפרוקסי Envoy יסיים את האתחול שלו ויקבל את ההגדרה שלו ממישור הבקרה. כך נוצר מצב של מרוץ תהליכים, שבו בקשות נכנסות מופנות לפרוקסי של Envoy שלא הוגדר ולא מוכן לקבל תנועה. הדבר עלול לגרום לכך שבמהלך השלב הראשוני של הפעלת האפליקציה, בקשות ייפסלו, ינותבו בצורה שגויה או יטופלו בצורה שגויה, כי אין קובץ sidecar להעברת תנועה.
אסטרטגיות לצמצום הסיכון
בקטעים הבאים מוסבר על שיטות שיכולות לצמצם את הבעיה הזו.
הגדרת רשת Mesh גלובלית: holdApplicationUntilProxyStarts
האפשרות הראשונה היא להגדיר את holdApplicationUntilProxyStarts: true בתצורת Istio mesh. שימו לב: כברירת מחדל, ההגדרה הזו מושבתת. הדגל מוסיף ווים לעיכוב של הפעלת האפליקציה עד שהפרוקסי של הפוד מוכן לקבל תנועה.
הוספת ההגדרה מבטלת את התחרות הזו, אבל אם היא לא הופעלה קודם, יכול להיות שיהיה עיכוב בזמני ההכנה של האפליקציה לפודים חדשים.
בדיקות מוכנות
פתרון נוסף הוא הטמעה של בדיקות מוכנות שמשלבות בדיקות תקינות של האפליקציה ושל Envoy. בדיקות מוכנות מודיעות ל-Kubernetes מתי קבוצת Pod מוכנה לקבל תעבורת נתונים. חשוב מאוד שלוגיקת בדיקת המוכנות תאמת לא רק את מוכנות האפליקציה, אלא גם את הסטטוס של Envoy proxy. אפשר לעשות את זה באמצעות שאילתה של יציאת האדמין של Envoy כדי לקבל את סטטוס התקינות שלה. באמצעות שילוב של שתי הבדיקות, Kubernetes מונע את ההפניה של תנועה אל ה-Pod עד שהאפליקציה ו-Envoy מאותחלים ומגודרים באופן מלא.
הגישה הזו גמישה יותר ומאפשרת לוגיקה מורכבת יותר של הפעלה ומוכנות, אבל היא מורכבת יותר.
יוצרים את הקובץ healthcheck.sh מהקוד הבא:
#!/bin/sh
APP_HEALTH=$(curl -s -o /dev/null -w "%{http_code}" \
http://localhost:8080/health)
ENVOY_HEALTH=$(curl -s -o /dev/null -w "%{http_code}" \
http://localhost:9901/ready)
if [[ "$APP_HEALTH" -eq 200 && "$ENVOY_HEALTH" -eq 200 ]]; then
exit 0
else
exit 1
fi
מחליפים את כתובות ה-IP והיציאות בכתובות של קונטיינר האפליקציה ושל Envoy.
קובץ ה-YAML הבא מגדיר בדיקת מוכנות שמשתמשת בסקריפט שיצרתם קודם:
apiVersion: v1
kind: Pod
metadata:
name: my-app-with-envoy
spec:
containers:
- name: application
<…>
readinessProbe:
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 3
exec:
command:
- /healthcheck.sh # using the script
- name: envoy
<…>