במדריך הזה מפורטות שיטות מומלצות ליצירת אפליקציה עם שמירת מצב ולשדרוג אשכול Google Kubernetes Engine (GKE) שבו האפליקציה פועלת. במדריך הזה נעשה שימוש ב-Redis כדוגמה לפריסה של אפליקציה עם שמירת מצב, אבל אותם מושגים רלוונטיים גם לסוגים אחרים של אפליקציות עם שמירת מצב שנפרסות ב-GKE.
מטרות
במדריך הזה מוסבר איך:
- יוצרים אשכול GKE שרשום לערוץ הפצה.
- יוצרים אשכול Redis ב-GKE.
- פורסים את אפליקציית הלקוח של Redis ב-GKE.
- כדאי לפעול לפי השיטות המומלצות הבאות לשדרוג מאגר צמתים:
- מגדירים את התקציב לשיבוש Pod (PDB).
- מגדירים את חלון זמן לתחזוקה וההחרגות.
- מגדירים את שיטת השדרוג של הצומת לשדרוג בהדרגה או לשדרוג כחול-ירוק.
- בודקים את האפליקציה.
- משדרגים את האשכול.
- בדיקת שיבוש בעומס העבודה.
התרשים הבא מציג סקירה כללית של ארכיטקטורת האשכול במדריך הזה:
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
הגדרת הפרויקט
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
הגדרת ברירות מחדל ל-Google Cloud CLI
במסוף Google Cloud , מפעילים מכונת Cloud Shell:
פתיחת Cloud Shellמורידים את קוד המקור של האפליקציה לדוגמה:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app-redis/manifestsמגדירים את משתני הסביבה שמוגדרים כברירת מחדל:
gcloud config set project PROJECT-ID gcloud config set compute/zone COMPUTE-ZONEמחליפים את הערכים הבאים:
- PROJECT_ID: מזהה הפרויקט ב-Google Cloud.
- COMPUTE_ZONE: אזור Compute Engine.
יצירת אשכול GKE שרשום לערוץ הפצה
כדי ליצור את אשכול GKE, מבצעים את השלבים הבאים:
יוצרים אשכול בשם
redis-testעם שלושה צמתים:gcloud container clusters create redis-test \ --location CONTROL_PLANE_LOCATION \ --num-nodes=3 \ --release-channel regularמחליפים את CONTROL_PLANE_LOCATION במיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
אחרי שיוצרים את האשכול, אמור להופיע פלט שדומה לדוגמה הבאה:
NAME: redis-test LOCATION: us-central1-c MASTER_VERSION: 1.22.10-gke.600 MASTER_IP: 34.69.67.7 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.10-gke.600 NUM_NODES: 3 STATUS: RUNNINGמגדירים את
kubectlלתקשורת עם האשכול:gcloud container clusters get-credentials redis-test
יצירת אשכול Redis ב-GKE
בקטע הזה מוסיפים Redis Cluster על גבי GKE Cluster שיצרתם קודם, באמצעות פריסה של ConfigMap, StatefulSet ו-headless Service.
כדי ליצור אשכול Redis:
מעיינים בקובץ ConfigMap (
redis-configmap.yaml) שבו מאוחסנת ההגדרה של Redis. בקטע הקוד הבא מוצגים הסקריפטים של בקשת בדיקת התקינות של המוכנות ובקשת בדיקת התקינות של מצב הפעילות.הסקריפטים
readiness.shו-liveness.shמשתמשים ב-redis-cli ping כדי לבדוק אם שרת Redis פועל או לא. אם התוצאה היאPONG, שרת Redis פועל. הסקריפטים האלה ישמשו בredis-cluster.yaml.מידע נוסף על פרמטרי Redis ב-ConfigMap הזה זמין בקטע בנושא פרמטרים של הגדרת Redis Cluster במדריך בנושא Redis Cluster.
פורסים את ה-ConfigMap:
kubectl apply -f redis-configmap.yamlאפשר לעיין בקטע הקוד של StatefulSet (
redis-cluster.yaml) שבהמשך, שבו מוצג השימוש בבקשה לבדיקת תקינות של מוכנות ובבקשה לבדיקת תקינות של מצב פעילות.מידע על הגדרת בדיקות ב-Kubernetes זמין במאמר הגדרת בדיקות.
מומלץ מאוד להשתמש בבדיקות מוכנות ובבדיקות פעילות כשמשדרגים מאגרי צמתים. כך מוודאים שה-Pods מוכנים במהלך השדרוג.
פורסים את ה-StatefulSet:
kubectl apply -f redis-cluster.yamlהשירות חסר הראש שנקרא
redis-service.yamlהוא לחיבור של צמתי Redis. השדהclusterIPמוגדר לערךNoneכדי ליצור שירות ללא GUI.פורסים את השירות:
kubectl apply -f redis-service.yamlממתינים כשתי דקות ומוודאים שכל ה-Pods פועלים באמצעות הפקודה הבאה:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE redis-0 1/1 Running 0 2m29s redis-1 1/1 Running 0 2m8s redis-2 1/1 Running 0 107s redis-3 1/1 Running 0 85s redis-4 1/1 Running 0 54s redis-5 1/1 Running 0 23sמריצים את הפקודה הבאה כדי לוודא שהנפחים הקבועים נוצרו:
kubectl get pvהפלט אמור להיראות כך:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-HASH 1Gi RWO Delete Bound default/data-redis-5 standard 75s pvc-HASH 1Gi RWO Delete Bound default/data-redis-1 standard 2m59s pvc-HASH 1Gi RWO Delete Bound default/data-redis-3 standard 2m16s pvc-HASH 1Gi RWO Delete Bound default/data-redis-2 standard 2m38s pvc-HASH 1Gi RWO Delete Bound default/data-redis-0 standard 3m20s pvc-HASH 1Gi RWO Delete Bound default/data-redis-4 standard 104sבפלט הזה, HASH מייצג גיבוב שמצורף לכל שם של נפח אחסון קבוע.
הקצאת תפקידים ל-Redis Cluster
אחרי שמסיימים את ההגדרה, מקצים תפקידים ל-Redis Cluster.
הסקריפט הבא מקבל את כתובות ה-IP של ה-Pod, ואז מקצה את התפקידים leader ו-follower על ידי העברת כל אחת מכתובות ה-IP של ה-Pod לפקודה:
כדי להקצות תפקידים לאשכול Redis, צריך לבצע את השלבים הבאים:
מריצים את הסקריפט:
chmod +x ./roles.sh ./roles.shמקלידים
yesכשמוצגת בקשה.מתחברים לצומת Redis כדי לבדוק את התפקיד שלו. לדוגמה, כדי לוודא של-
redis-0יש תפקיד מוביל, מריצים את הפקודה הבאה:kubectl exec -it redis-0 -- redis-cli roleהפלט אמור להיראות כך:
1) "master" 2) (integer) 574 3) 1) 1) "10.28.2.3" 2) "6379" 3) "574"
פריסת אפליקציית לקוח Redis
כדי לפרוס את האפליקציה לאשכול GKE שיצרתם, צריך להגדיר Deployment לאפליקציה.
הקובץ בשם app-deployment.yaml מכיל את הגדרת הפריסה של האפליקציה.
מידע נוסף על הבדיקות ועל כללי ההתאמה של ה-Pod שמשמשים בפריסה הזו זמין במאמר שיטות מומלצות ל-GKE: תכנון ובנייה של אשכולים עם זמינות גבוהה.
כדי ליצור את הפריסה, מבצעים את השלבים הבאים:
מחילים את הפריסה:
kubectl apply -f app-deployment.yamlחשיפת האפליקציה דרך מאזן עומסים:
kubectl expose deployment hello-web \ --type=LoadBalancer \ --port 80 \ --target-port 8080מחכים בערך דקה ומריצים את הפקודה הבאה כדי לאחזר את כתובת ה-IP החיצונית של האפליקציה:
kubectl get serviceמהפלט, מעתיקים את הערך שמופיע בעמודה
hello-web'sEXTERNAL-IP:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-web LoadBalancer 10.13.10.55 EXTERNAL_IP 80:30703/TCP 166mכדי לוודא שהאפליקציה פועלת, מדביקים את EXTERNAL_IP בדפדפן האינטרנט. הפלט אמור להיראות כך:
I have been hit [1] times since deployment!רושמים את מספר הביקור. צריך להשתמש בו בקטע בדיקת השיבוש של האפליקציה.
מגדירים משתנה עבור EXTERNAL_IP שהעתקתם. משתמשים בערך הזה כשיוצרים סקריפטים לבדיקת האפליקציה, כמו שמוסבר בקטע הבא:
export IP=EXTERNAL_IP
שיטות מומלצות להגדרת שדרוגים של מאגרי צמתים
כדי לבצע אופטימיזציה לזמינות טובה יותר במהלך שדרוגים של מאגרי צמתים, מומלץ לפעול לפי השיטות המומלצות הבאות לאפליקציות עם שמירת מצב.
הגדרת תקציב לשיבוש Pod (PDB)
כדי להגביל את מספר ה-Pods המשוכפלים שמושבתים בו-זמנית במהלך שיבוש רצוני, צריך ליצור תקציב לשיבוש Pod. זה שימושי באפליקציות עם מצב (stateful), שבהן צריך להגיע לקוורום כדי שמספר הרפליקות יהיה זמין במהלך שדרוג.
בהגדרת PDB:
-
appמציין לאיזו אפליקציה חל ה-PDB הזה. -
minAvailableמגדיר את המספר המינימלי של ה-Pods שיהיו זמינים במהלך שיבוש. אפשר להזין ערך או אחוז (למשל, 30%). -
maxUnavailableמגדיר את המספר המקסימלי של פודים שלא יכולים להיות זמינים במהלך שיבוש. אפשר להזין גם ערך או אחוז.
כדי להגדיר את PDB, מבצעים את השלבים הבאים:
פורסים את PDB:
kubectl apply -f pdb-minavailable.yamlמוודאים שנוצר PDB:
kubectl get pdb
הגדרת חלונות התחזוקה וההחרגות
שדרוגים אוטומטיים של צמתים מייעלים את תהליך השדרוג ושומרים על הצמתים באשכול מעודכנים כשרמת הבקרה משודרגת בשבילכם. התכונה הזו מופעלת כברירת מחדל. מידע נוסף זמין במאמר בנושא שדרוג אוטומטי של צמתים.
כדי להגדיר מסגרות זמן ולשלוט מתי אפשר לבצע תחזוקה באשכולות GKE ומתי אי אפשר, משתמשים בחלונות תחזוקה ובאי הכללות של תחזוקה:
הגדרת חלון זמן לתחזוקה שמתחיל ב-19 באוגוסט 2022 בשעה 2:00 (UTC) ומסתיים ארבע שעות לאחר מכן. חלון זמן לתחזוקה זה פועל מדי יום. במהלך פרק הזמן הזה, מותר לבצע תחזוקה אוטומטית.
gcloud container clusters update redis-test \ --maintenance-window-start 2022-08-19T02:00:00Z \ --maintenance-window-duration 4H \ --maintenance-window-recurrence FREQ=DAILYהגדרת חלון החרגה שמונע תחזוקה במהלך חופשת השנה החדשה. החרגת התחזוקה הזו משתמשת בהיקף
no_upgrades. במהלך התקופה הזו, אסור לבצע תחזוקה אוטומטית מכל סוג שהוא. מידע נוסף זמין במאמר בנושא הגדרת היקף התחזוקה להחרגה.gcloud container clusters update redis-test \ --add-maintenance-exclusion-name new-year \ --add-maintenance-exclusion-start 2022-12-26T00:00:00Z \ --add-maintenance-exclusion-end 2023-01-02T02:00:00Z \ --add-maintenance-exclusion-scope no_upgradesבודקים שחלון זמן לתחזוקה וההחרגות הוחלו. מסתכלים בקטע
maintenancePolicy:gcloud container clusters describe redis-test
מידע נוסף זמין במאמר הגדרת חלונות תחזוקה והחרגות.
הגדרת אסטרטגיית שדרוג של צומת
יש שתי אסטרטגיות לשדרוג צמתים שבהן אפשר להשתמש במאגרי הצמתים באשכול GKE: שדרוגים מסוג Blue-green ושדרוגים מסוג Surge. מידע נוסף זמין במאמר בנושא שיטות לשדרוג Node.
שדרוגים כחול-ירוק
כדאי לבחור בשדרוגים כחול-ירוק אם עומסי העבודה פחות סובלניים להפרעות, ועלייה זמנית בעלויות בגלל שימוש גבוה יותר במשאבים היא דבר מקובל.
מריצים את הפקודה הבאה כדי לשנות את מאגרי הצמתים הנוכחיים לאסטרטגיית שדרוג blue-green.
gcloud container node-pools update default-pool \
--cluster=redis-test \
--enable-blue-green-upgrade \
--location CONTROL_PLANE_LOCATION \
--node-pool-soak-duration=120s
במדריך הזה, משך ההרצה של מאגר הצמתים מוגדר לשתי דקות כדי לחסוך זמן במהלך שלב ההרצה של מאגר הצמתים. השלב הזה משמש לאימות תקינות עומס העבודה אחרי שמתבצע ניקוז של הצמתים במאגר הכחול. מומלץ להגדיר את משך ההרצה של מאגר הצמתים לשעה אחת (3,600 שניות) או למשך זמן שמתאים ביותר לאפליקציה.
מידע נוסף על ניהול הקצאת פודים זמין במאמרים פריסת פוד למאגר צמתים ספציפי ופריסת שירותים למאגרי צמתים ספציפיים.
מידע נוסף על הגדרת שדרוגים מסוג blue-green זמין במאמר הגדרת שדרוגים מסוג blue-green.
שדרוגים של Surge
כדאי לבחור בשדרוגים מהירים אם אופטימיזציה של העלויות חשובה לכם, ואם עומסי העבודה יכולים לעמוד בהשבתה מסודרת תוך פחות מ-60 דקות (GKE מכבד את ה-PDB עד 60 דקות).
מריצים את הפקודה הבאה כדי לשנות את מאגרי הצמתים הנוכחיים לאסטרטגיית שדרוג עם שימוש מוגבר במשאבים.
gcloud container node-pools update default-pool \
--max-surge-upgrade=1 \
--max-unavailable-upgrade=0 \
--cluster=redis-test
בהגדרה הזו (maxSurge=1 ו-maxUnavailable=0), אפשר להוסיף רק צומת אחד של עלייה פתאומית בביקוש למאגר הצמתים במהלך שדרוג, ולכן אפשר לשדרג רק צומת אחד בכל פעם. ההגדרה הזו מאיצה את ההפעלה מחדש של ה-Pod במהלך שדרוגים, תוך שמירה על התקדמות מדורגת.
מידע נוסף על הגדרת שדרוגים בתקופות של ביקוש גבוה זמין במאמר הגדרת שדרוגים בתקופות של ביקוש גבוה.
בודקים את ההגדרה הנוכחית של מאגר הצמתים:
gcloud container node-pools describe default-pool \
--cluster redis-test \
--location CONTROL_PLANE_LOCATION
מידע נוסף על הצגת מאגרי צמתים זמין במאמר הצגת מאגרי צמתים באשכול.
בדיקת האפליקציה
בקטע הזה משתמשים בשני סקריפטים: אחד ששולח בקשות לאפליקציה, ואחד שמודד את שיעור ההצלחה של הבקשות. הסקריפטים האלה משמשים למדידת הפעולות שמתבצעות כשמשדרגים את האשכול.
כדי ליצור את הסקריפטים:
עוברים לספרייה שמכילה את הסקריפטים:
cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scriptsהפניה לסקריפט בשם
generate_load.shששולח בקשה של שאילתות לשנייה (QPS) לאפליקציה. הסקריפט שומר את קוד התגובה של ה-HTTP בספרייה הנוכחית בקובץ בשםoutput. הערך שלoutputמשמש בסקריפט שיוצרים בשלב הבא.אפשר לעיין בסקריפט שנקרא
print_error_rate.shשבו מחושב שיעור ההצלחה על סמך הפלט שנוצר על ידיgenerate_load.sh.נותנים לעצמכם הרשאה להריץ את הסקריפטים:
chmod u+x generate_load.sh print_error_rate.shמגדירים משתנה למספר השאילתות לשנייה. הערך הזה משמש בסקריפט
generate_load.sh, כמו המשתנה שהגדרתם עבור EXTERNAL_IP. מומלץ להגדיר ערך של 40.export QPS=40מריצים את הסקריפט
generate_load.shכדי להתחיל לשלוח QPS:./generate_load.sh $IP $QPS 2>&1משאירים את סקריפט
generate_load.shפועל ופותחים חלון חדש של Terminal. בטרמינל החדש, מריצים את הסקריפטprint_error_rate.shכדי לבדוק את שיעור השגיאות:cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts watch ./print_error_rate.shאמורים לראות שיעור הצלחה של 100% ושיעור שגיאות של 0% כשמתבצעות בקשות QPS.
משאירים את שני הסקריפטים פועלים ופותחים טרמינל שלישי כדי להתכונן לקטע הבא.
שדרוג האשכול
כדי לשדרג את האשכול, מבצעים את השלבים הבאים:
כדי לברר באיזו גרסת GKE משתמש אשכול
redis-test:V=$(gcloud container clusters describe redis-test | grep "version:" | sed "s/version: //") echo $Vהפלט שיוצג אמור להיות דומה לדוגמה הבאה:
1.22.9-gke.2000.אחזור רשימה של גרסאות Kubernetes זמינות:
gcloud container get-server-configברשימת הגרסאות, מחפשים את הקטע
validMasterVersions:ואת הגרסהredis-testשאותרה בשלב הקודם. כדי להימנע מהפרה של מדיניות ההטיה של גרסאות GKE על ידי בחירת גרסה שלא תואמת לצמתים, מעתיקים את הגרסה מהרשימה שמופיעה מיד לפני גרסהredis-test.משדרגים את רמת הבקרה של האשכול לגרסה שבחרתם ומקלידים
yכשהמערכת מבקשת:gcloud container clusters upgrade redis-test \ --master \ --cluster-version VERSIONמחליפים את VERSION בגרסה שבחרתם מהרשימה בשלב הקודם.
שדרוג מישור הבקרה נמשך כמה דקות.
משדרגים את הצמתים של האשכול לגרסה שבחרתם ומקלידים
yכאשר מוצגת ההנחיה:gcloud container clusters upgrade redis-test \ --cluster-version=VERSION \ --node-pool=default-poolמחליפים את VERSION בגרסה שבחרתם מהרשימה.
בדיקת שיבוש בעומס העבודה
בקטע הזה, בודקים את הסטטוס של האפליקציה ומתבוננים בשיבוש של עומס העבודה.
חוזרים לחלון הטרמינל שבו פועלת הפקודה
./print_error_rate.shומתבוננים בשינוי שחל בשיעור ההצלחה במהלך השדרוג. אפשר לצפות לירידה קלה בשיעור ההצלחה ולעלייה קלה בשיעור השגיאות ברשת של האפליקציה בזמן שהצמתים מושבתים לצורך שדרוג.בשדה
Success rateתוכלו לראות כמה ביקורים באתר בוצעו בהצלחה. חשוב לרשום את הערך הזה.כדי להפסיק את ההרצה של שני הסקריפטים, מזינים
CTRL+Cבמסופים הרלוונטיים.חוזרים לאתר של האפליקציה על ידי הזנת כתובת ה-IP שלה (זוהי EXTERNAL_IP שהעתקתם במהלך השלב פריסת אפליקציית הלקוח של Redis) בדפדפן.
בודקים את מספר הביקור באפליקציה. המספר שמופיע צריך להיות שווה ל:
ORIGINAL_VISIT_NUMBER + SUCCESSFUL_VISIT_NUMBERכאשר ORIGINAL_VISIT_NUMBER הוא המספר שרשמתם בשלב האחרון של פריסת אפליקציית לקוח Redis ו-SUCCESSFUL_VISIT_NUMBER הוא הערך שרשמתם בשלב הראשון של הקטע הזה.
הסרת המשאבים
אחרי שמסיימים את המדריך, אפשר למחוק את המשאבים שנוצרו, כדי שהם יפסיקו להשתמש במכסה ולצבור חיובים. בסעיפים הבאים מוסבר איך למחוק או להשבית את המשאבים האלו.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת האשכול
כדי למחוק את האשכול שיצרתם במדריך הזה, מריצים את הפקודה הבאה:
gcloud container clusters delete redis-test