גיבוי ושחזור של האחסון ב-Persistent Disk ב-Google Kubernetes Engine (GKE) באמצעות קובצי snapshot של אמצעי אחסון. תמונת מצב של נפח יוצרת עותק של נתוני הדיסק לאחסון מתמיד בנקודת זמן מסוימת, ומאפשרת שחזור ובדיקה יעילים. היכולת הזו עוזרת להגן מפני אובדן נתונים, לחזור למצבים קודמים ולהבטיח את המשכיות העסק בעומסי העבודה. למידע נוסף על המושגים הבסיסיים של קובצי snapshot של אמצעי אחסון ב-Kubernetes, קראו את המאמר מידע על קובצי snapshot של אמצעי אחסון ב-Kubernetes.
דרישות
כדי להשתמש בתמונות מצב של אמצעי אחסון ב-GKE, צריך לעמוד בדרישות הבאות:
משתמשים ב-CSI driver שתומך בתמונות מצב. מנהל ההתקן של Persistent Disk בעץ לא תומך בתמונות מצב. כדי ליצור ולנהל קובצי snapshot, צריך להשתמש באותו מנהל התקן CSI כמו ה-
PersistentVolumeClaim(PVC) הבסיסי.לצילומי מצב של נפחי אחסון של דיסקים לאחסון מתמיד (PD), משתמשים במנהל התקן ה-CSI של דיסקים לאחסון מתמיד ב-Compute Engine. הדרייבר של CSI לדיסקים לאחסון מתמיד ב-Compute Engine מותקן כברירת מחדל באשכולות Linux חדשים שמופעלת בהם גרסה 1.18.10-gke.2100 ואילך של GKE, או גרסה 1.19.3-gke.2100 ואילך. אפשר גם להפעיל את מנהל ההתקן CSI של דיסק לאחסון מתמיד ב-Compute Engine באשכול קיים.
רשימה של כל מנהלי ה-CSI שתומכים בתמונות מצב מופיעה בעמודה Other features (תכונות אחרות) בקטע Drivers (מנהלי התקנים) במסמכי Kubernetes.
להשתמש בגרסאות 1.17 ומעלה של מישור הבקרה. כדי להשתמש במנהל ההתקן של ה-CSI של Persistent Disk ב-Compute Engine ב-
VolumeSnapshot, צריך להשתמש בגרסאות GKE 1.17.6-gke.4 ואילך.
- יש לכם
PersistentVolumeClaimקיים שאתם רוצים להשתמש בו בשביל תמונת המצב. מנהל התקן CSI צריך לנהל את ה-PersistentVolumeשמשמש כמקור לתמונת המצב. כדי לוודא שאתם משתמשים במנהל התקן CSI, צריך לבדוק שבמפרטPersistentVolumeיש קטעcsiעםdriver: pd.csi.storage.gke.ioאוfilestore.csi.storage.gke.io. אםPersistentVolumeמוקצה באופן דינמי על ידי מנהל התקן CSI, כפי שמתואר בקטעים הבאים, הוא מנוהל על ידי מנהל התקן CSI.
מגבלות
כל ההגבלות על יצירת תמונת מצב של דיסק ב-Compute Engine חלות גם על GKE.
שיטות מומלצות
כשמשתמשים בתמונות מצב של Persistent Disk Volume ב-GKE, חשוב לפעול לפי השיטות המומלצות לתמונות מצב של דיסקים ב-Compute Engine.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את 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לתמונת המצב שיצרתם. - איך מוודאים שהשחזור פעל
כדי להשתמש בתמונת מצב של נפח, צריך לבצע את השלבים הבאים:
- יוצרים אובייקט
VolumeSnapshotClassכדי לציין את מנהל ההתקן של CSI ואת מדיניות המחיקה של התמונה. - יוצרים אובייקט
VolumeSnapshotכדי לבקש קובץ snapshot שלPersistentVolumeClaimקיים. - אפשר להשתמש ב-
VolumeSnapshotבPersistentVolumeClaimכדי לשחזר נפח ל-snapshot הזה או ליצור נפח חדש באמצעות ה-snapshot.
יצירת PersistentVolumeClaim וDeployment
כדי ליצור את האובייקט
PersistentVolumeClaim, שומרים את המניפסט הבא בתורmy-pvc.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Giבדוגמה הזו משתמשים במחלקת האחסון
standard-rwoשמותקנת כברירת מחדל עם מנהל התקן ה-CSI של Persistent Disk ב-Compute Engine. מידע נוסף זמין במאמר שימוש במנהל ההתקן של Compute Engine Persistent Disk 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.Persistent Disk
צריך להשתמש בגרסת ה-API
v1לאשכולות שפועלים בגרסאות 1.21 ואילך.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: Deleteבדוגמה הזו:
מנהל ההתקן של CSI משתמש בשדה
driverכדי להקצות את קובץ ה-snapshot. בדוגמה הזו,pd.csi.storage.gke.ioמשתמש במנהל ההתקן של ה-CSI של דיסק מתמשך ב-Compute Engine.השדה
deletionPolicyמציין ל-GKE מה לעשות עם האובייקטVolumeSnapshotContentועם קובץ ה-snapshot הבסיסי כשמוחקים את האובייקט המקושרVolumeSnapshot. מצייניםDeleteכדי למחוק את האובייקטVolumeSnapshotContentואת התמונה המיידית הבסיסית. מצייניםRetainאם רוצים לשמור אתVolumeSnapshotContentואת הצילום מהמצלמה שמתחתיו.כדי להשתמש במיקום אחסון מותאם אישית, מוסיפים פרמטר
storage-locationsלמחלקת התמונות. כדי להשתמש בפרמטר הזה, הגרסה של האשכולות צריכה להיות 1.21 ומעלה.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass parameters: storage-locations: us-east2 driver: pd.csi.storage.gke.io deletionPolicy: Deleteכדי ליצור תמונת דיסק, מוסיפים את הטקסט הבא לשדה
parameters:parameters: snapshot-type: images image-family: IMAGE_FAMILYמחליפים את
IMAGE_FAMILYבשם של משפחת האימג' המועדפת, כמוpreloaded-data.
מחילים את המניפסט:
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אחרי שיוצרים תמונת מצב
Volume, GKE יוצר אובייקטVolumeSnapshotContentתואם באשכול. מאגר אובייקטים זה מאחסן את קובץ ה-snapshot ואת הקישורים של אובייקטים מסוגVolumeSnapshot. אין אינטראקציה ישירה עם אובייקטים שלVolumeSnapshotContents.מוודאים ש-GKE יצר את האובייקט
VolumeSnapshotContents:kubectl get volumesnapshotcontentsהפלט אמור להיראות כך:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
אחרי שנוצר תוכן קובץ ה-Snapshot של Volume, מנהל ההתקן של CSI שציינתם ב-VolumeSnapshotClass יוצר קובץ Snapshot במערכת האחסון המתאימה. אחרי ש-GKE יוצר קובץ snapshot במערכת האחסון ומקשר אותו לאובייקט VolumeSnapshot באשכול, קובץ ה-snapshot מוכן לשימוש. כדי לבדוק את הסטטוס, מריצים את הפקודה הבאה:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
אם תמונת המצב מוכנה לשימוש, הפלט ייראה כך:
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
שחזור תמונת המצב של אמצעי האחסון
אפשר להפנות ל-VolumeSnapshot ב-PersistentVolumeClaim כדי להקצות נפח חדש עם נתונים מנפח קיים, או לשחזר נפח למצב שתועד בתמונת המצב.
כדי להפנות אל VolumeSnapshot בתוך PersistentVolumeClaim, מוסיפים את השדה dataSource אל PersistentVolumeClaim. אותו תהליך משמש בין אם VolumeSnapshotContents מתייחס לתמונת דיסק או לתמונת מצב.
בדוגמה הזו, אתם משתמשים ב-VolumeSnapshot שיצרתם ב-PersistentVolumeClaim חדש ומעדכנים את Deployment כדי להשתמש בטענה החדשה.
בודקים אם אתם משתמשים ב-snapshot של דיסק או של תמונה. ההבדלים ביניהם הם:
- תמונות מצב של דיסקים: יוצרים תמונות מצב לעיתים קרובות ומשחזרים לעיתים רחוקות.
- תמונות מצב של תמונות: כדאי לצלם תמונות מצב לעיתים רחוקות ולשחזר אותן לעיתים קרובות. יכול להיות שייקח יותר זמן ליצור תמונות מצב של תמונות מאשר תמונות מצב של דיסקים.
לפרטים נוספים, ראו מגבלות על תדירות של קובצי Snapshot. אם נתקלים בבעיות, חשוב לדעת מה סוג הצילום כדי לפתור אותן.
בודקים את
VolumeSnapshot:kubectl describe volumesnapshot SNAPSHOT_NAMEהשדה
volumeSnapshotClassNameמציין את מחלקת התמונות.kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAMEהפרמטר
snapshot-typeיצייןsnapshotsאוimages. אם לא מציינים ערך, ברירת המחדל היאsnapshots.אם אין מחלקת קובץ snapshot (לדוגמה, אם קובץ ה-snapshot נוצר באופן סטטי), צריך לבדוק את
VolumeSnapshotContents.sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAMEהפורמט של נקודת האחיזה של קובץ ה-snapshot בפלט מציין את סוג קובץ ה-snapshot, באופן הבא: *projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME: קובץ snapshot של דיסק-
projects/PROJECT_NAME/global/images/IMAGE_NAME: תמונת מצב
שומרים את קובץ המניפסט הבא בשם
pvc-restore.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Giמחילים את המניפסט:
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 משאב אחר שנוצר באשכול אחר.
מאתרים את השם של התמונה.
מסוף 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במזהה הפרויקט ובשם התמונה. כדי שהקישור הדו-כיווני יהיה תקין, גםvolumeSnapshotRef.nameוגםvolumeSnapshotRef.namespaceצריכים להצביע עלVolumeSnapshotשנוצר קודם.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: restored-snapshot-content spec: deletionPolicy: Retain driver: pd.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: standard-rwo 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
המאמרים הבאים
- קוראים את המאמר Kubernetes Volume Snapshot.
- מידע על הרחבת נפח האחסון
- איך מתקינים ידנית מנהל התקן CSI
- מידע על אחסון בלוקים (Persistent Disk) ל-GKE.