במדריך הזה נדגים איך ליצור אפליקציית אינטרנט רב-שכבתית באמצעות Google Kubernetes Engine (GKE).
במדריך הזה תלמדו:
- הגדרת אפליקציית אינטרנט עם כתובת IP חיצונית ומאזן עומסים.
- יוצרים קלאסטר Redis עם מאסטר (מוביל) יחיד וכמה עותקים משוכפלים (עוקבים).
בדוגמה מתוארים המושגים הבאים ב-Kubernetes:
- הגדרת הצהרה באמצעות קובצי מניפסט של YAML
- פריסות, שהן משאבי Kubernetes שקובעים את ההגדרה של קבוצה של קבוצות Pod משוכפלות
- Services כדי ליצור מאזני עומסים פנימיים וחיצוניים לקבוצה של 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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידיםgcloud services enable container.googleapis.com
הכנת הסביבה
כדי להגדיר את הסביבה, מבצעים את השלבים הבאים:
הגדרת משתני סביבה:
export PROJECT_ID=PROJECT_ID export COMPUTE_LOCATION=COMPUTE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: Google Cloud מזהה הפרויקט -
COMPUTE_LOCATION: מיקום ב-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מוודאים ש-Pod של Redis leader פועל:
kubectl get podsהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE redis-leader-343230949-qfvrq 1/1 Running 0 43sיכול להיות שיחלפו כמה דקות עד שהסטטוס של
STATUSישתנה מPendingלRunning.
יצירת שירות Redis leader
אפליקציית האינטרנט צריכה לתקשר עם ה-leader של Redis כדי לכתוב את הנתונים שלה. אתם יכולים ליצור Service כדי להעביר את התנועה ל-Pod הראשי של Redis.
שירות הוא הפשטה של Kubernetes שמגדירה קבוצה לוגית של קבוצות Pod ומדיניות שמאפשרת גישה לקבוצות Pod. כשיוצרים שירות, מתארים אילו קבוצות Pod צריך להעביר דרך שרת 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 הוא Pod יחיד, אפשר להוסיף כמה 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, בהתאם לסוג הבקשה (קריאה או כתיבה). החלק של ה-frontend חושף ממשק 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