שימוש ב-StorageClass מותאם אישית עם עומסי העבודה

כדי להגדיר התנהגויות אחסון ספציפיות לעומסי עבודה בקונטיינרים ב-Google Kubernetes Engine‏ (GKE) ב-Azure, צריך ליצור StorageClasses מותאמים אישית ולהשתמש בהם. באמצעות התאמה אישית של StorageClasses, אתם יכולים לבצע אופטימיזציה של הביצועים והעלות של האחסון באפליקציות שלכם על ידי בחירה של סוגים שונים של דיסקים ב-Azure, סוגים של מערכות קבצים ופרמטרים אחרים עבור PersistentVolumes. היכולת הזו עוזרת לכם להפעיל שירותים יעילים על ידי התאמת האחסון לצרכים המדויקים של עומס העבודה.

‫GKE ב-Azure פורס ומנהל באופן אוטומטי את מנהל התקן ה-CSI של Azure Disk ואת מנהל התקן ה-CSI של Azure File, שחיוניים לטיפול בהקצאת אחסון. הגרסאות של הדרייברים האלה קשורות לגרסת ה-Kubernetes של GKE ב-Azure, והן מתעדכנות אוטומטית עם שדרוגים של האשכול, כדי להבטיח תאימות חלקה ל-StorageClasses בהתאמה אישית.

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

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

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

    נפח אחסון דיסקים ב-Azure

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

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

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

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

    לדוגמה, קובץ ה-YAML הבא יוצר StorageClass חדש שמקצה נפחי אחסון בחשבון אחסון ספציפי ומחיל תג של group=dev על כל נפח אחסון חדש.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: my-custom-class
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
     storageAccount: my-storage-account
     tags: group=dev
    

    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:
     ...
    

    מחליפים את הערכים הבאים:

    • ‫CLASS_NAME: השם של StorageClass (לדוגמה, my-custom-class).
    • ‫CSI_DRIVER_NAME: השם של מנהל התקן CSI (לדוגמה, csi.example.com).

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

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

    kubectl apply -f my-custom-class.yaml
    
  3. יצירת PersistentVolumeClaim עם StorageClass בהתאמה אישית.

    אחרי שיוצרים 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 Azure משתמש ב-StorageClass שמוגדר כברירת מחדל בשם standard-rwo, שמקצה דיסקים סטנדרטיים של SSD Azure עם LRS. אפשר לשנות את ברירת המחדל ל-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 נעשה שימוש בדרייבר disk.csi.azure.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: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
     skuName: VOLUME_TYPE
    

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

    • ‫CLASS_NAME: השם של StorageClass החדש.
    • ‫VOLUME_TYPE: סוג הנפח של Azure Disk שנוצר על ידי StorageClass.

    לדוגמה, קובץ ה-YAML הבא יוצר StorageClass חדש שמוגדר כברירת מחדל ומקצה נפחי דיסק של Azure מסוג Premium SSD.

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

    kubectl apply -f my-custom-class.yaml
    

אחרי שמחילים את המניפסט הזה, GKE on Azure משתמש ב-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 ומקצה נפח אחסון של 1 גיביבייט:

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

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