במסמך הזה מוסבר איך ליצור snapshot של נפח אחסון ואז להשתמש ב-snapshot כדי לשחזר את נפח האחסון. ההוראות שבהמשך רלוונטיות לאשכולות שמשתמשים במנהל התקן CSI של vSphere.
לפני שמתחילים
מומלץ לקרוא את המאמר בנושא שימוש בדרייבר של vSphere Container Storage Interface.
מוודאים שלקלאסטר יש StorageClass בשם standard-rwo ושהותקן מנהל התקן vSphere CSI.
גרסת vSphere, ESXi ו-vCenter Server צריכות להיות גרסה 7.0 Update 3 ואילך. מידע נוסף מופיע במאמר פתרון בעיות באחסון.
סקירה כללית של השלבים
אלה השלבים העיקריים בתרגיל שמופיע במסמך הזה:
- יוצרים PersistentVolumeClaim.
- יוצרים PersistentVolumeClaim שמבקש את סוג האחסון
standard-rwo. לאחר מכן, האשכול מקצה באופן דינמי נפח אחסון מתמיד ומשייך אותו לדרישת נפח האחסון המתמיד.
- יצירת פריסה.
- יוצרים פריסה עם Pod אחד. ה-Pod מציין נפח אחסון על סמך PersistentVolumeClaim. הקונטיינר היחיד ב-Pod מעלה את עוצמת הקול ב-
/hello/.
- כתיבת קובץ לנפח האחסון של ה-Pod.
- Create a file named
hello.txtin the Pod volume. התוכן של הקובץ הוא Hello World!
- יוצרים VolumeSnapshot.
- יוצרים VolumeSnapshot שמתעד את המצב של נפח האחסון של ה-Pod.
- פוגמים בקובץ.
- משנים את הקובץ
hello.txtכך שהוא ייראה כמו קובץ פגום. התוכן של הקובץ הוא עכשיו 'Hello W-corrupted-file-orld!'
- אפשר להשתמש בתמונת המצב כדי לשחזר את עוצמת הקול.
- יוצרים PersistentVolumeClaim שני שמשתמש ב-VolumeSnapshot כמקור הנתונים שלו. עורכים את הפריסה כך שהנפח שלה ישויך ל-PersistentVolumeClaim החדש. לאחר מכן מוודאים שקובץ
hello.txtשוחזר.
יצירת PersistentVolumeClaim
זוהי הגדרת Manifest ל-PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard-rwo
במניפסט הקודם אפשר לראות שהערך של storageClassName הוא
standard-rwo. זהו סוג האחסון שמשויך לדרייבר vSphere CSI.
שומרים את קובץ המניפסט בקובץ בשם my-pvc.yaml. יוצרים את PersistentVolumeClaim וצופים בו:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc
בפלט אפשר לראות שה-PersistentVolumeClaim קשור ל-PersistentVolume שהוקצה באופן דינמי. לדוגמה, הפלט הבא מראה ש-PersistentVolumeClaim בשם my-pvc קשור ל-PersistentVolume בשם pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5:
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
יצירת פריסה
זוהי דוגמה למניפסט של פריסה:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
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: my-volume
mountPath: /hello/
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
במסגרת התרגיל הזה, חשוב להבין את הנקודות הבאות לגבי מניפסט הפריסה שלמעלה:
ה-Pod מבקש אחסון על ידי ציון PersistentVolumeClaim,
my-pvc, שיצרתם קודם.ל-Pod יש קונטיינר אחד, והקונטיינר מטמיע את אמצעי האחסון ב-
/hello/.
שומרים את המניפסט בקובץ בשם my-deployment.yaml ויוצרים את הפריסה:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
לפריסת ה-Deployment יש Pod אחד. אחזור השם של ה-Pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
רושמים את שם ה-Pod. לדוגמה, בפלט הבא, שם ה-Pod הוא my-deployment-7575c4f5bf-r59nt:
my-deployment-7575c4f5bf-r59nt 1/1 Running 0 65s
יוצרים קובץ בנפח האחסון של ה-Pod ומציגים את הקובץ.
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'echo "Hello World!" > /hello/hello.txt'
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'cat /hello/hello.txt'
הפלט מציג את התוכן של הקובץ /hello/hello.txt:
Hello World!
יצירת קובץ snapshot
זוהי מניפסט של VolumeSnapshot:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
volumeSnapshotClassName: csi-vsphere-snapshot-class
source:
persistentVolumeClaimName: my-pvc
שומרים את המניפסט בקובץ בשם my-snapshot.yaml ויוצרים את VolumeSnapshot:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
השחתת הקובץ באמצעי האחסון
משנים את התוכן של hello.txt כך שייראה כאילו הוא נפגם:
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'cat /hello/hello.txt'
בפלט אפשר לראות שהקובץ השתנה:
Hello W-corrupted-file-orld!
שחזור
זוהי מניפסט של PersistentVolumeClaim שני:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc-2
spec:
storageClassName: standard-rwo
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
במניפסט הקודם אפשר לראות שמקור הנתונים לתביעת PersistentVolume החדשה הוא VolumeSnapshot שיצרתם קודם.
שומרים את קובץ המניפסט בקובץ בשם my-pvc-2.yaml. יוצרים את PersistentVolumeClaim וצופים בו:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2
פותחים את הפריסה לעריכה:
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
משנים את my-pvc ל-my-pvc-2 וסוגרים את העורך:
…
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc-2
הפריסה מוחקת את ה-Pod ויוצרת Pod חדש שמשתמש ב-PersistentVolumeClaim החדש.
ממתינים כמה דקות ואז מקבלים את השם החדש של ה-Pod:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
מוודאים שעוצמת הקול של ה-Pod שוחזרה:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec NEW_POD_NAME \ -- sh -c 'cat /hello/hello.txt'
הפלט מראה שהנפח שוחזר:
Hello World!
פתרון בעיות
הוראות לפתרון בעיות מופיעות במאמר פתרון בעיות שקשורות לאחסון.