שימוש ב-StorageClasses עם עומסי העבודה

‫GKE ב-AWS פורס באופן אוטומטי את Container Storage Interface‏ (CSI) ‏Amazon Elastic Block Store‏ (EBS) ו-Amazon Elastic File Store‏ (EFS).

הגרסאות של EBS CSI Driver ו-EFS CSI Driver קשורות לגרסה של GKE ב-AWS Kubernetes. בדרך כלל, גרסת הדרייבר היא הגרסה העדכנית ביותר שזמינה כשגרסת GKE יוצאת. כשמשדרגים את האשכול, מנהלי ההתקנים מתעדכנים אוטומטית.

שימוש ב-StorageClass שמוגדר כברירת מחדל

יצירת PersistentVolumeClaim בלי השדה spec.storageClassName מספקת נפח של כונני SSD לשימוש כללי (gp2) באמצעות ברירת המחדל של GKE ב-AWS EBS CSI Driver StorageClass.

קובץ ה-YAML הבא יוצר PersistentVolumeClaim ‏ (PVC) בשם mypvc בגודל של 30 גיביבייט.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

שימוש ב-StorageClass אחר שהותקן מראש

מנהל התקן ה-CSI של GKE ב-AWS EBS כולל גם את premium-rwo StorageClass, שמקצה נפחי אחסון של Provisioned IOPS SSD volumes (io1) volumes עם תפוקה גבוהה יותר.

כדי להשתמש בו, צריך לציין אותו ב-spec.storageClassName של ה-PVC.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: premium-rwo

שימוש ב-StorageClass מותאם אישית

אם אף אחת מהאפשרויות האלה לא מתאימה לצרכים שלכם, אתם יכולים ליצור StorageClass נוסף לנפחי EBS או להשתמש ב-Container Storage Interface (ממשק אחסון למכולות, CSI).premium-rwo

  1. בוחרים אם משתמשים בנפח EBS או במנהל התקן אחר של CSI.

    EBS Volume

    בכרטיסייה הזו מוסבר איך ליצור StorageClass מותאם אישית משלכם שמציין סוג נפח EBS, סוג מערכת קבצים ופרמטרים אחרים. פרמטרים נוספים של StorageClass זמינים בדף של GKE ב-AWS EBS CSI Driver ב-GitHub.

    כדי להגדיר StorageClass בהתאמה אישית, מעתיקים את מניפסט ה-YAML הבא לקובץ בשם my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    

    מחליפים את CLASS_NAME בשם של StorageClass חדש.

    לדוגמה, קובץ ה-YAML הבא יוצר StorageClass חדש שמקצה נפחי EBS מסוג Throughput Optimized HDD בפורמט של מערכת הקבצים XFS.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    ‫StorageClass מותאם אישית של EFS

    בכרטיסייה הזו מוסבר איך ליצור StorageClass בהתאמה אישית עבור מנהל הקצאות (provisioner) של מנהל התקן EFS CSI. במאמר שימוש במשאב EFS מופיעה רשימה של הדרישות המוקדמות ל-StorageClass הזה. בדף EFS CSI Driver מפורטים פרמטרים נוספים של StorageClass מעבר לאלה שמופיעים במניפסט הבא.

    מעתיקים את מניפסט ה-YAML הבא לקובץ בשם my-custom-class.yaml.

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <var>EFS_STORAGE_CLASS_NAME</var>
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    

    מחליפים את:

    • EFS_STORAGE_CLASS_NAME בשם של StorageClass.
    • EFS_ID עם מזהה מערכת הקבצים של EFS – לדוגמה, fs-12345678a.

    CSI Driver

    אפשר לציין מנהל התקן אחר של CSI בשדה provisioner.

    כדי ליצור StorageClass עם מנהל התקן אחר של CSI, אפשר להשתמש בדוגמה הבאה של YAML.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

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

    • CSI_DRIVER_NAME מחליפים בשם של מנהל ההתקן של CSI – לדוגמה,csi.example.com
    • CLASS_NAME עם השם של StorageClass – לדוגמה, my-custom-class

    מגדירים את שדות המשנה בקטע parameters בהתאם לדרייבר ה-CSI.

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

    kubectl apply -f my-custom-class.yaml
    

יצירת PersistentVolumeClaim עם StorageClass בהתאמה אישית

  1. אחרי שיוצרים StorageClass בהתאמה אישית, אפשר לציין אותו ב-PVC. בדוגמה שלמטה נוצר PVC בשם my-pvc שמפנה אל StorageClass בשם my-custom-class.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi
      storageClassName: my-custom-class
    

הגדרת StorageClass כברירת מחדל

ב-GKE on AWS נעשה שימוש ב-StorageClass שמוגדר כברירת מחדל בשם standard-rwo, שמקצה כרכים של gp2 EBS. אפשר לשנות את ברירת המחדל ל-StorageClass אחר.

כדי לשנות את ברירת המחדל של StorageClass:

  1. מעדכנים את ההערה is-default-class של standard-rwo StorageClass עם kubectl patch.

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. יוצרים StorageClass חדש עם ההערה storageclass.kubernetes.io/is-default-class: true.

    בדוגמה הבאה של StorageClass נעשה שימוש בדרייבר ebs.csi.aws.com. כדי להתקין עוד מנהל התקן לאחסון, אפשר לעיין במאמר בנושא התקנה של מנהלי התקן נוספים של CSI.

    מעתיקים את קוד ה-YAML הבא לקובץ בשם my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
      annotations:
        storageclass.kubernetes.io/is-default-class: true
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

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

    לדוגמה, קובץ ה-YAML הבא יוצר StorageClass חדש שמוגדר כברירת מחדל ומקצה נפחי SSD למטרות כלליות (gp3).

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: gp3
    
  3. מחילים את הכיתה החדשה בהתאמה אישית על האשכול.

    kubectl apply -f my-custom-class.yaml
    

אחרי שמחילים את המניפסט הזה, GKE ב-AWS משתמש ב-my-custom-default-class StorageClass לבקשות חדשות לאחסון.

הפניה ל-StorageClass ב-StatefulSet

כדי להשתמש ב-StorageClass החדש, צריך להפנות אליו ב-volumeClaimTemplates של StatefulSet.

כשמפנים אל StorageClass במפרט volumeClaimTemplates של StatefulSet, ‏ Kubernetes מספק אחסון יציב באמצעות PersistentVolumes (PVs). ‫Kubernetes קורא למנהל ההקצאות שמוגדר ב-StorageClass כדי ליצור נפח אחסון חדש. אחרי שהנפח מוקצה, Kubernetes יוצר באופן אוטומטי PV.

ההפניה הבאה של StatefulSet מתייחסת ל-StorageClass‏ my-custom-class ומקצה נפח אחסון של גיביבייט אחד:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: my-custom-class # This field references the existing StorageClass

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