שימוש במשאב EFS

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. כדי לבצע איגוד לסוג האחסון שמוגדר כברירת מחדל, צריך להשאיר את השדה ריק.
  1. מחילים את ה-YAML על האשכול.

      kubectl apply -f efs-claim.yaml
    

    הפלט הזה מאשר את היצירה של PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

דינמית

אנחנו יוצאים מנקודת הנחה שאדמין האשכול כבר הקצה לפחות StorageClass אחד להקצאה דינמית. כדי ליצור PersistentVolume עם הקצאת נפח אחסון דינמית באמצעות StorageClass הזה ולהשתמש בנקודת הגישה הבסיסית של EFS עם עומסי העבודה, צריך ליצור PersistentVolumeClaim.

כדי ליצור PersistentVolumeClaim, מבצעים את השלבים הבאים. מנהל התקן ה-CSI של EFS משתמש ב-PersistentVolumeClaim הזה עם StorageClass שצוין כדי להקצות באופן דינמי PersistentVolume.

  1. מעתיקים את מניפסט ה-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) שמוגדר כברירת מחדל, צריך להשאיר את השדה הזה ריק.
  1. מחילים את ה-YAML על האשכול.

      kubectl apply -f efs-claim.yaml
    

    הפלט מאשר את היצירה של PersistentVolumeClaim.

    persistentvolumeclaim/CLAIM_NAME created
    

יצירת StatefulSet

אחרי שיוצרים PersistentVolumeClaim, אפשר להשתמש בו בעומס עבודה. בקטע הזה יוצרים דוגמה ל-StatefulSet שמשתמש ב-PersistentVolumeClaim. אפשר גם להשתמש ב-PersistentVolumeClaim עם סוגים אחרים של עומסי עבודה, כמו Pods ו-Deployments, על ידי הפניה לתביעה ב-spec.volumes.

כדי ליצור StatefulSet שמטמיע את משאב ה-EFS שמצוין ב-PersistentVolumeClaim, מבצעים את השלבים הבאים.

  1. מעתיקים את מניפסט ה-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.

  2. מחילים את ה-YAML על האשכול.

     kubectl apply -f efs-statefulset.yaml
    

    הפלט מאשר את היצירה של StatefulSet.

    statefulset.apps/efs-shell created
    

    יכול להיות שיחלפו כמה דקות עד שה-StatefulSet יוריד את תמונת הקונטיינר ויפעיל אותה.

  3. מאשרים שה-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
    
  4. אחרי שה-Pod יהיה במצב Running, משתמשים ב-kubectl exec כדי להתחבר ל-Pod שמארח את ה-StatefulSet.

      kubectl exec -it efs-shell-0 -- bash
    

    הפקודה kubectl מפעילה מעטפת ב-Pod.

  5. כדי לוודא שמשאב ה-EFS שלכם הועלה, בודקים את התוכן של הקובץ out.txt באמצעות הפקודה tail.

    tail /efs-data/out.txt
    

    הפלט מכיל שעות עדכניות ב-UTC.

  6. מתנתקים מה-Pod באמצעות הפקודה exit.

      exit
    

    המעטפת חוזרת למכונה המקומית.

הסרת המשאבים

כדי להסיר את ה-StatefulSet, משתמשים ב-kubectl delete.

  kubectl delete -f efs-statefulset.yaml

המאמרים הבאים