אפשר ליצור PersistentVolume מדיסק Persistent קיים שמכיל נתונים ולצרף אותו ל-Pod באשכול Google Kubernetes Engine (GKE). היכולת הזו שימושית לשילוב של נפחי נתונים קיימים בעומסי העבודה של Kubernetes או להעברת נתונים ל-GKE. באמצעות הגישה הזו, תוכלו להריץ את האפליקציות עם הנתונים הדרושים בסביבה שבחרתם, וכך לפשט את ניהול הנתונים.
סקירה כללית
יש שני תרחישים נפוצים שבהם נעשה שימוש בדיסק אחסון מתמיד קיים.
- יצירה ידנית של PersistentVolumeClaim ו-PersistentVolume, קישור ביניהם והפניה אל PersistentVolumeClaim במפרט של Pod.
- שימוש ב-StatefulSet כדי ליצור באופן אוטומטי PersistentVolumeClaims שמשויכים ל-PersistentVolumes שנוצרו באופן ידני, שמתאימים לסדרה של דיסקים קיימים של אחסון מתמיד.
בדוגמאות שבדף הזה נעשה שימוש בדיסקים לאחסון מתמיד ב-Compute Engine.
למרות ש-ext4 הוא סוג מערכת הקבצים שמוגדר כברירת מחדל, אפשר להשתמש בדיסק קשיח קיים עם מערכת הקבצים xfs, בתנאי שתמונת הצומת תומכת בכך. כדי להשתמש בדיסק xfs, משנים את spec.csi.fsType ל-xfs במניפסט PersistentVolume.
Windows לא תומך בסוג מערכת הקבצים ext4. חובה להשתמש במערכת הקבצים NTFS עבור מאגרי צמתים של Windows Server.
כדי להשתמש בדיסק NTFS, משנים את spec.csi.fsType ל-NTFS במניפסט של PersistentVolume.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם דיסקים קיימים של אחסון מתמיד. הוראות להקצאת דיסק מופיעות במאמר בנושא הקצאת דיסקים לאחסון מתמיד אזורי.
- מוודאים שהאשכול משתמש במנהל התקן ה-CSI של דיסק לאחסון מתמיד ב-Compute Engine.
שימוש בדרישת נפח אחסון מתמיד (PersistentVolumeClaim) שקשורה לנפח אחסון מתמיד (PersistentVolume)
כדי שמאגר יוכל לגשת לדיסק מתמשך קיים, צריך לבצע את הפעולות הבאות:
- הקצאת דיסק אחסון מתמיד (persistent disk) קיים כ-PersistentVolume.
- קישור של PersistentVolume ל-PersistentVolumeClaim.
- נותנים לקונטיינרים ב-Pod גישה ל-PersistentVolume.
יצירת נפח אחסון מתמיד (PersistentVolume) ודרישת נפח אחסון מתמיד (PersistentVolumeClaim)
יש כמה דרכים לקשור PersistentVolumeClaim ל-PersistentVolume ספציפי. לדוגמה, מניפסט ה-YAML הבא יוצר PersistentVolume ו-PersistentVolumeClaim חדשים, ואז מקשר את נפח האחסון ל-claim באמצעות claimRef שמוגדר ב-PersistentVolume.
כדי לקשר PersistentVolume ל-PersistentVolumeClaim, הערך של storageClassName בשני המשאבים צריך להיות זהה, וגם הערכים של capacity, accessModes ו-volumeMode. אפשר להשמיט את storageClassName, אבל חובה לציין את "" כדי למנוע מ-Kubernetes להשתמש ב-StorageClass שמוגדר כברירת מחדל.
המאפיין storageClassName לא צריך להפנות לאובייקט StorageClass קיים. אם כל מה שאתם צריכים זה לקשור את התלונה לנפח, אתם יכולים להשתמש בכל שם שתרצו. עם זאת, אם אתם צריכים פונקציונליות נוספת שמוגדרת על ידי StorageClass, כמו שינוי גודל נפח האחסון, אז storageClassName צריך להפנות לאובייקט StorageClass קיים.
פרטים נוספים זמינים במאמרי העזרה של Kubernetes בנושא PersistentVolumes.
שומרים את מניפסט ה-YAML הבא:
apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK_SIZE accessModes: - ReadWriteOnce claimRef: name: PV_CLAIM_NAME namespace: default csi: driver: pd.csi.storage.gke.io volumeHandle: DISK_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: default name: PV_CLAIM_NAME spec: storageClassName: "STORAGE_CLASS_NAME" accessModes: - ReadWriteOnce resources: requests: storage: DISK_SIZEמחליפים את מה שכתוב בשדות הבאים:
-
PV_NAME: השם של PersistentVolume החדש. -
STORAGE_CLASS_NAME: השם של ה-StorageClass החדש. -
DISK_SIZE: הגודל של דיסק האחסון המתמיד הקיים. לדוגמה,500G. -
PV_CLAIM_NAME: השם של ה-PersistentVolumeClaim החדש. -
DISK_ID: המזהה של הדיסק הקשיח הקיים. הפורמט הואprojects/{project_id}/zones/{zone_name}/disks/{disk_name}עבור דיסקים לאחסון מתמיד של תחום מוגדר, אוprojects/{project_id}/regions/{region_name}/disks/{disk_name}עבור דיסקים לאחסון מתמיד אזורי. -
FS_TYPE: סוג מערכת הקבצים. אפשר להשאיר את ברירת המחדל (ext4) או להשתמש ב-xfs. אם באשכולות שלכם נעשה שימוש במאגר צמתים של Windows Server, אתם צריכים לשנות את זה ל-NTFS.
-
כדי להחיל את ההגדרה וליצור את המשאבים PersistentVolume ו-PersistentVolumeClaim, מריצים את הפקודה הבאה:
kubectl apply -f FILE_PATHמחליפים את הערך של
FILE_PATHבנתיב לקובץ ה-YAML.
שימוש ב-PersistentVolume ב-Pod
אחרי שיוצרים את PersistentVolume ואת PersistentVolumeClaim ומקשרים ביניהם, אפשר לתת למאגרי Pod גישה לנפח על ידי ציון ערכים בשדה volumeMounts.
הגדרת ה-YAML הבאה יוצרת Pod חדש וקונטיינר שמריץ תמונה של nginx, ואז מטמיעה את PersistentVolume ב-Pod:
kind: Pod
apiVersion: v1
metadata:
name: POD_NAME
spec:
volumes:
- name: VOLUME_NAME
persistentVolumeClaim:
claimName: PV_CLAIM_NAME
containers:
- name: CONTAINER_NAME
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: VOLUME_NAME
מחליפים את מה שכתוב בשדות הבאים:
-
POD_NAME: השם של ה-Pod החדש. -
VOLUME_NAME: שם אמצעי האחסון. -
PV_CLAIM_NAME: השם של PersistentVolumeClaim שיצרתם בשלב הקודם. -
CONTAINER_NAME: השם של מאגר התגים החדש.
מחילים את ההגדרה:
kubectl apply -f FILE_PATH
מחליפים את הערך של FILE_PATH בנתיב לקובץ ה-YAML.
כדי לוודא שהנפח הותקן, מריצים את הפקודה הבאה:
kubectl describe pods POD_NAME
בפלט, בודקים שה-PersistentVolumeClaim הותקן:
...
Volumes:
VOLUME_NAME:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: PV_CLAIM_NAME
ReadOnly: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 29s default-scheduler Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
Normal SuccessfulAttachVolume 21s attachdetach-controller AttachVolume.Attach succeeded for volume "PV_NAME"
Normal Pulling 19s kubelet Pulling image "nginx"
Normal Pulled 19s kubelet Successfully pulled image "nginx"
Normal Created 18s kubelet Created container CONTAINER_NAME
Normal Started 18s kubelet Started container CONTAINER_NAME
שימוש בדיסק קיים ב-StatefulSet
אפשר להשתמש ב-Persistent Disks קיימים של Compute Engine ב-StatefulSet באמצעות PersistentVolumes. ה-StatefulSet יוצר באופן אוטומטי PersistentVolumeClaim לכל עותק. אתם יכולים לחזות את השמות של ה-PersistentVolumeClaims שנוצרו ולקשר אותם ל-PersistentVolumes באמצעות claimRef.
בדוגמה הבאה, לוקחים שני דיסקים קיימים של אחסון מתמיד, יוצרים PersistentVolumes כדי להשתמש בדיסקים, ואז מטמיעים את הווליומים ב-StatefulSet עם שני עותקים משוכפלים במרחב השמות שמוגדר כברירת מחדל.
- בוחרים שם ל-StatefulSet החדש, שם לתבנית PersistentVolumeClaim ומספר העותקים המשוכפלים ב-StatefulSet.
מגלים את השמות של ה-PersistentVolumeClaims שנוצרו באופן אוטומטי. StatefulSet משתמש בפורמט הבא לשמות של PersistentVolumeClaim:
PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEXמחליפים את מה שכתוב בשדות הבאים:
-
PVC_TEMPLATE_NAME: השם של תבנית ה-PersistentVolumeClaim החדשה. -
STATEFULSET_NAME: השם של ה-StatefulSet החדש. -
REPLICA_INDEX: האינדקס של העותק הכפול של StatefulSet. בדוגמה הזו, נשתמש ב-0וב-1.
-
יוצרים את PersistentVolumes. צריך ליצור PersistentVolume לכל עותק משוכפל ב-StatefulSet.
שומרים את מניפסט ה-YAML הבא:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-0 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK1_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK1_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-1 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK2_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK2_ID fsType: FS_TYPEמחליפים את מה שכתוב בשדות הבאים:
-
DISK1_SIZE and DISK2_SIZE: הגדלים של דיסקי אחסון מתמיד קיימים. -
DISK1_ID and DISK2_ID: המזהים של דיסקי האחסון המתמיד הקיימים. -
PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1: השמות של ה-PersistentVolumeClaims שנוצרו באופן אוטומטי בפורמט שהוגדר בשלב הקודם. -
STORAGE_CLASS_NAME: השם של StorageClass.
-
מחילים את ההגדרה:
kubectl apply -f FILE_PATHמחליפים את הערך של
FILE_PATHבנתיב לקובץ ה-YAML.
יוצרים StatefulSet באמצעות הערכים שבחרתם בשלב 1. חשוב לוודא שנפח האחסון שצוין ב-
volumeClaimTemplatesקטן או שווה לקיבולת הכוללת של PersistentVolumes.שומרים את מניפסט ה-YAML הבא:
apiVersion: apps/v1 kind: StatefulSet metadata: name: STATEFULSET_NAME spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx:latest ports: - containerPort: 80 name: web volumeMounts: - name: PVC_TEMPLATE_NAME mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: PVC_TEMPLATE_NAME spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "STORAGE_CLASS_NAME" resources: requests: storage: 100Giמחליפים את מה שכתוב בשדות הבאים:
-
STATEFULSET_NAME: השם של ה-StatefulSet החדש. -
PVC_TEMPLATE_NAME: השם של תבנית ה-PersistentVolumeClaim החדשה. -
STORAGE_CLASS_NAME: השם של StorageClass.
-
מחילים את ההגדרה:
kubectl apply -f FILE_PATHמחליפים את הערך של
FILE_PATHבנתיב לקובץ ה-YAML.