במדריך הזה נדגים איך ליצור אפליקציית אינטרנט רב-שכבתית באמצעות Google Kubernetes Engine (GKE).
במדריך הזה תלמדו:
- הגדרת אפליקציית אינטרנט עם כתובת IP חיצונית ומאזן עומסים.
- יצירת אשכול Redis עם מאסטר (מוביל) יחיד וכמה עותקים משוכפלים (עוקבים).
בדוגמה מתוארים המושגים הבאים ב-Kubernetes:
- הגדרה הצהרתית באמצעות קובצי מניפסט של YAML
- פריסות, שהן משאב ב-Kubernetes שקובע את ההגדרה של קבוצה של Pods משוכפלים
- שירותים ליצירת מאזני עומסים פנימיים וחיצוניים לקבוצה של Pods
מטרות
כדי לפרוס את האפליקציה ולהריץ אותה ב-GKE:- הגדרת ה-leader של Redis
- הגדרת שני עוקבים של Redis
- הגדרת הקצה הקדמי של האתר
- כניסה לאתר
- הרחבה אנכית של הקצה הקדמי של האתר
בתרשים הבא מוצגת סקירה כללית של ארכיטקטורת האשכול שתיצרו כשתשלימו את היעדים האלה:
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
בעזרת מחשבון העלויות אתם יכולים להעריך את העלויות בהתאם לשימוש הצפוי.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
ב-Cloud Shell מותקנת מראש התוכנה שדרושה למדריך הזה, כולל kubectl ו-ה-CLI של gcloud. אם אתם לא משתמשים ב-Cloud Shell, אתם צריכים להתקין את ה-CLI של gcloud.
-
התקינו את ה-CLI של Google Cloud.
-
הגדירו שה-CLI של gcloud ישתמש בזהות המאוחדת שלכם.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
יוצרים או בוחרים Google Cloud פרויקט.
תפקידים שנדרשים כדי לבחור או ליצור פרויקט
- Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
-
יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (
roles/resourcemanager.projectCreator), שכולל את ההרשאהresourcemanager.projects.create. איך מקצים תפקידים
-
יוצרים Google Cloud פרויקט:
gcloud projects create PROJECT_ID
מחליפים את
PROJECT_IDבשם של פרויקט Google Cloud שיוצרים. -
בוחרים את הפרויקט שיצרתם ב- Google Cloud :
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבשם הפרויקט ב- Google Cloud .
מפעילים את GKE API, אם הוא עדיין לא מופעל:
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידיםgcloud services enable container.googleapis.com
הכנת הסביבה
כדי להגדיר את הסביבה:
מגדירים את משתני הסביבה:
export PROJECT_ID=PROJECT_ID export COMPUTE_LOCATION=COMPUTE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud -
COMPUTE_LOCATION: a מיקום של Compute Engine, כמוus-central1.
-
משכפלים את המאגר ב-GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesעוברים לספריית העבודה:
cd kubernetes-engine-samples/quickstarts/guestbook/
יצירת אשכול GKE
יוצרים אשכול GKE במצב Autopilot או Standard:
Autopilot
gcloud container clusters create-auto guestbook \
--location=${COMPUTE_LOCATION} \
רגילה
gcloud container clusters create guestbook \
--location=${COMPUTE_LOCATION} \
--num-nodes=4
התחברות לאשכול
מגדירים את kubectl לתקשורת עם האשכול:
gcloud container clusters get-credentials guestbook \
--location=${COMPUTE_LOCATION}
הגדרת ה-leader של Redis
האפליקציה משתמשת ב-Redis כדי לאחסן את הנתונים שלה. האפליקציה כותבת את הנתונים שלה למופע Redis ראשי וקוראת נתונים מכמה מופעי Redis משניים.
המניפסט הבא מתאר פריסת Kubernetes שמריצה Pod אחד של מנהיג Redis:
מחילים את המניפסט על האשכול:
kubectl apply -f redis-leader-deployment.yamlמוודאים שפוד ה-Redis הראשי פועל:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE redis-leader-343230949-qfvrq 1/1 Running 0 43sיכול להיות שיחלפו כמה דקות עד שהסטטוס של
STATUSישתנה מPendingלRunning.
יצירת שירות Redis leader
אפליקציית האינטרנט צריכה לתקשר עם ה-leader של Redis כדי לכתוב את הנתונים שלה. אתם יכולים ליצור שירות כדי להעביר את התנועה ל-Pod הראשי של Redis.
שירות הוא הפשטה של Kubernetes שמגדירה קבוצה לוגית של Pods ומדיניות שמאפשרת גישה ל-Pods. כשיוצרים שירות, מתארים אילו Pods יקבלו שירות proxy על סמך תוויות Pod.
במניפסט הבא מתואר שירות למנהל Redis:
המניפסט הזה כולל קבוצה של בוררי תוויות. התוויות האלה תואמות לקבוצת התוויות שנפרסו בשלב הקודם. לכן, שירות זה מעביר את תעבורת הרשת אל ה-Pod הראשי של Redis שנוצר בשלב הקודם.
הקטע
portsבמניפסט מצהיר על מיפוי יציאה יחיד. השירות מעביר את התנועה ב-port: 6379אלtargetPort: 6379של מאגרי התגים שתואמים לתוויותselectorשצוינו. ה-containerPortשמשמש לפריסה צריך להיות זהה ל-targetPortכדי להפנות תנועה לפריסה.מחילים את המניפסט על האשכול:
kubectl apply -f redis-leader-service.yamlמוודאים ש-GKE יצר את השירות:
kubectl get serviceהפלט אמור להיראות כך:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 42s redis-leader 10.51.242.233 <none> 6379/TCP 12s
הגדרת עוקבים ב-Redis
למרות ש-Redis leader הוא פוד יחיד, אפשר להוסיף כמה Redis followers, או רפליקות, כדי להפוך אותו לזמין מאוד ולעמוד בדרישות התנועה.
קובץ המניפסט הבא מתאר פריסה של פודים של Redis follower:
מחילים את המניפסט על האשכול:
kubectl apply -f redis-follower-deployment.yamlמוודאים ששני העותקים המשוכפלים של Redis פועלים:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE redis-follower-76588f55b7-bnsq6 1/1 Running 0 27s redis-follower-76588f55b7-qvtws 1/1 Running 0 27s redis-leader-dd446dc55-kl7nl 1/1 Running 0 119sיכול להיות שיחלפו כמה דקות עד שהסטטוס של
STATUSישתנה מPendingלRunning.
יצירת שירות Redis follower
אפליקציית האינטרנט צריכה לתקשר עם העותקים המשניים של Redis כדי לקרוא נתונים. כדי שניתן יהיה לגלות את ה-Redis followers, צריך להגדיר שירות.
המאניפסט הבא מתאר שירות עבור העוקבים של Redis:
קובץ המניפסט הזה מציין שהשירות פועל ביציאה 6379. השדה
selectorשל השירות תואם לקבוצות ה-Pod של Redis follower שנוצרו בשלב הקודם.מחילים את המניפסט על האשכול:
kubectl apply -f redis-follower-service.yamlמוודאים ש-GKE יצר את השירות:
kubectl get serviceהפלט אמור להיראות כך:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.51.240.1 <none> 443/TCP 1m redis-leader 10.51.242.233 <none> 6379/TCP 49s redis-follower 10.51.247.238 <none> 6379/TCP 3s
הגדרת הקצה הקדמי של האפליקציה באינטרנט
עכשיו, אחרי שיש לכם אחסון Redis לאפליקציה, אפשר להפעיל את שרתי האינטרנט. בדומה ל-Redis followers, הקצה הקדמי נפרס באמצעות Kubernetes Deployment.
אפליקציית האינטרנט משתמשת בחלק הקדמי של PHP, שמוגדר לתקשורת עם שירותי העוקב או המוביל של Redis, בהתאם לשאלה אם הבקשה היא קריאה או כתיבה. החלק הקדמי של האפליקציה חושף ממשק JSON ומציג ממשק משתמש מבוסס-jQuery Ajax.
המניפסט הבא מתאר פריסה של שרת האינטרנט:
קובץ המניפסט מציין את משתנה הסביבה
GET_HOSTS_FROM=dns. כשמספקים את ההגדרה לאפליקציית הקצה הקדמי באינטרנט, אפליקציית הקצה הקדמי משתמשת בשמות המארחיםredis-followerו-redis-leaderכדי לבצע חיפוש DNS. חיפוש ה-DNS מוצא את כתובות ה-IP של השירותים שיצרתם בשלבים הקודמים. המושג הזה נקרא זיהוי שירותים ב-DNS.מחילים את המניפסט על האשכול:
kubectl apply -f frontend-deployment.yamlמוודאים שהרפליקות פועלות:
kubectl get pods -l app=guestbook -l tier=frontendהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE frontend-7b78458576-8kp8s 1/1 Running 0 37s frontend-7b78458576-gg86q 1/1 Running 0 37s frontend-7b78458576-hz87g 1/1 Running 0 37s
חשיפת חזית האתר בכתובת IP חיצונית
בהגדרה הנוכחית, אפשר לגשת לשירותים redis-follower ו-redis-leader שיצרתם בשלבים הקודמים רק בתוך אשכול GKE, כי סוג ברירת המחדל של שירות הוא ClusterIP.
שירות ClusterIP מספק כתובת IP אחת לקבוצת ה-Pods שאליהם השירות מפנה. כתובת ה-IP הזו נגישה רק בתוך האשכול.
כדי להפוך את ממשק המשתמש של שירות האינטרנט לנגיש חיצונית, אפשר לציין type: LoadBalancer או type: NodePort בהגדרת השירות, בהתאם לדרישות.
המניפסט הבא מתאר שירות מסוג LoadBalancer:
הצהרת היציאה בקטע ports מציינת את port: 80, ו-targetPort לא מצוין. אם לא מציינים את המאפיין targetPort, ערך ברירת המחדל שלו הוא הערך של השדה port. במקרה הזה, השירות הזה מעביר תנועה חיצונית ביציאה 80 ליציאה 80 של הקונטיינרים בפריסת frontend.
מחילים את המניפסט על האשכול:
kubectl apply -f frontend-service.yaml
כשיוצרים את שירות frontend, GKE יוצר מאזן עומסים וכתובת IP חיצונית. המשאבים האלה מחויבים.
כניסה לאתר של האפליקציה
כדי לגשת לאתר של האפליקציה, צריך לקבל את כתובת ה-IP החיצונית של השירות frontend:
kubectl get service frontend
הפלט אמור להיראות כך:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
frontend 10.51.242.136 109.197.92.229 80:32372/TCP 1m
יכול להיות שבעמודה EXTERNAL-IP יוצג הערך <pending> בזמן שמאזן העומסים נוצר. הפעולה עשויה להימשך כמה דקות. אם מופיעות שגיאות כמו
Does not have minimum availability, צריך לחכות כמה דקות. השגיאה הזמנית הזו מתרחשת כי GKE יוצר מחדש את הצמתים כדי לבצע את השינויים.
מעתיקים את כתובת ה-IP ופותחים את הדף בדפדפן:

כדי להוסיף רשומות, כותבים הודעה ולוחצים על שליחה. ההודעה שהקלדתם מופיעה בממשק הקצה. ההודעה הזו מציינת שהנתונים נוספו בהצלחה ל-Redis דרך השירותים שיצרתם.
הגדלת קנה המידה של הקצה הקדמי של האתר
נניח שהאפליקציה שלכם פועלת כבר זמן מה, ופתאום היא זוכה לפרסום פתאומי. החלטתם שכדאי להוסיף עוד שרתי אינטרנט לחלק הקדמי של האתר. כדי לעשות את זה, אפשר להגדיל את מספר ה-Pods.
מגדילים את מספר הפודים של
frontend:kubectl scale deployment frontend --replicas=5הפלט אמור להיראות כך:
deployment.extensions/frontend scaledבודקים את מספר הרפליקות שפועלות:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE frontend-88237173-3s3sc 1/1 Running 0 1s frontend-88237173-twgvn 1/1 Running 0 1s frontend-88237173-5p257 1/1 Running 0 23m frontend-88237173-84036 1/1 Running 0 23m frontend-88237173-j3rvr 1/1 Running 0 23m redis-leader-343230949-qfvrq 1/1 Running 0 54m redis-follower-132015689-dp23k 1/1 Running 0 37m redis-follower-132015689-xq9v0 1/1 Running 0 37mכדי להקטין את מספר ה-Pods של
frontend, משתמשים באותה פקודה ומחליפים את5ב-1.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת המשאבים הנפרדים
אם השתמשתם בפרויקט קיים ואתם לא רוצים למחוק אותו, מחקו את המשאבים הנפרדים.
מחיקת השירות
frontend:kubectl delete service frontendמוחקים את אשכול GKE:
gcloud container clusters delete guestbook