פריסת אפליקציה באמצעות GKE Autopilot ו-Spanner

במדריך הזה נסביר איך פורסים אפליקציית אינטרנט בקונטיינר באשכול 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

מזהה הפרויקט שנוצר כשיוצרים פרויקט.

לדוגמה: my-gcp-project

אזור המחשוב COMPUTE_REGION

האזור ב-Compute Engine שבו רוצים ליצור את מכונת Spanner ואת אשכול GKE. מומלץ לבחור אזור שקרוב למיקום הגיאוגרפי של הלקוחות, אבל במדריך הזה נשתמש ב-us-west1.

מכונת Spanner - hello-instance
מסד נתונים של Spanner - hello-database
אשכול GKE Autopilot CLUSTER_NAME hello-cluster
מרחב שמות Kubernetes NAMESPACE hello-namespace
חשבון שירות ב-Kubernetes KUBERNETES_SERVICEACCOUNT ksa-helloapp

לצורך המדריך הזה, מומלץ ליצור משאבים חדשים, וכך מחיקתם תהיה קלה וללא סיכון אחרי שתפרסו את אפליקציית הדוגמה. עם זאת, אם יש לכם מרחבי שמות קיימים וחשבונות שירות של Kubernetes, אתם יכולים להשתמש בהם.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

חשוב לוודא שאתם עומדים בדרישות המוקדמות הבאות:

יצירת פרויקט חדש או בחירה בפרויקט קיים

אתם יכולים להשתמש בפרויקט קיים או ליצור פרויקט חדש בשביל המדריך הזה.

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. 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). איך מקצים תפקידים

הפעלת ממשקי ה-API

הגדרת Cloud Shell

במדריך הזה תשתמשו ב-Cloud Shell כדי להריץ פקודות של gcloud ושל kubectl. ‫Cloud Shell היא סביבת מעטפת לניהול משאבים שמתארחים ב- Google Cloud. הוא מגיע עם Google Cloud CLI ועם כלי שורת הפקודה kubectl שמותקנים מראש.

מפעילים את Cloud Shell במסוף 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

הגדרת האשכול לשימוש ב-Workload Identity Federation for GKE

לפני שפורסים את האפליקציה, צריך להגדיר את האשכול כך שיבצע אימות ל- Google Cloud באמצעות איחוד שירותי אימות הזהות של עומסי עבודה ב-GKE.

  1. מקבלים פרטי כניסה כדי לגשת לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME \
     --location=CONTROL_PLANE_LOCATION
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CLUSTER_NAME: hello-cluster
    • CONTROL_PLANE_LOCATION: us-west1

    הפעולה הזו מעדכנת קובץ kubeconfig עם פרטי הכניסה המתאימים ופרטי נקודת הקצה כדי להפנות את kubectl אל האשכול.

  2. יוצרים מרחב שמות לשימוש בחשבון השירות של Kubernetes. אפשר גם להשתמש במרחב השמות שמוגדר כברירת מחדל או בכל מרחב שמות קיים.

    kubectl create namespace NAMESPACE
    

    מחליפים את NAMESPACE בשם של מרחב השמות החדש שיוצרים, hello-namespace.

  3. יוצרים חשבון שירות ב-Kubernetes לשימוש האפליקציה:

    kubectl create serviceaccount KUBERNETES_SERVICEACCOUNT \
     --namespace NAMESPACE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫KUBERNETES_SERVICEACCOUNT: ksa-helloapp, השם של חשבון השירות החדש ב-Kubernetes שאתם יוצרים.
    • NAMESPACE: hello-namespace
  4. מוסיפים קישור למדיניות 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-namespace
    • KUBERNETES_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.

  1. משכפלים את האפליקציה לדוגמה ממאגר GitHub אל Cloud Shell:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  2. כדי לפתוח את Cloud Shell Editor, לוחצים על הלחצן Code Editor Open Editor בסרגל הכלים שבחלון הטרמינל.

    מידע נוסף זמין במאמר סקירה כללית על הממשק של Cloud Shell Editor.

  3. פותחים את החלונית Explorer ב-Cloud Shell Editor ועוברים לספרייה kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.

  4. פותחים את הקובץ deployment.yaml ומעדכנים את השדה serviceAccountName. מחליפים את <KSA_NAME> ב-ksa-helloapp, השם של חשבון השירות של Kubernetes.

    עורכים את קובץ ה-YAML כדי לעדכן את השם של חשבון השירות ב-Kubernetes.
    איור 1. מעדכנים את השם של חשבון השירות ב-Kubernetes בקובץ הפריסה.
  5. סוגרים את Cloud Shell Editor וחוזרים לטרמינל של Cloud Shell.

  6. בטרמינל של Cloud Shell, נכנסים לספרייה hello-app-cloud-spanner:

    cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
    
  7. פורסים את האפליקציה:

    kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
    

    מחליפים את NAMESPACE ב-hello-namespace.

  8. מחכים שהאפליקציה תיפרס עם 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
    
  9. לוחצים על Ctrl+C במקלדת כדי לחזור לשורת הפקודה ולהריץ פקודות נוספות.

חשיפת אפליקציית הדוגמה לאינטרנט

כדי לחשוף שירות Kubernetes מחוץ לאשכול, יוצרים שירות מסוג LoadBalancer. הסוג הזה של Service יוצר כתובת IP של מאזן עומסים חיצוני לפודים, שאפשר להגיע אליה דרך האינטרנט.

  1. פורסים את מאזן העומסים:

    kubectl apply -f k8s/service.yaml -n=NAMESPACE
    

    מחליפים את NAMESPACE ב-hello-namespace.

  2. ממתינים להקצאה של כתובת IP חיצונית:

    kubectl get service -n=NAMESPACE --watch
    

    מחליפים את NAMESPACE ב-hello-namespace.

  3. אחרי שמקצים את המספר, מעתיקים את EXTERNAL-IP (לדוגמה, 203.0.113.0) ופותחים אותו בדפדפן. ייפתח ממשק אינטרנט שבו אפשר לראות את מסד הנתונים של השחקנים ולנהל אותו.

  4. אתם יכולים להשתמש בממשק המשתמש הגרפי של האפליקציה כדי ליצור או למחוק רשומות של שחקנים, והן נשמרות במסד הנתונים של 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

  1. מוחקים את השירות. הפעולה הזו מבטלת את ההקצאה של Google Cloud מאזן העומסים שנוצר עבור השירות:

    kubectl delete service hello-app-cloud-spanner -n=NAMESPACE
    

    מחליפים את NAMESPACE ב-hello-namespace.

  2. מוחקים את אשכול GKE. הפעולה הזו מוחקת את המשאבים שמרכיבים את האשכול, כמו מכונות המחשוב, הדיסקים ומשאבי הרשת:

    gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
    

מחיקת משאבים ב-Spanner

  1. מוחקים את מסד הנתונים של Spanner:

    gcloud spanner databases delete hello-database --instance=hello-instance
    
  2. מוחקים את מכונת Spanner:

    gcloud spanner instances delete hello-instance
    

המאמרים הבאים