במדריך הזה נדגים איך ליצור אפליקציית אינטרנט רב-שכבתית באמצעות Google Kubernetes Engine (GKE).
במדריך הזה תלמדו:
- הגדרת אפליקציית אינטרנט עם כתובת IP חיצונית ומאזן עומסים.
- יוצרים אשכול Redis עם מאסטר (מוביל) יחיד וכמה עותקים משוכפלים (עוקבים).
בדוגמה מתוארים המושגים הבאים ב-Kubernetes:
- הגדרה הצהרתית באמצעות קובצי מניפסט של YAML
- פריסות, שהן משאבי Kubernetes שקובעים את ההגדרה של קבוצה של קבוצות Pod משוכפלות
- שירותים ליצירת מאזני עומסים פנימיים וחיצוניים לקבוצה של Pods
מטרות
כדי לפרוס את האפליקציה ולהריץ אותה ב-GKE:- הגדרת ה-leader של Redis
- הגדרת שני עוקבים של Redis
- הגדרת הקצה הקדמי של האתר
- כניסה לאתר
- הגדלת קנה המידה של הקצה הקדמי של האתר
בתרשים הבא מוצגת סקירה כללית של ארכיטקטורת האשכול שיוצרים כשמשלימים את היעדים האלה:
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
ב-Cloud Shell מותקנת מראש התוכנה שדרושה למדריך זה, כולל kubectl ו-ה-CLI של gcloud. אם אתם לא משתמשים ב-Cloud Shell, אתם צריכים להתקין את ה-CLI של gcloud.
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-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
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-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 leader:
מחילים את המניפסט על האשכול:
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 שמגדירה קבוצה לוגית של קבוצות Pod ומדיניות שמאפשרת גישה לקבוצות Pod. כשיוצרים שירות, מתארים אילו קבוצות Pod צריך להעביר דרך פרוקסי על סמך תוויות של קבוצות 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 כדי לקרוא נתונים. כדי ששרתי ה-follower של Redis יהיו ניתנים לגילוי, צריך להגדיר שירות.
המאניפסט הבא מתאר שירות עבור העוקבים של 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 follower או leader, בהתאם לסוג הבקשה (קריאה או כתיבה). הקצה הקדמי חושף ממשק 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.
הגדלת מספר ה-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