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

‫GKE on AWS פורס באופן אוטומטי את מנהל ההתקן של Container Storage Interface ‏ (CSI) עבור Amazon Elastic Block Store ‏ (EBS) כדי להקצות ולנהל נפחי אחסון של Amazon EBS באשכולות.

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

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

אם יוצרים PersistentVolumeClaim בלי להגדיר את השדה spec.storageClassName, נפח gp2 מוקצה באמצעות StorageClass של מנהל התקן CSI של GKE on AWS EBS כברירת מחדל.

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

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

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

‫GKE on AWS EBS CSI Driver כולל גם את premium-rwo StorageClass, שמקצה io1 נפחי אחסון עם תפוקה גבוהה יותר.

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

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

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

אפשר ליצור StorageClasses נוספים לנפחי EBS או להשתמש במנהלי התקנים של Container Storage Interface ‏ (CSI).

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

    EBS Volume

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

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

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: ebs.csi.aws.com
    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    CSI Driver

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

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

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

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

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

    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    
  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

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