שימוש במערכות קבצים של EFS

גרסאות 1.6 ואילך של GKE ב-AWS תומכות ב-Elastic File System‏ (EFS) של AWS באמצעות EFS CSI Driver. בנושא הזה מוסבר איך לטעון מערכת קבצים קיימת של EFS כ-PersistentVolume באשכולות המשתמשים.

לפני שמתחילים

כדי לבצע את השלבים במאמר הזה, אתם צריכים:

  • מערכת קבצים קיימת של EFS באותו AWS VPC שבו מותקן GKE on AWS.
  • לפחות יעד הרכבה אחד של EFS באותו AWS VPC כמו ההתקנה של GKE on AWS.
  • כל יעדי ההרכבה של EFS צריכים להיות שייכים לאחד מהבאים:
    • רשתות המשנה הפרטיות להתקנה של GKE ב-AWS. כברירת מחדל, ב-GKE ב-AWS נוצרות רשתות משנה בשם gke-CLUSTER_ID-private-AWS_ZONE, כאשר CLUSTER_ID הוא מזהה אשכול המשתמש ו-AWS_ZONE הוא אזור הזמינות ב-AWS.
    • קבוצת האבטחה של מאגר הצמתים. כברירת מחדל, מערכת GKE on AWS יוצרת מאגרי צמתים בשם gke-CLUSTER_ID-nodepool, כאשר CLUSTER_ID הוא מזהה אשכול המשתמשים.
  • בספריית anthos-aws, משתמשים ב-anthos-gke כדי להחליף הקשר לאשכול המשתמשים.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    מחליפים את CLUSTER_NAME בשם אשכול המשתמש.

שימוש ב-PersistentVolume של EFS

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

יצירת נפח אחסון מתמיד

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

  1. בספריית anthos-aws, משתמשים ב-anthos-gke כדי להחליף הקשר לאשכול המשתמשים.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    מחליפים את CLUSTER_NAME בשם אשכול המשתמש.

  2. ההגדרה של PersistentVolume שבה אתם משתמשים תלויה בשאלה אם אתם מתחברים ישירות ל-Elastic File System או דרך נקודת גישה. בוחרים אם להתחבר ישירות ל-Elastic File System או דרך נקודת גישה.

    חיבור ישיר

    מעתיקים את מניפסט ה-YAML הבא לקובץ בשם efs-volume.yaml. קובץ המניפסט מפנה לסוג האחסון EFS שיצרתם קודם.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_FILE_SYSTEM_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • VOLUME_NAME בשם של הנפח המתמיד.
    • CLAIM_NAME בשם שרוצים להשתמש בו בשביל PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID עם מזהה מערכת הקבצים של EFS. לדוגמה, fs-12345678a.

    נקודת גישה

    מעתיקים את מניפסט ה-YAML הבא לקובץ בשם efs-volume.yaml. קובץ המניפסט מפנה לסוג האחסון EFS שיצרתם קודם.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_FILE_SYSTEM_ID::ACCESS_POINT_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • VOLUME_NAME בשם של הנפח המתמיד.
    • CLAIM_NAME בשם שרוצים להשתמש בו בשביל PersistentVolumeClaim.
    • EFS_FILE_SYSTEM_ID עם מזהה מערכת הקבצים של EFS. לדוגמה, fs-12345678a.
    • ACCESS_POINT_ID עם המזהה של נקודת הגישה. לדוגמה, fsap-1234567890abcde.
  3. מחילים את קובץ ה-YAML על אשכול המשתמשים.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-volume.yaml
    

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

    persistentvolume/VOLUME_NAME created
    

יצירת PersistentVolumeClaim

כדי להשתמש במערכת הקבצים של EFS עם עומסי העבודה, צריך ליצור PersistentVolumeClaim.

  1. כדי ליצור את PersistentVolumeClaim, מעתיקים את מניפסט ה-YAML הבא לקובץ בשם efs-claim.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: CLAIM_NAME
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 5Gi
    

    מחליפים את CLAIM_NAME בשם של PersistentVolumeClaim. לדוגמה, efs-claim1.

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

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-claim.yaml
    

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

    persistentvolumeclaim/CLAIM_NAME created
    

יצירת StatefulSet

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

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f efs-statefulset.yaml
    

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

    statefulset.apps/efs-shell created
    

    יכול להיות שיעברו כמה דקות עד שקובץ אימג' של קונטיינר יורד ויופעל.

  3. מאשרים שה-Pod של StatefulSet נמצא בסטטוס Running באמצעות kubectl get pods.

    env HTTPS_PROXY=http://localhost:8118 \
      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.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl exec -it efs-shell-0 -- bash
    

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

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

    tail /efs-data/out.txt
    

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

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

    exit
    

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

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

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f efs-statefulset.yaml
    

סידור וארגון

כדי להסיר את המשאבים שיצרתם בקטעים הקודמים, מריצים את הפקודות הבאות:

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-statefulset.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-claim.yaml
env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f efs-volume.yaml

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