בדף הזה מוסבר איך לגבות ולשחזר אחסון של Persistent Disk באמצעות תמונות מצב של נפחים.
למבוא, אפשר לעיין במאמר מידע על תמונות מצב של נפחי אחסון ב-Kubernetes.
דרישות
כדי להשתמש בתמונות מצב של נפחים ב-GKE, צריך לעמוד בדרישות הבאות:
משתמשים במנהל התקן CSI שתומך בתמונות מצב. מנהל ההתקן של הדיסק הקשיח הקבוע בתוך העץ לא תומך בתמונות מצב. כדי ליצור ולנהל תמונות מצב, צריך להשתמש באותו מנהל התקן 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 של דיסק מתמשך ב-Compute Engine ב-
VolumeSnapshot, צריך להשתמש בגרסאות GKE 1.17.6-gke.4 ואילך.
- יש לכם
PersistentVolumeClaimקיים שבו אתם רוצים להשתמש לצילום תמונה. התקןPersistentVolumeשמשמש כמקור לתמונת מצב צריך להיות מנוהל על ידי מנהל התקן CSI. כדי לוודא שאתם משתמשים בדרייבר CSI, בודקים שלמפרטPersistentVolumeיש קטעcsiעםdriver: pd.csi.storage.gke.ioאוfilestore.csi.storage.gke.io. אםPersistentVolumeמוקצה באופן דינמי על ידי מנהל התקן CSI, כפי שמתואר בקטעים הבאים, הוא מנוהל על ידי מנהל התקן CSI.
מגבלות
כל ההגבלות על יצירת תמונת מצב של דיסק ב-Compute Engine חלות גם על GKE.
שיטות מומלצות
חשוב לפעול לפי השיטות המומלצות ליצירת תמונות מצב של דיסקים ב-Compute Engine כשמשתמשים בתמונות מצב של דיסקים לאחסון מתמיד Volume ב-GKE.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
יצירה של snapshot של נפח ושימוש בו
בדוגמאות במאמר הזה מוסבר איך לבצע את המשימות הבאות:
- יצירת
PersistentVolumeClaimוDeployment. - מוסיפים קובץ ל-
PersistentVolumeשבו משתמשDeployment. - יוצרים
VolumeSnapshotClassכדי להגדיר את ה-snapshot. - יצירת קובץ snapshot של עוצמת הקול של
PersistentVolume. - מוחקים את קובץ הבדיקה.
- משחזרים את
PersistentVolumeלקובץ ה-snapshot שיצרתם. - איך מוודאים שהשחזור פעל
כדי להשתמש בתמונת מצב של נפח, צריך לבצע את השלבים הבאים:
- יוצרים אובייקט
VolumeSnapshotClassכדי לציין את מנהל ההתקן של CSI ואת מדיניות המחיקה של התמונה. - יוצרים אובייקט
VolumeSnapshotכדי לבקש תמונת מצב של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 של דיסק מתמשך ב-Compute Engine. למידע נוסף, ראו שימוש ב-Compute Engine Persistent Disk CSI driver.במאפיין
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
משתמשים בגרסת
v1API עבור אשכולות שפועלות בהם גרסאות 1.21 ואילך.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: Deleteבדוגמה הזו:
שדה
driverמשמש את מנהל ההתקן של CSI להקצאת תמונת המצב. בדוגמה הזו,pd.csi.storage.gke.ioמשתמש במנהל ההתקן של ה-CSI של דיסק מתמשך ב-Compute Engine.השדה
deletionPolicyאומר ל-GKE מה לעשות עם האובייקטVolumeSnapshotContentועם התמונה הבסיסית כשמוחקים את האובייקט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תואם באשכול. האובייקט הזה מאחסן את התמונה ואת הקישורים של אובייקטים מסוג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'
אם תמונת המצב מוכנה לשימוש, הפלט ייראה כך:
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 של דיסק או של תמונה, שההבדלים ביניהם הם:
- תמונות מצב של דיסקים: כדאי ליצור תמונות מצב בתדירות גבוהה ולשחזר אותן בתדירות נמוכה.
- תמונות מצב של תמונות: צילום תמונות מצב לעיתים רחוקות ושחזור לעיתים קרובות. יכול להיות שייקח יותר זמן ליצור תמונות מצב של תמונות מאשר תמונות מצב של דיסקים.
פרטים נוספים זמינים במאמר בנושא מגבלות על תדירות יצירת תמונות מצב. הידיעה מהו סוג הצילום עוזרת לפתור בעיות.
בודקים את
VolumeSnapshot:kubectl describe volumesnapshot SNAPSHOT_NAMEהשדה
volumeSnapshotClassNameמציין את סוג הצילום.kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAMEהפרמטר
snapshot-typeיצייןsnapshotsאוimages. אם לא מציינים ערך, ברירת המחדל היאsnapshots.אם אין מחלקה של תמונת מצב (לדוגמה, אם תמונת המצב נוצרה באופן סטטי), צריך לבדוק את
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.