התקנה ידנית של מנהל התקן CSI

בדף הזה מוסבר איך להתקין מנהל התקן של אחסון Container Storage Interface ‏ (CSI) באשכולות Standard של Google Kubernetes Engine ‏ (GKE). הדף הזה לא רלוונטי לאשכולות GKE Autopilot, שמשתמשים אוטומטית במנהל התקן ה-CSI של דיסק מתמשך ב-Compute Engine.

אם אתם משתמשים במנהל התקנים (driver) של CSI לדיסק מתמשך ב-Compute Engine באשכול רגיל, מומלץ לפרוס את מנהל ההתקנים באופן אוטומטי כדי לצמצם את תקורה הניהול.

סקירה כללית

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

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

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

אימות התקנת דרייבר

אחרי שמתקינים דרייבר CSI, אפשר להריץ אחת מהפקודות הבאות כדי לוודא שההתקנה בוצעה בהצלחה, בהתאם לגרסת ה-GKE של האשכול:

‫1.14 ומעלה

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

‫‎1.13.x

kubectl get nodes \
-o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'

שימוש בדרייבר CSI

כדי להשתמש בדרייבר CSI:

  1. יוצרים StorageClass של Kubernetes שמפנה אל הדרייבר בשדה provisioner, אם לא נוצר עבורכם StorageClass כחלק מהתקנת הדרייבר. חלק מהדרייברים של CSI פורסים StorageClass כשמתקינים אותם.

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

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

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

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

דוגמה: הפניה ל-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 במפרט volumeClaimTemplates של StatefulSet, ‏ Kubernetes מספק אחסון יציב באמצעות PersistentVolumes. ‫Kubernetes קורא לספק השירות שמוגדר ב-StorageClass כדי ליצור נפח אחסון חדש. במקרה כזה, Kubernetes מפעיל את ספק csi.example.com, שבתורו מפעיל את ה-API של הספק כדי ליצור נפח אחסון. אחרי הקצאת נפח האחסון, Kubernetes יוצר באופן אוטומטי PersistentVolume שמייצג את האחסון.

זוהי דוגמה פשוטה של 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

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