הגדרת מנהל התקן ה-CSI של Cloud Storage FUSE ל-GKE

במאמר הזה מוסבר איך להגדיר את מנהל ההתקן של ה-CSI של Cloud Storage FUSE כדי לגשת לקטגוריות של Cloud Storage מ-Google Kubernetes Engine ‏ (GKE).

באמצעות מנהל התקן ה-CSI של Cloud Storage FUSE, עומסי העבודה של GKE יכולים לגשת לקטגוריות של Cloud Storage בתור מערכת קבצים מקומית. מנהל התקן ה-CSI משלב את Cloud Storage עם GKE, ומפשט את האופן שבו אפליקציות מבוססות-קונטיינרים מתקשרות עם מערכי נתונים גדולים שמאוחסנים בקטגוריות. דרייבר ה-CSI מספק ממשק סטנדרטי לאחסון ב-GKE. במאמר הזה מוסבר איך להכין את הסביבה ולקשר את אשכולות GKE לקטגוריות של Cloud Storage באמצעות מנהל התקן ה-CSI של Cloud Storage FUSE.

המסמך הזה מיועד למפתחים, לאדמינים ולמומחי אחסון שמשלבים עומסי עבודה של GKE עם אחסון אובייקטים. כדי לקבל מידע נוסף על תפקידים נפוצים ועל משימות לדוגמה שאנחנו מתייחסים אליהן ב Google Cloud תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.

יצירת קטגוריה של Cloud Storage

אם עדיין לא עשיתם זאת, יוצרים את קטגוריות Cloud Storage. תתבצע העמסה של הדליים האלה כנפחים באשכול GKE. כדי לשפר את הביצועים, מגדירים את Location type ל-Region ובוחרים אזור שתואם לאשכול GKE.

הפעלת מנהל התקן ה-CSI של Cloud Storage FUSE

צריך לפעול לפי השלבים הבאים, בהתאם לסוג האשכולות שבהם אתם משתמשים: GKE Autopilot או אשכולות רגילים. כדי ליהנות מחוויית Kubernetes מנוהלת באופן מלא, מומלץ להשתמש באשכול Autopilot. כדי לבחור את המצב שהכי מתאים לעומסי העבודה שלכם, אפשר לעיין במאמר בחירת מצב פעולה של GKE.

טייס אוטומטי

מנהל התקן ה-CSI של Cloud Storage FUSE מופעל כברירת מחדל באשכולות של Autopilot. אפשר לדלג אל הגדרת גישה לקטגוריות של Cloud Storage.

רגילה

אם מנהל התקן ה-CSI של Cloud Storage FUSE מופעל באשכול Standard, אפשר לדלג אל הגדרת גישה לקטגוריות של Cloud Storage.

מנהל התקן ה-CSI של Cloud Storage FUSE לא מופעל כברירת מחדל באשכולות רגילים. כדי ליצור אשכול רגיל עם מנהל התקן ה-CSI של Cloud Storage FUSE, אפשר להשתמש בפקודה gcloud container clusters create:

gcloud container clusters create CLUSTER_NAME \
    --addons GcsFuseCsiDriver \
    --cluster-version=VERSION \
    --location=LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog

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

  • CLUSTER_NAME: השם של האשכול.
  • VERSION: מספר הגרסה של GKE. צריך לבחור בגרסה 1.24 ואילך.
  • LOCATION: האזור או התחום של Compute Engine שבו נמצא האשכול.
  • PROJECT_ID: מזהה הפרויקט.

כדי להפעיל את הדרייבר באשכול רגיל קיים, משתמשים בפקודה gcloud container clusters update:

gcloud container clusters update CLUSTER_NAME \
    --update-addons GcsFuseCsiDriver=ENABLED \
    --location=LOCATION

כדי לוודא שמנהל התקן ה-CSI של Cloud Storage FUSE מופעל באשכול, מריצים את הפקודה הבאה:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --format="value(addonsConfig.gcsFuseCsiDriverConfig.enabled)"

הגדרת גישה לקטגוריות של Cloud Storage

מנהל התקן ה-CSI של Cloud Storage FUSE משתמש באיחוד שירותי אימות הזהות של עומסי עבודה ב-GKE כדי שתוכלו להגדיר הרשאות מפורטות לגבי האופן שבו רכיבי ה-Pod של GKE יכולים לגשת לנתונים שמאוחסנים ב-Cloud Storage.

כדי להפוך את קטגוריות Cloud Storage לנגישות לאשכול GKE, צריך לבצע אימות באמצעות איחוד שירותי אימות הזהות של עומסי עבודה ב-GKE עם קטגוריית Cloud Storage שרוצים לטעון במפרט ה-Pod:

  1. אם לא הפעלתם איחוד זהויות של עומסי עבודה ל-GKE, אתם צריכים לפעול לפי השלבים האלה כדי להפעיל אותו. אם רוצים להשתמש במאגר צמתים קיים, צריך להפעיל באופן ידני את איחוד הזהויות של עומסי עבודה ל-GKE במאגר הצמתים אחרי שמפעילים את איחוד הזהויות של עומסי עבודה ל-GKE באשכול.
  2. קבלת פרטי הכניסה לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

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

  3. יוצרים מרחב שמות לשימוש ב-Kubernetes ServiceAccount. אפשר גם להשתמש במרחב השמות default או בכל מרחב שמות קיים.

    kubectl create namespace NAMESPACE
    

    מחליפים את NAMESPACE בשם של מרחב השמות ב-Kubernetes בשביל חשבון השירות ב-Kubernetes.

  4. יוצרים חשבון שירות ב-Kubernetes לשימוש האפליקציה. אפשר גם להשתמש בכל חשבון שירות קיים של Kubernetes בכל מרחב שמות, כולל default חשבון השירות של Kubernetes.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    מחליפים את KSA_NAME בשם של חשבון השירות של Kubernetes.

  5. מקצים לחשבון השירות ב-Kubernetes אחד מתפקידי ה-IAM ל-Cloud Storage. פועלים לפי השלבים הבאים, בהתאם להרשאת הגישה שרוצים לתת לחשבון השירות של Kubernetes: גישה רק לקטגוריה ספציפית ב-Cloud Storage או גישה גלובלית לכל הקטגוריות בפרויקט.

    גישה לקטגוריה ספציפית

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

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

    • BUCKET_NAME: שם הקטגוריה שלכם ב-Cloud Storage.
    • PROJECT_NUMBER: מספר הפרויקט של אשכול GKE. הוראות לאיתור מספר הפרויקט מופיעות במאמר זיהוי פרויקטים.
    • PROJECT_ID: מזהה הפרויקט של אשכול GKE.
    • NAMESPACE: השם של מרחב השמות ב-Kubernetes עבור חשבון השירות ב-Kubernetes.
    • KSA_NAME: השם של חשבון השירות החדש של Kubernetes.
    • ROLE_NAME: תפקיד ה-IAM להקצאה לחשבון השירות של Kubernetes.
      • לעומסי עבודה של קריאה בלבד, משתמשים בתפקיד Storage Object Viewer‏ (roles/storage.objectViewer).
      • לעומסי עבודה של קריאה וכתיבה, משתמשים בתפקיד Storage Object User ‏ (roles/storage.objectUser).

    גישה גלובלית לקטגוריות

    gcloud projects add-iam-policy-binding GCS_PROJECT \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

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

    • GCS_PROJECT: מזהה הפרויקט של דלי ה-Cloud Storage.
    • PROJECT_NUMBER: מספר הפרויקט של אשכול GKE. הוראות לאיתור מספר הפרויקט מופיעות במאמר זיהוי פרויקטים.
    • PROJECT_ID: מזהה הפרויקט של אשכול GKE.
    • NAMESPACE: השם של מרחב השמות ב-Kubernetes עבור חשבון השירות ב-Kubernetes.
    • KSA_NAME: השם של חשבון השירות החדש של Kubernetes.
    • ROLE_NAME: תפקיד ה-IAM להקצאה לחשבון השירות של Kubernetes.
      • לעומסי עבודה של קריאה בלבד, משתמשים בתפקיד Storage Object Viewer‏ (roles/storage.objectViewer).
      • לעומסי עבודה של קריאה וכתיבה, משתמשים בתפקיד Storage Object User ‏ (roles/storage.objectUser).

הגדרת גישה ל-Pods עם רשת מארחת

בגרסאות של אשכול GKE שקודמות לגרסה 1.33.3-gke.1226000, מנהל התקן ה-CSI של Cloud Storage FUSE לא תומך ב-Pods שפועלים ברשת המארח (hostNetwork: true) בגלל מגבלות של איחוד זהויות של עומסי עבודה ל-GKE. עם זאת, בגרסאות מאוחרות יותר של GKE, אפשר להגדיר אימות מאובטח ל-Pods מופעלים hostNetwork כשמשתמשים במנהל התקן ה-CSI של Cloud Storage FUSE כדי לטעון קטגוריות של Cloud Storage. התמיכה ברשת המארחת זמינה רק באשכולות GKE רגילים.

חשוב לוודא שקלאסטר GKE עומד בדרישות הבאות:

  • גם רמת הבקרה וגם מאגרי הצמתים באשכול GKE Standard צריכים להיות בגרסה 1.33.3-gke.1226000 ומעלה.
  • מפעילים את Workload Identity באשכול.
  • נותנים את הרשאות ה-IAM הנדרשות לחשבון השירות של Kubernetes שבו משתמש ה-Pod עם hostNetwork כדי לגשת לקטגוריית Cloud Storage. מידע נוסף זמין במאמר בנושא אימות ל-Cloud Storage FUSE.

כדי לאפשר לקבוצות ה-Pod שלכם HostNetwork לגשת לנפחי אחסון ב-Cloud Storage, אתם מציינים את מאפיין נפח האחסון hostNetworkPodKSA: "true" בהגדרת ה-Pod או ה-PersistentVolume. ההגדרה המדויקת משתנה בהתאם לאופן שבו אתם מנהלים את קובץ ה-sidecar של Cloud Storage FUSE.

קבצים נלווים מנוהלים

הקטע הזה רלוונטי אם GKE מזריק ומנהל באופן אוטומטי את קובץ ה-sidecar של Cloud Storage FUSE במכשירי ה-Pod שלכם. האפשרות הזו היא הגדרת ברירת המחדל המומלצת למנהל התקן ה-CSI של Cloud Storage FUSE.

נפח זמני

קובץ המניפסט של ה-Pod הבא מגדיר נפח זמני ל-Pod של HostNetwork כדי לגשת לקטגוריה ב-Cloud Storage.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"

נפח אחסון מתמיד

הגדרת המניפסט הבאה של PV מגדירה PV ל-Pod של HostNetwork כדי לגשת לקטגוריה של Cloud Storage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"

סיידקאר פרטי

הקטע הזה רלוונטי אם אתם מנהלים באופן ידני את קונטיינר ה-sidecar של Cloud Storage FUSE בתוך ה-Pods או משתמשים בתמונת sidecar בהתאמה אישית.

קובץ האימג' של ה-sidecar צריך להתבסס על מנהל התקן ה-CSI של Cloud Storage FUSE בגרסה v1.17.2 ואילך.

נפח זמני

קובץ המניפסט של ה-Pod הבא מגדיר נפח זמני ל-Pod של HostNetwork כדי לגשת לקטגוריה ב-Cloud Storage.

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"
        identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

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

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • LOCATION: המיקום של האשכול.
  • CLUSTER_NAME: השם של אשכול GKE Standard.

נפח אחסון מתמיד

הגדרת המניפסט הבאה של PV מגדירה PV ל-Pod של HostNetwork כדי לגשת לקטגוריה של Cloud Storage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"
    identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

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

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • LOCATION: המיקום של האשכול.
  • CLUSTER_NAME: השם של אשכול GKE Standard.

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