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

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

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

לדוגמה: 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 KSA_NAME ksa-helloapp
חשבון שירות ב-IAM GSA_NAME gsa-helloapp
מזהה הפרויקט של חשבון השירות ב-IAM GSA_PROJECT Google Cloud PROJECT_ID.

לצורך המדריך הזה, מומלץ ליצור משאבים חדשים כדי שתוכלו למחוק אותם בקלות וללא סיכון אחרי שתפרסו את אפליקציית הדוגמה. עם זאת, אם יש לכם מרחבי שמות, חשבונות שירות של IAM וחשבונות שירות של 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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

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

הגדרת Cloud Shell

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

במסוף Google Cloud , מפעילים את Cloud Shell.

הפעלת 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.

  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 KSA_NAME \
      --namespace NAMESPACE
    

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

    • KSA_NAME: ksa-helloapp, השם של חשבון השירות החדש ב-Kubernetes שאתם יוצרים.
    • NAMESPACE: hello-namespace
  4. יוצרים חשבון שירות ב-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 Cloud PROJECT_ID זהים.
  5. מוסיפים קישור למדיניות 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"
  6. כדי לאפשר לחשבון השירות של 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-namespace
    • KSA_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]"
  7. מוסיפים הערה לחשבון השירות ב-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-helloapp
    • NAMESPACE: ‏hello-namespace
    • GSA_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.

  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 כדי לעדכן את KSA_NAME.
    איור 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. שירות מהסוג הזה יוצר כתובת IP של מאזן עומסים חיצונית עבור ה-Pods שלכם, שאפשר להגיע אליהם דרך האינטרנט.

  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
    

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