במסמך הזה מוסבר איך ליצור snapshot של נפח אחסון ואז להשתמש ב-snapshot כדי לשחזר את נפח האחסון. ההוראות שבהמשך רלוונטיות לאשכולות שמשתמשים במנהל התקנים של vSphere CSI.
לפני שמתחילים
מידע נוסף על שימוש בדרייבר של 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שוחזר.
יצירת בקשה לנפח אחסון מתמיד
זוהי הגדרת 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
לפריסה יש 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!
יצירת תמונת מצב
זוהי מניפסט של 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!
פתרון בעיות
הוראות לפתרון בעיות מופיעות במאמר פתרון בעיות שקשורות לאחסון.