במדריך הזה נסביר איך להעביר אפליקציות עם שמירת מצב (stateful) ב-GKE מסוגי מכונות מדור ישן יותר, כמו N2, עם אמצעי אחסון מצורפים של Persistent Disk, לסוגי מכונות מדור חדש יותר, כמו N4, עם אמצעי אחסון מצורפים של Hyperdisk, באמצעות גיבוי ל-GKE. מידע נוסף על סוגי מכונות שתומכות ב-Hyperdisk זמין במאמרי העזרה של Compute Engine.
כדי להדגים את ההעברה, במדריך הזה נעשה שימוש במסד הנתונים Sakila ובמסד הנתונים World כדי לספק מערכי נתונים לדוגמה. Sakila הוא מסד נתונים לדוגמה שסופק על ידי MySQL ומייצג חנות בדיונית להשכרת DVD. מסד הנתונים World מכיל נתונים על מדינות וערים. במדריך נעשה שימוש בשני מערכי נתונים שונים במרחבי שמות נפרדים כדי לדמות סביבה מורכבת של דיירים רבים.
המדריך הזה מיועד למומחי אחסון ולאדמינים של אחסון שיוצרים ומקצים אחסון, ומנהלים את אבטחת הנתונים והגישה לנתונים. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שמוזכרים ב Google Cloudתוכן זמין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.
ארכיטקטורת פריסה
בתרשים הבא מוצג תהליך השימוש ב-Backup for GKE להעברת עומסי עבודה של MySQL עם שמירת מצב מ-Persistent Disk בסוגי מכונות N2 ל-Hyperdisk בסוגי מכונות N4.
- אשכול מקור: שתי פריסות של MySQL נמצאות במרחבי שמות נפרדים,
namespace-aו-namespace-b, במאגר צמתים מסדרת מכונות N2. בפריסות האלה נעשה שימוש בדיסק מתמיד שמבוסס על SSD לאחסון נתונים. - אסטרטגיית גיבוי: מפעילים את הסוכן Backup for GKE באשכול ויוצרים תוכנית גיבוי כדי לתעד את מרחבי השמות, נתוני הנפח והסודות. לאחר מכן, אתם מבצעים גיבוי ידני כדי ליצור נקודת שחזור בזמן.
- טרנספורמציה ושחזור: מגדירים תוכנית שחזור באמצעות כללי טרנספורמציה כדי להתאים את המשאבים לסביבת היעד.
הכללים האלה מבצעים את הפעולות הבאות:
- מחליפים את
StorageClassמ-premium-rwo(PD) לסוג אחסון Hyperdisk בשםbalanced-storage. - משנים את כללי הזיקה של ה-Pod כדי לוודא שעומסי העבודה ששוחזרו מתוזמנים במאגר צמתים חדש של N4.
- מחליפים את
- סביבת היעד: אתם מקצים אשכול GKE חדש עם סוגי מכונות N4. תהליך השחזור יוצר מחדש את הדיסקים כנפחי Hyperdisk מהגיבוי, ומפריס את מופעי MySQL בצמתי N4 תואמים.
מטרות
במדריך הזה תלמדו איך:
- הכנת אפליקציות עם שמירת מצב (stateful) ב-GKE לגיבוי.
- מפעילים את התוסף Backup for GKE.
- יוצרים תוכנית גיבוי ומגבים את אשכול המקור.
- יוצרים תוכנית שחזור שמשתמשת בכללי המרה כדי להעביר את האחסון ל-Hyperdisk.
- משחזרים את עומס העבודה לאשכול חדש ומאמתים את הנתונים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
- GKE
- Compute Engine (Persistent Disk and Hyperdisk)
- Backup for GKE
בעזרת מחשבון העלויות אתם יכולים להעריך את העלויות בהתאם לשימוש הצפוי.
לפני שמתחילים
- נכנסים לחשבון 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.
Enable the Compute Engine, GKE, Backup for GKE, and IAM APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
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.
Enable the Compute Engine, GKE, Backup for GKE, and IAM APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
צריך לוודא שיש לכם בפרויקט את התפקיד או התפקידים הבאים: roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin, roles/gkebackup.admin, roles/monitoring.viewer
בדיקת התפקידים
-
נכנסים לדף IAM במסוף Google Cloud .
כניסה לדף IAM - בוחרים את הפרויקט.
-
בעמודה Principal, מחפשים את כל השורות שמזהות אתכם או קבוצה שאתם נכללים בה. כדי לדעת באילו קבוצות אתם נכללים, פנו לאדמין.
- בודקים את העמודה Role בכל השורות שבהן מצוין או מופיע השם שלכם, כדי לראות אם רשימת התפקידים כוללת את התפקידים הנדרשים.
מתן התפקידים
-
נכנסים לדף IAM במסוף Google Cloud .
כניסה לדף IAM - בוחרים את הפרויקט.
- לוחצים על Grant access.
-
בשדה New principals, מזינים את מזהה המשתמש. בדרך כלל מזהה המשתמש הוא כתובת האימייל של חשבון Google.
- לוחצים על Select a role ומחפשים את התפקיד.
- כדי לתת עוד תפקידים, לוחצים על Add another role ומוסיפים אותם.
- לוחצים על Save.
-
הגדרת Cloud Shell
-
במסוף Google Cloud , מפעילים את Cloud Shell.
יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. הסשן יופעל תוך כמה שניות.
- מגדירים את פרויקט ברירת המחדל:
gcloud config set project PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט.
הגדרת הסביבה
בקטע הזה מכינים את משתני הסביבה ומשכפלים את מאגר הדוגמאות.
מגדירים את משתני הסביבה של הפרויקט, שמות האשכולות והאזור:
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=backup-gke-migration export TARGET_CLUSTER_PREFIX=restore-gke-migration export ZONE=us-central1-aמחליפים את
PROJECT_IDבמזהה הפרויקט ב- Google Cloud.משכפלים את מאגר המקורות של הקוד לדוגמה ועוברים לספרייה:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/databases/backup-migration
יצירת אשכול GKE של המקור
יוצרים אשכול אזורי עם מאגר צמתים שמשתמש בסוגי מכונות N2 ובאמצעי אחסון מצורפים של Persistent Disk.
יוצרים את האשכול:
gcloud container clusters create ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --location ${ZONE} \ --node-locations ${ZONE} \ --shielded-secure-boot \ --shielded-integrity-monitoring \ --machine-type "e2-micro" \ --num-nodes "1"יוצרים מאגר צמתים עם סוגי מכונות של
n2-standard-4לעומס העבודה במקור:gcloud container node-pools create regular-pool \ --cluster ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --machine-type n2-standard-4 \ --zone ${ZONE} \ --num-nodes 1מפעילים את התוסף Backup for GKE באשכול המקור:
gcloud container clusters update ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --project=${PROJECT_ID} \ --location=${ZONE} \ --update-addons=BackupRestore=ENABLEDמקבלים את פרטי הכניסה לאשכול:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --zone ${ZONE}מוודאים שהסוכן של Backup for GKE מופעל:
gcloud container clusters describe ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --project=${PROJECT_ID} \ --location=${ZONE}הפלט אמור להיראות כך, ולוודא שסוכן הגיבוי מופעל:
addonsConfig: gkeBackupAgentConfig: enabled: true
פריסת MySQL עם נתונים לדוגמה
פורסים שני מסדי נתונים של MySQL במרחבי שמות נפרדים כדי לדמות סביבת ייצור.
יוצרים את מרחבי השמות
namespace-aו-namespace-b:kubectl create namespace namespace-a kubectl create namespace namespace-bפורסים את עומסי העבודה של MySQL ב-
namespace-aוב-namespace-b:פורסים את הקובץ
mysql-a-deployment.yaml:kubectl apply -f manifests/02-mysql/mysql-a-deployment.yaml -n namespace-aקובץ המניפסט הבא יוצר Pod של MySQL ב-
namespace-aעם דיסקים של אחסון מתמיד (persistent disks) מסוג SSD שהוקצו באופן דינמי בצמתים שלregular-pool. סיסמת הבסיס מוגדרת ל-migration:פורסים את הקובץ
mysql-b-deployment.yaml:kubectl apply -f manifests/02-mysql/mysql-b-deployment.yaml -n namespace-bקובץ המניפסט הבא יוצר Pod של MySQL ב-
namespace-bעם דיסקים של אחסון מתמיד (persistent disks) מסוג SSD שהוקצו באופן דינמי בצמתים שלregular-pool. סיסמת הבסיס מוגדרת ל-migration:
פורסים Pod של לקוח MySQL כדי להעלות מערכי נתונים לדוגמה:
kubectl apply -f manifests/02-mysql/mysql-client.yaml kubectl wait pods mysql-client --for condition=Ready --timeout=300sקובץ המניפסט הבא פורס Pod של לקוח MySQL:
מתחברים ל-Pod של הלקוח:
kubectl exec -it mysql-client -- bashבתוך ה-Pod, מורידים את מערכי הנתונים לדוגמה Sakila ו-World:
curl --output dataset.tgz "https://downloads.mysql.com/docs/sakila-db.tar.gz" tar -xvzf dataset.tgz -C ./ curl --output world-db.tar.gz "https://downloads.mysql.com/docs/world-db.tar.gz" tar xvzf world-db.tar.gz -C ./מייבאים את קבוצת הנתונים Sakila למסד הנתונים
mysql-a:mysql -u root -h mysql-a.namespace-a -p # Enter password: migration SOURCE /sakila-db/sakila-schema.sql; SOURCE /sakila-db/sakila-data.sql;מאמתים את נתוני Sakila שיובאו:
USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';יוצאים מ-MySQL:
exitמייבאים את קבוצת הנתונים World למסד הנתונים
mysql-b:mysql -u root -h mysql-b.namespace-b -p # Enter password: migration SOURCE /world-db/world.sql;בודקים את הנתונים של העולם שיובאו:
USE world; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'world';הפלט אמור להיראות כך:
+-----------------+------------+ | table_name | table_rows | +-----------------+------------+ | city | 4079 | | country | 239 | | countrylanguage | 984 | +-----------------+------------+יוצאים מ-MySQL:
exitיוצאים מה-shell של ה-Pod של הלקוח:
exit
גיבוי של אשכול GKE
לגבות את כל האשכול, כולל סודות ונפחים.
יצירת תוכנית גיבוי:
gcloud beta container backup-restore backup-plans create main-plan \ --project=${PROJECT_ID} \ --location=us-central1 \ --cluster=projects/${PROJECT_ID}/locations/${ZONE}/clusters/${KUBERNETES_CLUSTER_PREFIX}-cluster \ --selected-namespaces=namespace-a,namespace-b,default \ --include-secrets \ --include-volume-data \ --target-rpo-minutes=1440 \ --backup-retain-days=7 \ --backup-delete-lock-days=3 \ --locked-
--selected-namespaces: מגבה מרחבי שמות ספציפיים כדי למנוע התנגשויות עם משאבי המערכת. -
--include-volume-data: עוזר לוודא שנתוני ה-Persistent Disk מגובים. -
--target-rpo-minutes: הגדרה של יעד להתאוששות מאסון (RPO) בהתאם ללוח הזמנים של הגיבוי. RPO הוא חלון הזמן המקסימלי שבו יכול להיות שנתונים יאבדו, והוא קובע את תדירות הגיבוי. אם בוחרים בגיבוי כל1440דקות (יום אחד), הגיבויים מתוזמנים להפעלה מדי יום.
-
כדי ליצור גיבוי:
gcloud beta container backup-restore backups create first-backup \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=main-plan \ --wait-for-completionמחכים עד שמופיע הפלט
Backup state: SUCCEEDED.מוודאים שהגיבוי נוצר:
gcloud beta container backup-restore backups list \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=main-plan
שחזור עם טרנספורמציה של Hyperdisk
משחזרים את הגיבוי לאשכול חדש. השחזור משנה את האחסון מ-Persistent Disk ל-Hyperdisk ומעביר את עומסי העבודה לצמתי N4.
יוצרים את אשכול GKE היעד בצומת N4:
gcloud container clusters create ${TARGET_CLUSTER_PREFIX}-cluster \ --location ${ZONE} \ --node-locations ${ZONE} \ --shielded-secure-boot \ --shielded-integrity-monitoring \ --machine-type "e2-micro" \ --num-nodes "1"יוצרים מאגר צמתים עם סוגי מכונות מסוג
n4-standard-4, שנדרשים ל-Hyperdisk:gcloud container node-pools create hyperdisk-pool \ --cluster ${TARGET_CLUSTER_PREFIX}-cluster \ --machine-type n4-standard-4 \ --zone ${ZONE} \ --num-nodes 1מקבלים את פרטי הכניסה לאשכול היעד:
gcloud container clusters get-credentials ${TARGET_CLUSTER_PREFIX}-cluster --zone ${ZONE}החלת Hyperdisk
StorageClassבשםbalanced-storage:kubectl apply -f manifests/01-storage-class/storage-class-hdb.yamlהמניפסט הבא מגדיר Hyperdisk
StorageClass:בודקים את כללי הטרנספורמציה בקובץ
manifests/03-transformation-rule/volume.yaml. בקובץ הזה מוגדר איך משנים את המשאבים במהלך השחזור:- PVC transformation: משנה את
storageClassNameל-balanced-storage(Hyperdisk). - טרנספורמציה של פריסה: מעדכנת את ההעדפה של הצומת כדי לתזמן את ה-Pods בצמתים של
n4-standard-4.
- PVC transformation: משנה את
יוצרים תוכנית שחזור באמצעות כללי הטרנספורמציה הבאים:
gcloud beta container backup-restore restore-plans create main-restore \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=projects/${PROJECT_ID}/locations/us-central1/backupPlans/main-plan \ --cluster=projects/${PROJECT_ID}/locations/${ZONE}/clusters/${TARGET_CLUSTER_PREFIX}-cluster \ --namespaced-resource-restore-mode=merge-replace-on-conflict \ --all-namespaces \ --cluster-resource-conflict-policy=use-existing-version \ --cluster-resource-scope-selected-group-kinds=cluster-resource-scope-all-group-kinds \ --volume-data-restore-policy=restore-volume-data-from-backup \ --transformation-rules-file=manifests/03-transformation-rule/volume.yamlמבצעים את השחזור:
gcloud beta container backup-restore restores create first-restore \ --project=${PROJECT_ID} \ --location=us-central1 \ --restore-plan=main-restore \ --backup=projects/${PROJECT_ID}/locations/us-central1/backupPlans/main-plan/backups/first-backup
אימות ההעברה
מוודאים שהאפליקציות פועלות באשכול החדש ושהנתונים תקינים.
בודקים אם ה-Pods פועלים:
kubectl get pods -Aמתחברים ל-Pod של לקוח MySQL באשכול החדש:
# Verify that the client Pod is running kubectl apply -f manifests/02-mysql/mysql-client.yaml kubectl wait pods mysql-client --for condition=Ready --timeout=300s kubectl exec -it mysql-client -- bashמאמתים את מסד הנתונים Sakila ששוחזר ב-
namespace-a:mysql -u root -h mysql-a.namespace-a -p # Password: migration USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';מאמתים את מסד הנתונים World ששוחזר ב-
namespace-b:mysql -u root -h mysql-b.namespace-b -p # Password: migration USE world; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'world';
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים הנפרדים.
מוחקים את אשכולות GKE:
gcloud container clusters delete ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${ZONE} --quiet gcloud container clusters delete ${TARGET_CLUSTER_PREFIX}-cluster --location ${ZONE} --quietמחיקת הגיבוי ותוכניות השחזור:
# Delete the restore plan gcloud beta container backup-restore restore-plans delete main-restore \ --project=${PROJECT_ID} \ --location=us-central1 \ --quiet # Delete the Backup gcloud beta container backup-restore backups delete first-backup \ --project=${PROJECT_ID} \ --location=us-central1 \ --backup-plan=main-plan \ --quiet # Delete the backup plan gcloud beta container backup-restore backup-plans delete main-plan \ --project=${PROJECT_ID} \ --location=us-central1 \ --quiet