Elastic File System (EFS) הוא המנגנון הבסיסי של AWS לאספקת אחסון (שטח דיסק) לאשכול. PersistentVolume הוא משאב של אשכול שמאפשר לעומסי העבודה שלכם להשתמש באחסון EFS, ומוודא שהאחסון יישמר גם כשלא מחוברים אליו עומסי עבודה. במאמר הזה מוסבר איך עומס עבודה יכול לגשת ל-PersistentVolume באמצעות PersistentVolumeClaim.
הדף הזה מיועד לאנשי תפעול ולמומחי אחסון שרוצים להגדיר ולנהל אחסון. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE. Google Cloud
GKE ב-AWS תומך בהקצאה סטטית של PersistentVolumes לכל גרסאות Kubernetes הנתמכות. באשכולות בגרסה 1.24 של Kubernetes או בגרסאות מתקדמות יותר, GKE ב-AWS תומך גם בהקצאה דינמית. כדי להשתמש בהקצאת משאבים דינמית, האדמין של האשכול צריך להגדיר אותה. הוראות מפורטות זמינות במאמר בנושא הגדרת PersistentVolume.
יצירת PersistentVolumeClaim
בוחרים את הכרטיסייה המתאימה בהתאם לסוג נפח האחסון הקבוע שרוצים להקצות לעומס העבודה – הקצאה סטטית או דינמית.
סטטי
במסגרת ההנחיות האלה, אנחנו מניחים שאדמין האשכול כבר הקצה לפחות PersistentVolume אחד. כדי לגשת ל-PersistentVolume הזה ולהשתמש ב-EFS הבסיסי שלו עם עומסי העבודה, צריך ליצור PersistentVolumeClaim.
כדי ליצור PersistentVolumeClaim עבור PersistentVolume שהוקצה באופן סטטי, מעתיקים את מניפסט ה-YAML הבא לקובץ בשם efs-claim.yaml.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: CLAIM_NAME
spec:
accessModes:
- ReadWriteMany
storageClassName: "" # Leave as empty string for static provisioning
resources:
requests:
storage: 5Gi
מחליפים את:
- CLAIM_NAME: השם שבחרתם ל-PersistentVolumeClaim כדי לקשר אליו, לדוגמה
efs-claim1. כדי לבצע איגוד לסוג האחסון שמוגדר כברירת מחדל, צריך להשאיר את השדה ריק.
מחילים את ה-YAML על האשכול.
kubectl apply -f efs-claim.yamlהפלט הזה מאשר את היצירה של PersistentVolumeClaim.
persistentvolumeclaim/CLAIM_NAME created
דינמית
אנחנו יוצאים מנקודת הנחה שאדמין האשכול כבר הקצה לפחות StorageClass אחד להקצאה דינמית. כדי ליצור PersistentVolume עם הקצאת נפח אחסון דינמית באמצעות StorageClass הזה ולהשתמש בנקודת הגישה הבסיסית של EFS עם עומסי העבודה, צריך ליצור PersistentVolumeClaim.
כדי ליצור PersistentVolumeClaim, מבצעים את השלבים הבאים. מנהל התקן ה-CSI של EFS משתמש ב-PersistentVolumeClaim הזה עם StorageClass שצוין כדי להקצות באופן דינמי PersistentVolume.
- מעתיקים את מניפסט ה-YAML הבא לקובץ בשם
efs-claim.yaml.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: CLAIM_NAME
spec:
accessModes:
- ReadWriteMany
storageClassName: "EFS_STORAGE_CLASS_NAME"
resources:
requests:
storage: 5Gi
מחליפים את:
- CLAIM_NAME: שם שאתם בוחרים ל-PersistentVolumeClaim, לדוגמה,
efs-claim1 - EFS_STORAGE_CLASS_NAME: השם של StorageClass שאליו רוצים לקשר את PersistentVolumeClaim. כדי לבצע קישור לסוג האחסון (storage class) שמוגדר כברירת מחדל, צריך להשאיר את השדה הזה ריק.
מחילים את ה-YAML על האשכול.
kubectl apply -f efs-claim.yamlהפלט מאשר את היצירה של PersistentVolumeClaim.
persistentvolumeclaim/CLAIM_NAME created
יצירת StatefulSet
אחרי שיוצרים PersistentVolumeClaim, אפשר להשתמש בו בעומס עבודה.
בקטע הזה יוצרים דוגמה ל-StatefulSet שמשתמש ב-PersistentVolumeClaim.
אפשר גם להשתמש ב-PersistentVolumeClaim עם סוגים אחרים של עומסי עבודה, כמו Pods ו-Deployments, על ידי הפניה לתביעה ב-spec.volumes.
כדי ליצור StatefulSet שמטמיע את משאב ה-EFS שמצוין ב-PersistentVolumeClaim, מבצעים את השלבים הבאים.
מעתיקים את מניפסט ה-YAML הבא לקובץ בשם
efs-statefulset.yaml. קובץ המניפסט לדוגמה הזה מפעיל קונטיינר של Ubuntu Linux שמעלה את משאב ה-EFS שלכם ב-/efs-data. כל חמש שניות, מאגר התגים כותב לקובץ במשאב EFS בשםout.txt.apiVersion: apps/v1 kind: StatefulSet metadata: name: efs-shell spec: selector: matchLabels: app: test-efs serviceName: efs-app replicas: 1 template: metadata: labels: app: test-efs spec: terminationGracePeriodSeconds: 10 containers: - name: linux image: ubuntu:bionic command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"] volumeMounts: - name: efs-volume mountPath: /efs-data volumes: - name: efs-volume persistentVolumeClaim: claimName: CLAIM_NAMEמחליפים את CLAIM_NAME בשם של PersistentVolumeClaim שציינתם קודם – לדוגמה,
efs-claim1.מחילים את ה-YAML על האשכול.
kubectl apply -f efs-statefulset.yamlהפלט מאשר את היצירה של StatefulSet.
statefulset.apps/efs-shell createdיכול להיות שיחלפו כמה דקות עד שה-StatefulSet יוריד את תמונת הקונטיינר ויפעיל אותה.
מאשרים שה-Pod של StatefulSet נמצא בסטטוס
Runningבאמצעותkubectl get pods.kubectl get pods -l app=test-efsהפלט כולל את השם של ה-Pod והסטטוס שלו. בתשובה הבאה, שם ה-Pod הוא
efs-shell-0.NAME READY STATUS RESTARTS AGE efs-shell-0 1/1 Running 0 1mאחרי שה-Pod יהיה במצב Running, משתמשים ב-
kubectl execכדי להתחבר ל-Pod שמארח את ה-StatefulSet.kubectl exec -it efs-shell-0 -- bashהפקודה
kubectlמפעילה מעטפת ב-Pod.כדי לוודא שמשאב ה-EFS שלכם הועלה, בודקים את התוכן של הקובץ
out.txtבאמצעות הפקודהtail.tail /efs-data/out.txtהפלט מכיל שעות עדכניות ב-UTC.
מתנתקים מה-Pod באמצעות הפקודה
exit.exitהמעטפת חוזרת למכונה המקומית.
הסרת המשאבים
כדי להסיר את ה-StatefulSet, משתמשים ב-kubectl delete.
kubectl delete -f efs-statefulset.yaml