בדף הזה מוסבר איך לגבות ולשחזר את האחסון הבסיסי של Filestore שמשויך לאשכולות GKE באמצעות תמונות מצב של נפח Kubernetes.
יצירת תמונת מצב של נפח Kubernetes מקבילה ליצירת גיבוי של Filestore.
מידע נוסף זמין במאמר בנושא תמונות מצב של נפחים ב-Kubernetes.
דרישות
כדי להשתמש בתמונות מצב של נפחים ב-GKE, צריך לעמוד בדרישות הבאות:
- צריך לפרוס את מנהל ההתקן של Filestore CSI. אפשר להשתמש רק ברמות השירות הבאות של Filestore:
| רמת שירות | סוג השיתוף | הגרסה המינימלית של GKE ל-NFSv3 | הגרסה המינימלית של GKE ל-NFSv4.1 |
|---|---|---|---|
| Enterprise | שיתוף יחיד, שיתוף מרובה | 1.25 | 1.33 (שיתוף יחיד בלבד) |
| אזורית (1 TiB - 9.75 TiB) | שיתוף יחיד | 1.27 | 1.33 |
| אזורי (10 TiB – 100 TiB) | שיתוף אחד | 1.27 | 1.33 |
| אזורי (1 TiB - 100 TiB) | שיתוף יחיד | 1.33.4-gke.1172000 | 1.33.4-gke.1172000 |
| HDD בסיסי (100 GiB עד 63.9 TiB) | שיתוף יחיד | 1.33 | לא נתמך |
| HDD בסיסי | שיתוף יחיד | 1.21 | לא נתמך |
| SSD בסיסי | שיתוף יחיד | 1.21 | לא נתמך |
- להשתמש בגרסאות 1.17 ומעלה של מישור הבקרה.
כדי להשתמש במנהל התקן CSI של Filestore ב-
VolumeSnapshot, צריך להשתמש במספר הגרסה של GKE שרלוונטי לרמת השירות שלכם.
- יש לכם
PersistentVolumeClaimקיים שאתם רוצים להשתמש בו לתמונת מצב. מנהל התקן CSI צריך לנהל את ה-PersistentVolumeשמשמש כמקור לתמונת המצב. כדי לוודא שאתם משתמשים בדרייבר CSI, בודקים שלמפרטPersistentVolumeיש קטעcsiעםdriver: pd.csi.storage.gke.ioאוfilestore.csi.storage.gke.io. אםPersistentVolumeמוקצה באופן דינמי על ידי מנהל התקן CSI, כפי שמתואר בקטעים הבאים, הוא מנוהל על ידי מנהל התקן CSI.
מגבלות
על נפחי תמונות המצב חלות אותן מגבלות גודל שחלות על נפחים רגילים. לדוגמה, גודל התמונות של Filestore צריך להיות לפחות 1 TiB ברמת ה-HDD הבסיסית.
ל-Filestore CSI driver אין תמיכה בהקצאת משאבים דינמית או בתהליכי עבודה של גיבויים עבור רמת השירות האזורית של Filestore:
אפשר לגבות רק שיתוף אחד לכל מכונה בכל פעם. כלומר, אי אפשר ליצור גיבוי של כמה שיתופים או לשחזר גיבוי למכונה עם כמה שיתופים. עם זאת, בקשות גיבוי משני שיתופים שונים בשני מכונות שונות של Filestore יפעלו בו-זמנית.
אפשר לשחזר גיבוי של מכונה בסיסית למכונת המקור באותה רמת שירות, למכונה שכבר קיימת או למכונה חדשה. אם בוחרים במכונה חדשה, אפשר לבחור בין מכונת HDD בסיסית למכונת SSD בסיסית, בלי קשר לרמה של מכונת המקור.
אי אפשר לשחזר מופעים אזוריים, מופעים של אזורים ומקרים ארגוניים למקור או למופע קיים, אלא רק למופע חדש. רמת המופע החדש לא חייבת להיות זהה לרמת המופע של המקור. לדוגמה, אפשר לשחזר גיבוי של מכונה אזורית למכונה של אזור ספציפי. הקיבולת שהוקצתה למופע החדש צריכה להיות שווה לקיבולת שהוקצתה למופע המקור או גדולה ממנה.
רשימה מלאה של מגבלות התכונה מופיעה במאמר מגבלות התכונה של גיבוי Filestore.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.
יצירה ושימוש בתמונת מצב של אמצעי אחסון
הדוגמאות במאמר הזה מראות איך לבצע את הפעולות הבאות:
- יוצרים
PersistentVolumeClaimוDeployment. - מוסיפים קובץ ל-
PersistentVolumeשבו משתמש ה-Deployment. - יוצרים
VolumeSnapshotClassכדי להגדיר את ה-snapshot. - יוצרים קובץ snapshot של ה-
PersistentVolume. - מוחקים את קובץ הבדיקה.
- משחזרים את
PersistentVolumeלקובץ ה-snapshot שיצרתם. - מוודאים שהשחזור הצליח.
כדי להשתמש בתמונת מצב של אמצעי אחסון, צריך לבצע את השלבים הבאים:
- יוצרים אובייקט
VolumeSnapshotClassכדי לציין את מנהל ההתקן של CSI ואת מדיניות המחיקה של התמונה. - יוצרים אובייקט
VolumeSnapshotכדי לבקש קובץ snapshot שלPersistentVolumeClaimקיים. - אפשר להשתמש ב-
VolumeSnapshotבPersistentVolumeClaimכדי לשחזר נפח ל-snapshot הזה או ליצור נפח חדש באמצעות ה-snapshot.
יצירת PersistentVolumeClaim וDeployment
כדי ליצור את האובייקט
PersistentVolumeClaim, שומרים את המניפסט הבא בתורmy-pvc.yaml:Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Tiבדוגמה הזו נוצר PVC של Filestore ברמת Enterprise. מידע נוסף זמין במאמר בנושא גישה למופעי Filestore באמצעות מנהל התקנים של Filestore CSI.
בשביל
spec.storageClassName, אפשר לציין כל מחלקת אחסון שמשתמשת במנהל התקן CSI נתמך.מחילים את המניפסט:
kubectl apply -f my-pvc.yamlכדי ליצור
Deployment, שומרים את המניפסט הבא בתורmy-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: google/cloud-sdk:slim args: [ "sleep", "3600" ] volumeMounts: - name: sdk-volume mountPath: /usr/share/hello/ volumes: - name: sdk-volume persistentVolumeClaim: claimName: my-pvcמחילים את המניפסט:
kubectl apply -f my-deployment.yamlבודקים את הסטטוס של
Deployment:kubectl get deployment hello-appיכול להיות שיעבור קצת זמן עד שה
Deploymentיהיה מוכן. אפשר להריץ את הפקודה הקודמת עד שיוצג פלט שדומה לזה:NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
הוספת קובץ בדיקה לנפח האחסון
הצגת
Podsב-Deployment:kubectl get pods -l app=hello-appהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56sיוצרים קובץ בדיקה ב
Pod:kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'מחליפים את
POD_NAMEבשם שלPod.מוודאים שהקובץ קיים:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'הפלט אמור להיראות כך:
Hello World!
יצירת אובייקט VolumeSnapshotClass
יוצרים אובייקט VolumeSnapshotClass כדי לציין את מנהל ההתקן של CSI ואת deletionPolicy עבור קובץ ה-snapshot של נפח האחסון. אפשר להפנות לאובייקטים מסוג VolumeSnapshotClass כשיוצרים אובייקטים מסוג VolumeSnapshot.
שומרים את המניפסט הבא בתור
volumesnapshotclass.yaml.Filestore
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: filestore.csi.storage.gke.io parameters: type: backup deletionPolicy: Deleteבדוגמה הזו:
- השדה
driverמשמש את מנהל ההתקן של CSI להקצאת תמונת המצב. בדוגמה הזו,filestore.csi.storage.gke.ioמשתמש במנהל התקן ה-CSI של Filestore. - השדה
deletionPolicyמציין ל-GKE מה לעשות עם האובייקטVolumeSnapshotContentועם קובץ ה-snapshot הבסיסי כשמוחקים את האובייקט המקושרVolumeSnapshot. מציינים אתDeleteכדי למחוק את האובייקטVolumeSnapshotContentואת קובץ ה-snapshot הבסיסי. צריך לציין אתRetainאם רוצים לשמור אתVolumeSnapshotContentואת קובץ ה-snapshot הבסיסי.
- השדה
מחילים את המניפסט:
kubectl apply -f volumesnapshotclass.yaml
יצירת VolumeSnapshot
אובייקט VolumeSnapshot הוא בקשה לתמונת מצב של אובייקט PersistentVolumeClaim קיים. כשיוצרים אובייקט VolumeSnapshot, GKE יוצר ומקשר אותו אוטומטית לאובייקט VolumeSnapshotContent, שהוא משאב באשכול כמו אובייקט PersistentVolume.
שומרים את המניפסט הבא בתור
volumesnapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvcמחילים את המניפסט:
kubectl apply -f volumesnapshot.yamlאחרי שיוצרים קובץ snapshot של
Volume, GKE יוצר אובייקטVolumeSnapshotContentתואם באשכול. האובייקט הזה מאחסן את התמונה ואת הקישורים של אובייקטים מסוגVolumeSnapshot. אין לכם אינטראקציה ישירה עם אובייקטים שלVolumeSnapshotContents.מוודאים ש-GKE יצר את האובייקט
VolumeSnapshotContents:kubectl get volumesnapshotcontentsהפלט אמור להיראות כך:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
אחרי שנוצר תוכן התמונה של Volume, מנהל ההתקן של CSI שצוין ב-VolumeSnapshotClass יוצר תמונה במערכת האחסון המתאימה. אחרי ש-GKE יוצר תמונת מצב במערכת האחסון ומקשר אותה לאובייקט VolumeSnapshot באשכול, תמונת המצב מוכנה לשימוש. כדי לבדוק את הסטטוס, מריצים את הפקודה הבאה:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
אם קובץ ה-snapshot מוכן לשימוש, הפלט דומה לפלט הבא:
NAME READY
my-snapshot true
מחיקת קובץ הבדיקה
מוחקים את קובץ הבדיקה שיצרתם:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'מוודאים שהקובץ כבר לא קיים:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'הפלט אמור להיראות כך:
cat: /usr/share/hello/hello.txt: No such file or directory
שחזור תמונת המצב של האחסון
שומרים את המניפסט הבא בתור
pvc-restore.yaml:Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Tiמחילים את המניפסט:
kubectl apply -f pvc-restore.yamlמעדכנים את הקובץ
my-deployment.yamlכדי להשתמש בPersistentVolumeClaimהחדש:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restoreמחילים את מניפסט העדכונים:
kubectl apply -f my-deployment.yaml
בודקים שתמונת המצב שוחזרה בהצלחה
משיגים את השם של ה-
Podהחדש ש-GKE יוצר בשביל ה-Deploymentהמעודכן:kubectl get pods -l app=hello-app
מוודאים שקובץ הבדיקה קיים:
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
מחליפים את NEW_POD_NAME בשם של Pod החדש שנוצר על ידי GKE.
הפלט אמור להיראות כך:
Hello World!
ייבוא של תמונת מצב קיימת
אתם יכולים להשתמש בתמונת מצב קיימת של נפח שנוצרה מחוץ לאשכול הנוכחי כדי להקצות באופן ידני את האובייקט VolumeSnapshotContents. לדוגמה, אתם יכולים לאכלס נפח אחסון ב-GKE עם תמונת מצב שלCloud de Confiance משאב אחר שנוצר באשכול אחר.
מאתרים את שם קובץ ה-snapshot.
מסוף Cloud de Confiance
Google Cloud CLI
מריצים את הפקודה הבאה:
gcloud compute snapshots listהפלט אמור להיראות כך:
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READYשומרים את המניפסט הבא של
VolumeSnapshotבתורrestored-snapshot.yaml.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-contentהחלת המניפסט:
kubectl apply -f restored-snapshot.yamlשומרים את המניפסט הבא של
VolumeSnapshotContentבתורrestored-snapshot-content.yaml. מחליפים את השדהsnapshotHandleבמזהה הפרויקט ובשם של קובץ ה-snapshot. כדי שהקישור הדו-כיווני יהיה תקף, גםvolumeSnapshotRef.nameוגםvolumeSnapshotRef.namespaceצריכים להצביע עלVolumeSnapshotשנוצר קודם.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: restored-snapshot-content spec: deletionPolicy: Retain driver: filestore.csi.storage.gke.io source: snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME volumeSnapshotRef: kind: VolumeSnapshot name: restored-snapshot namespace: defaultמחילים את המניפסט:
kubectl apply -f restored-snapshot-content.yamlשומרים את המניפסט הבא של
PersistentVolumeClaimבתורrestored-pvc.yaml. בקר האחסון של Kubernetes יחפשVolumeSnapshotבשםrestored-snapshotואז ינסה למצוא או ליצור באופן דינמיPersistentVolumeכמקור הנתונים. לאחר מכן תוכלו להשתמש ב-PVC הזה ב-Pod כדי לגשת לנתונים המשוחזרים.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restored-pvc spec: dataSource: name: restored-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteOnce resources: requests: storage: 1Giהחלת המניפסט:
kubectl apply -f restored-pvc.yamlשומרים את קובץ המניפסט הבא
Podבשםrestored-pod.yamlבהתייחס ל-PersistentVolumeClaim. מנהל ההתקן של CSI יקצהPersistentVolumeויאכלס אותו מתמונת המצב.apiVersion: v1 kind: Pod metadata: name: restored-pod spec: containers: - name: busybox image: busybox args: - sleep - "3600" volumeMounts: - name: source-data mountPath: /demo/data volumes: - name: source-data persistentVolumeClaim: claimName: restored-pvc readOnly: falseמחילים את המניפסט:
kubectl apply -f restored-pod.yamlמוודאים שהקובץ שוחזר:
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
הסרת המשאבים
כדי לא לצבור חיובים בחשבון Cloud de Confiance by S3NS על המשאבים שבהם השתמשתם בדף הזה, מבצעים את הפעולות הבאות.
מחיקת
VolumeSnapshot:kubectl delete volumesnapshot my-snapshotמוחקים את
VolumeSnapshotClass:kubectl delete volumesnapshotclass my-snapshotclassמחיקת
Deployment:kubectl delete deployments hello-appמוחקים את
PersistentVolumeClaimהאובייקטים:kubectl delete pvc my-pvc pvc-restore