התקנה של מנהל התקן של Container Storage Interface

התקנה של מנהל התקן של ממשק אחסון בקונטיינר (CSI) מאפשרת להקצות ולנהל אחסון מתמיד לעומסי עבודה עם שמירת מצב (stateful) באשכולות של Google Distributed Cloud. אחרי שמתקינים מנהל התקן לפי ההוראות של ספק האחסון, אפשר לאמת את ההתקנה וליצור StorageClass כדי להקצות נפחים באופן דינמי לאפליקציות.

סקירה כללית

‫Container Storage Interface ‏(CSI) הוא ממשק API פתוח וסטנדרטי שנתמך על ידי הרבה ספקי אחסון גדולים, שמאפשר ל-Kubernetes לחשוף מערכות אחסון שרירותיות לעומסי עבודה בקונטיינרים.

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

כדי להשתמש במנהל התקן CSI, צריך ליצור StorageClass של Kubernetes. מגדירים את מנהל התקן ה-CSI בתור ה-provisioner של StorageClass. לאחר מכן, תוכלו להגדיר את StorageClass כברירת המחדל של האשכול, או להגדיר את עומסי העבודה כך שישתמשו ב-StorageClass (דוגמה ל-StatefulSet).

התקנת מנהל התקן CSI של ספק

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

לאחסון בסביבת ייצור, מומלץ להתקין מנהל התקן CSI משותף אחסון שמוכן ל-GDC.

אימות התקנה של מנהל התקן

אחרי שמתקינים מנהל התקן CSI, אפשר לאמת את ההתקנה באמצעות הפקודה:

kubectl get csinodes -o jsonpath='{range .items[*]} \
    {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'

שימוש במנהל התקן CSI

כדי להשתמש במנהל התקן CSI:

  1. יוצרים StorageClass של Kubernetes שמפנה לדרייבר בשדה provisioner.

  2. כדי להקצות נפח אחסון, אתם יכולים:

שיקולים לגבי StorageClasses שמגובים על ידי מנהל התקן CSI

כשיוצרים StorageClass, חשוב להביא בחשבון את הדברים הבאים:

  • המסמכים של מנהל ההתקן של CSI צריכים לכלול את הפרמטרים הספציפיים למנהל ההתקן שאתם מספקים ל-StorageClass, כולל שם ה-provisioner.
  • מומלץ לתת ל-StorageClass שם לפי המאפיינים שלו, ולא לפי השם של הדרייבר או המכשיר הספציפיים שמאחוריו. אם תתנו ל-StorageClass שם לפי המאפיינים שלו, תוכלו ליצור StorageClasses עם אותו שם בכמה אשכולות וסביבות, והאפליקציות שלכם יוכלו לקבל אחסון עם אותם מאפיינים באשכולות שונים.

דוגמה: הפניה ל-StorageClass ב-StatefulSet

בדוגמה הבאה מוסבר איך להגדיר מנהל התקן CSI ב-StorageClass, ואז להפנות ל-StorageClass בעומס עבודה של StatefulSet. בדוגמה הזו אנחנו מניחים שהדרייבר כבר הותקן באשכול.

ה-StorageClass הפשוט הבא, premium-rwo, משתמש במנהל התקן CSI פיקטיבי, csi.example.com, בתור ה-provisioner שלו:

fast-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: premium-rwo
provisioner: csi.example.com # CSI driver
parameters: # You provide vendor-specific parameters to this specification
  type: example-parameter # Be sure to follow the vendor's instructions
  datastore: my-datastore
reclaimPolicy: Retain
allowVolumeExpansion: true

מפנים ל-StorageClass במפרט volumeClaimTemplates של StatefulSet.

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

הנה StatefulSet פשוט שמפנה ל-StorageClass:

statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 2
  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: premium-rwo # This field references the existing StorageClass

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