במדריך הזה מוסבר איך לפרוס אפליקציית אינטרנט בקונטיינר באשכול Autopilot של Google Kubernetes Engine (GKE), ואיך להשתמש במסד נתונים של Google Spanner בקצה העורפי כדי לאחסן נתונים. אפליקציית הדוגמה מנהלת טבלה של שחקנים במשחק. אפשר להוסיף ולמחוק שחקנים דרך ממשק המשתמש הגרפי (GUI) של האפליקציה.
Spanner הוא שירות של מסד נתונים רלציוני מנוהל באופן מלא, עם יכולת הרחבה אופקית, שמופץ באופן גלובלי ומספק עסקאות ACID וסמנטיקה של SQL בלי להתפשר על ביצועים וזמינות גבוהה.
לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את Kubernetes.
למה כדאי להשתמש ב-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 | KSA_NAME |
ksa-helloapp |
| חשבון שירות ב-IAM | GSA_NAME |
gsa-helloapp |
| מזהה הפרויקט של חשבון השירות ב-IAM | GSA_PROJECT |
Google Cloud PROJECT_ID. |
לצורך המדריך הזה, מומלץ ליצור משאבים חדשים כדי שתוכלו למחוק אותם בקלות וללא סיכון אחרי שתפרסו את אפליקציית הדוגמה. עם זאת, אם יש לכם מרחבי שמות, חשבונות שירות של IAM וחשבונות שירות של 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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים
הגדרת Cloud Shell
במדריך הזה תשתמשו ב-Cloud Shell כדי להריץ פקודות של gcloud ושל kubectl. Cloud Shell היא סביבת מעטפת לניהול משאבים שמתארחים ב- Google Cloud. הוא מגיע עם Google Cloud CLI ועם כלי שורת הפקודה kubectl שמותקנים מראש.
במסוף Google Cloud , מפעילים את Cloud Shell.
בחלק התחתון של המסוף ייפתח סשן של 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
הגדרת האשכול לשימוש באיחוד זהויות של עומסי עבודה ל-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 KSA_NAME \ --namespace NAMESPACEמחליפים את מה שכתוב בשדות הבאים:
-
KSA_NAME:ksa-helloapp, השם של חשבון השירות החדש ב-Kubernetes שאתם יוצרים. NAMESPACE:hello-namespace
-
יוצרים חשבון שירות ב-IAM לאפליקציה:
gcloud iam service-accounts create GSA_NAME \ --project=GSA_PROJECTמחליפים את מה שכתוב בשדות הבאים:
-
GSA_NAME:gsa-helloapp, השם של חשבון השירות החדש ב-IAM שאתם יוצרים. -
GSA_PROJECT: מזהה הפרויקט ב- Google Cloud. במדריך הזה, אתם יוצרים את חשבון השירות של IAM באותו פרויקט Google Cloud שבו אתם פורסים את אפליקציית הדוגמה. לכן,GSA_PROJECTו-Google CloudPROJECT_IDזהים.
-
מוסיפים קישור למדיניות IAM לחשבון השירות של IAM כדי לקרוא ולכתוב ב-Spanner:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/spanner.admin"מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud GSA_NAME:gsa-helloapp
דוגמה:
gcloud projects add-iam-policy-binding my-gcp-project \ --member "serviceAccount:gsa-helloapp@my-gcp-project.iam.gserviceaccount.com" \ --role "roles/spanner.admin"
-
כדי לאפשר לחשבון השירות של Kubernetes להתחזות לחשבון השירות של IAM, מוסיפים קשר בין כללי מדיניות של IAM בין שני חשבונות השירות. הקישור הזה מאפשר לחשבון השירות של Kubernetes לפעול בתור חשבון השירות של IAM, כך שחשבון השירות של Kubernetes יכול לקרוא ולכתוב ב-Spanner.
gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"מחליפים את מה שכתוב בשדות הבאים:
GSA_NAME:gsa-helloapp-
GSA_PROJECT: מזהה הפרויקט ב- Google Cloud -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud NAMESPACE:hello-namespaceKSA_NAME:ksa-helloapp
דוגמה:
gcloud iam service-accounts add-iam-policy-binding gsa-helloapp@my-gcp-project.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
מוסיפים הערה לחשבון השירות ב-Kubernetes עם כתובת האימייל של חשבון השירות ב-IAM. כך אפליקציית הדוגמה יודעת באיזה חשבון שירות להשתמש כדי לגשת לשירותים. Google Cloud לכן, כשהאפליקציה משתמשת בספריות לקוח רגילות של Google API כדי לגשת לשירותים, היא משתמשת בחשבון השירות הזה של IAM. Google Cloud
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.comמחליפים את מה שכתוב בשדות הבאים:
KSA_NAME:ksa-helloappNAMESPACE: hello-namespaceGSA_NAME:gsa-helloapp-
GSA_PROJECT: מזהה הפרויקט ב- Google Cloud
דוגמה:
kubectl annotate serviceaccount ksa-helloapp \ --namespace hello-namespace \ iam.gke.io/gcp-service-account=gsa-helloapp@my-gcp-project.iam.gserviceaccount.com
פריסת האפליקציה לדוגמה באשכול
אחרי שהגדרתם את 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.
שירות מהסוג הזה יוצר כתובת IP של מאזן עומסים חיצונית עבור ה-Pods שלכם, שאפשר להגיע אליהם דרך האינטרנט.
פורסים את מאזן העומסים:
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