במדריך הזה נסביר איך פורסים אפליקציית אינטרנט בקונטיינר באשכול Google Kubernetes Engine (GKE) Autopilot עם קצה עורפי של מסד נתונים של Spanner. אתם יכולים לבנות ולפרוס אפליקציות אינטרנט ניתנות להרחבה ואמינות בלי לנהל תשתית מורכבת באמצעות אשכולות GKE Autopilot ו-Spanner. GKE מקצה ומנהל באופן אוטומטי את משאבי האשכולות של Kubernetes, וכך מפחית את התקורה התפעולית. Spanner הוא מסד נתונים רלציוני מנוהל במלואו, שמופץ באופן גלובלי ומספק ביצועים גבוהים וזמינות גבוהה עם טרנזקציות ACID וסמנטיקה של SQL.
לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את Kubernetes.
המסמך הזה מיועד למפתחים ולאדמינים של פלטפורמות ענן. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם ב Google Cloud תוכן זמין במאמר תפקידים נפוצים של משתמשים ב-GKE ומשימות.
למה GKE ו-Spanner
בתור מפתחים, יכול להיות שלא תרצו להשקיע זמן בחישוב כמות משאבי האחסון והמחשוב שהאפליקציה שלכם צריכה, או בחיזוי צריכת ה-RAM וה-CPU בתקופות של תנודות בביקוש, או לדאוג לכשל באפליקציה בזמן עומס שיא.
באמצעות GKE Autopilot כשירות Kubernetes מנוהל, ו-Spanner כשירות מסד נתונים מנוהל, אתם יכולים לפתח ולפרוס אפליקציות מהר יותר בתשתית יציבה שמפשטת את ההגדרה והניהול של משאבים. GKE Autopilot מטפל בהגדרת התשתית ובשינוי הגודל שלה לאירוח האפליקציה, על ידי הוספה או הסרה של צמתים לאשכול או ממנו, בהתאם לדרישות בזמן הריצה. באופן דומה, Spanner יכול להרחיב או לצמצם את הקיבולת באופן דינמי עם התערבות ידנית מינימלית, ככל שמשתנות הדרישות לאחסון או למחשוב.
לדוגמה, נניח שאתם משיקים משחק חדש שצפוי להפוך ללהיט ויראלי, ולכן למשוך תנועה באתר גדולה במהלך שבוע ההשקה. בעזרת Spanner אפשר להתמודד עם העלייה החדה הזו בנפח הנתונים, כי הוא מאפשר להגדיל, להקטין או להקצות מחדש משאבי מחשוב באופן מיידי, תוך שמירה על זמינות מקסימלית של האפליקציה באמצעות GKE Autopilot.
מטרות
במדריך הזה תלמדו איך:
יוצרים מסד נתונים ב-Spanner שבו מאוחסן מרשם של שחקנים.
פורסים אפליקציית אינטרנט לדוגמה בשם
hello-app-cloud-spanner, עם ממשק משתמש גרפי.
בטבלה הבאה מפורטים Google Cloud המשאבים שיוצרים או משתמשים בהם, המשתנים שמזהים אותם והערכים שמוגדרים להם לצורך המדריך הזה:
| משאב | משתנה | ערך |
|---|---|---|
| מזהה הפרויקטGoogle Cloud | PROJECT_ID
|
מזהה הפרויקט שנוצר כשיוצרים פרויקט.
לדוגמה: |
| אזור המחשוב | COMPUTE_REGION |
האזור ב-Compute Engine שבו רוצים ליצור את מכונת Spanner ואת אשכול GKE. מומלץ לבחור אזור שקרוב למיקום הגיאוגרפי של הלקוחות, אבל במדריך הזה נשתמש ב- |
| מכונת Spanner | - | hello-instance |
| מסד נתונים של Spanner | - | hello-database |
| אשכול GKE Autopilot | CLUSTER_NAME |
hello-cluster |
| מרחב שמות Kubernetes | NAMESPACE |
hello-namespace |
| חשבון שירות ב-Kubernetes | KUBERNETES_SERVICEACCOUNT |
ksa-helloapp |
לצורך המדריך הזה, מומלץ ליצור משאבים חדשים, וכך מחיקתם תהיה קלה וללא סיכון אחרי שתפרסו את אפליקציית הדוגמה. עם זאת, אם יש לכם מרחבי שמות קיימים וחשבונות שירות של Kubernetes, אתם יכולים להשתמש בהם.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
- Compute Engine instances used by GKE
- Spanner
- Cloud Load Balancing
כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
חשוב לוודא שאתם עומדים בדרישות המוקדמות הבאות:
יצירת פרויקט חדש או בחירה בפרויקט קיים
אתם יכולים להשתמש בפרויקט קיים או ליצור פרויקט חדש בשביל המדריך הזה.
- נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
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.
הפעלת ממשקי ה-API
מפעילים את ממשקי ה-API של Artifact Registry, Compute Engine, GKE, IAM Service Account Credentials ו-Spanner, אם אחד מהם לא מופעל.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים
הגדרת Cloud Shell
במדריך הזה תשתמשו ב-Cloud Shell כדי להריץ פקודות של gcloud ושל kubectl. Cloud Shell היא סביבת מעטפת לניהול משאבים שמתארחים ב- Google Cloud. הוא מגיע עם Google Cloud CLI ועם כלי שורת הפקודה kubectl שמותקנים מראש.
מפעילים את Cloud Shell במסוף Google Cloud .
בחלק התחתון של המסוף ייפתח סשן של Cloud Shell בתוך מסגרת.
לפני שמריצים פקודות במדריך הזה, מוודאים שפרויקט ברירת המחדל מוגדר למזהה הפרויקט שבו רוצים לפרוס את אפליקציית הדוגמה. אם הוא עדיין לא מוגדר, מריצים את הפקודה הבאה ב-Cloud Shell:
gcloud config set project PROJECT_ID
מחליפים את PROJECT_ID במזהה הפרויקט.
מתן תפקידים ב-IAM
מוודאים של Google Cloud חשבון שלכם יש את תפקידי ה-IAM שנדרשים ללימוד הזה.
מעניקים תפקידים לחשבון המשתמש. מריצים את הפקודה הבאה לכל אחד מהתפקידים הבאים ב-IAM:
roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
USER_IDENTIFIER: המזהה של חשבון המשתמש . לדוגמה,myemail@example.com. -
ROLE: תפקיד ה-IAM שאתם מקצים לחשבון המשתמש.
הגדרת Spanner
כדי להגדיר את Spanner, צריך ליצור מכונה של Spanner ומסד נתונים של Spanner.
יצירת מכונת Spanner
מופע Spanner הוא הקצאה של משאבים שמשמשים מסדי נתונים של Spanner שנוצרו באותו מופע.
יוצרים מכונת Spanner בשם hello-instance עם הגדרה אזורית, ונפח מחשוב של 100 יחידות עיבוד.
gcloud spanner instances create hello-instance \
--config=regional-COMPUTE_REGION \
--description="Spanner sample instance" \
--processing-units=100
במדריך הזה, מחליפים את COMPUTE_REGION ב-us-west1.
יצירת מסד נתונים ב-Spanner
מסד נתונים ב-Spanner כולל את הטבלאות, התצוגות והאינדקסים שלכם. מסד נתונים יורש מאפיינים ממופע האב שלו, כמו ההגדרה (אזורית או במספר אזורים), קיבולת המחשוב הזמינה והאחסון.
יוצרים מסד נתונים של Spanner בשם hello-database עם טבלה בשם Players באמצעות ניב GoogleSQL. מריצים את השאילתה הבאה ב-Cloud Shell:
gcloud spanner databases create hello-database \
--instance=hello-instance \
--database-dialect=GOOGLE_STANDARD_SQL \
--ddl="CREATE TABLE Players (
PlayerUuid STRING(36) NOT NULL,
FirstName STRING(1024),
LastName STRING(1024),
BirthDate DATE) PRIMARY KEY(PlayerUuid)"
יצירת אשכול GKE Autopilot
אחרי שמגדירים את Spanner, יוצרים אשכול Autopilot ומשתמשים ב-איחוד זהויות של עומסי עבודה ל-GKE כדי לגשת למסד הנתונים בצורה מאובטחת ונוחה לניהול.
יוצרים אשכול Autopilot בשם hello-cluster. בקטרי Autopilot, איחוד הזהויות של עומסי עבודה ל-GKE מופעל כברירת מחדל.
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION
מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAME:hello-cluster-
CONTROL_PLANE_LOCATION: האזור ב-Compute Engine של מישור הבקרה של האשכול. במדריך הזה, משתמשים באותו אזור,us-west1, שבו יצרתם את המכונה של Spanner. כדי לצמצם את זמן האחזור, מומלץ ליצור את מופע Spanner ואת אשכול GKE Autopilot באותו אזור.
יצירת האשכול יכולה להימשך עד 8-10 דקות.
הפלט אמור להיראות כך:
NAME: hello-cluster LOCATION: us-west1 MASTER_VERSION: 1.26.5-gke.1200 MASTER_IP: 192.0.2.1 MACHINE_TYPE: e2-medium NODE_VERSION: 1.26.5-gke.1200 NUM_NODES: 3 STATUS: RUNNING
הגדרת האשכול לשימוש ב-Workload Identity Federation for GKE
לפני שפורסים את האפליקציה, צריך להגדיר את האשכול כך שיבצע אימות ל- Google Cloud באמצעות איחוד שירותי אימות הזהות של עומסי עבודה ב-GKE.
מקבלים פרטי כניסה כדי לגשת לאשכול:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONמחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAME:hello-clusterCONTROL_PLANE_LOCATION:us-west1
הפעולה הזו מעדכנת קובץ
kubeconfigעם פרטי הכניסה המתאימים ופרטי נקודת הקצה כדי להפנות אתkubectlאל האשכול.יוצרים מרחב שמות לשימוש בחשבון השירות של Kubernetes. אפשר גם להשתמש במרחב השמות שמוגדר כברירת מחדל או בכל מרחב שמות קיים.
kubectl create namespace NAMESPACEמחליפים את
NAMESPACEבשם של מרחב השמות החדש שיוצרים,hello-namespace.יוצרים חשבון שירות ב-Kubernetes לשימוש האפליקציה:
kubectl create serviceaccount KUBERNETES_SERVICEACCOUNT \ --namespace NAMESPACEמחליפים את מה שכתוב בשדות הבאים:
-
KUBERNETES_SERVICEACCOUNT:ksa-helloapp, השם של חשבון השירות החדש ב-Kubernetes שאתם יוצרים. NAMESPACE:hello-namespace
-
מוסיפים קישור למדיניות IAM לחשבון השירות של Kubernetes כדי לקרוא ולכתוב ב-Spanner:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role="roles/spanner.admin" \ --condition=Noneמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud -
PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud NAMESPACE:hello-namespaceKUBERNETES_SERVICEACCOUNT:ksa-helloapp
דוגמה:
gcloud projects add-iam-policy-binding my-gcp-project \ --member="principal://iam.googleapis.com/projects/123456789012/locations/global/workloadIdentityPools/my-gcp-project.svc.id.goog/subject/ns/hello-namespace/sa/ksa-helloapp" \ --role="roles/spanner.admin" \ --condition=None
-
פריסת האפליקציה לדוגמה באשכול
אחרי שהגדרתם את GKE ואת Spanner עם השירותים והאימות הדרושים, אתם מוכנים לפרוס את האפליקציה לדוגמה hello-app-cloud-spanner.
משכפלים את האפליקציה לדוגמה ממאגר GitHub אל Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.gitכדי לפתוח את Cloud Shell Editor, לוחצים על
Open Editor בסרגל הכלים שבחלון הטרמינל.מידע נוסף זמין במאמר סקירה כללית על הממשק של Cloud Shell Editor.
פותחים את החלונית Explorer ב-Cloud Shell Editor ועוברים לספרייה
kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.פותחים את הקובץ
deployment.yamlומעדכנים את השדהserviceAccountName. מחליפים את<KSA_NAME>ב-ksa-helloapp, השם של חשבון השירות של Kubernetes.
איור 1. מעדכנים את השם של חשבון השירות ב-Kubernetes בקובץ הפריסה. סוגרים את Cloud Shell Editor וחוזרים לטרמינל של Cloud Shell.
בטרמינל של Cloud Shell, נכנסים לספרייה
hello-app-cloud-spanner:cd kubernetes-engine-samples/databases/hello-app-cloud-spannerפורסים את האפליקציה:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACEמחליפים את
NAMESPACEב-hello-namespace.מחכים שהאפליקציה תיפרס עם
STATUSבתורRunning:kubectl get pods -n=NAMESPACE --watchמחליפים את
NAMESPACEב-hello-namespace.הפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE hello-app-cloud-spanner-765c9b8779-lfcrc 0/1 ContainerCreating 0 87s hello-app-cloud-spanner-765c9b8779-lfcrc 1/1 Running 0 3m15sלוחצים על Ctrl+C במקלדת כדי לחזור לשורת הפקודה ולהריץ פקודות נוספות.
חשיפת אפליקציית הדוגמה לאינטרנט
כדי לחשוף שירות Kubernetes מחוץ לאשכול, יוצרים שירות מסוג LoadBalancer.
הסוג הזה של Service יוצר כתובת IP של מאזן עומסים חיצוני לפודים, שאפשר להגיע אליה דרך האינטרנט.
פורסים את מאזן העומסים:
kubectl apply -f k8s/service.yaml -n=NAMESPACEמחליפים את
NAMESPACEב-hello-namespace.ממתינים להקצאה של כתובת IP חיצונית:
kubectl get service -n=NAMESPACE --watchמחליפים את
NAMESPACEב-hello-namespace.אחרי שמקצים את המספר, מעתיקים את
EXTERNAL-IP(לדוגמה,203.0.113.0) ופותחים אותו בדפדפן. ייפתח ממשק אינטרנט שבו אפשר לראות את מסד הנתונים של השחקנים ולנהל אותו.אתם יכולים להשתמש בממשק המשתמש הגרפי של האפליקציה כדי ליצור או למחוק רשומות של שחקנים, והן נשמרות במסד הנתונים של Spanner.
איור 2. ליצור או למחוק שחקנים במאגר הרישום. מריצים את השאילתה הבאה כדי לוודא שמסד הנתונים ב-Spanner עודכן עם הערכים שלכם:
gcloud spanner databases execute-sql hello-database \ --instance=hello-instance \ --sql="SELECT * FROM Players LIMIT 10"הפלט אמור להיראות כך:
PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3 FirstName: John LastName: Smith BirthDate: 1997-07-12 PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e FirstName: Jane LastName: Doe BirthDate: 2013-07-12
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
הדרך הכי קלה להימנע מחיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
אם מחקתם את הפרויקט, סיימתם את הניקוי. אם לא מחקתם את הפרויקט, צריך למחוק את משאבי GKE ו-Spanner.
מחיקת משאבים ב-GKE
מוחקים את השירות. הפעולה הזו מבטלת את ההקצאה של Google Cloud מאזן העומסים שנוצר עבור השירות:
kubectl delete service hello-app-cloud-spanner -n=NAMESPACEמחליפים את
NAMESPACEב-hello-namespace.מוחקים את אשכול GKE. הפעולה הזו מוחקת את המשאבים שמרכיבים את האשכול, כמו מכונות המחשוב, הדיסקים ומשאבי הרשת:
gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
מחיקת משאבים ב-Spanner
מוחקים את מסד הנתונים של Spanner:
gcloud spanner databases delete hello-database --instance=hello-instanceמוחקים את מכונת Spanner:
gcloud spanner instances delete hello-instance