שימוש בנפחי סוכן של Filestore עם GKE Agent Substrate

‫Google Kubernetes Engine (GKE) Agent Substrate היא פלטפורמת תשתית שמנהלת את מחזור החיים של ארגזי חול של סוכני AI עם שמירת מצב (stateful). באמצעות Agent Substrate, פלטפורמות יכולות להשעות עומסי עבודה של סוכנים לא פעילים כדי לחסוך בעלויות המחשוב, ולהמשיך אותם תוך פחות משנייה כשמגיעות הנחיות או משימות חדשות.

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

איך Agent Substrate משתמש בנפחי אחסון לסוכנים

בשלבים הבאים מוסבר איך Agent Substrate ונפחי האחסון לסוכנים ב-Filestore תומכים בסוכן אינטראקטיבי לכתיבת קוד, שעוזר למפתחים ליצור תכונות, להריץ בדיקות ולנפות באגים בקוד:

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

מידע נוסף זמין במאמרי העזרה בנושא Agent Substrate.

כדי להריץ עומסי עבודה של סוכנים עם שמירת מצב (stateful) ב-GKE Agent Substrate עם נפחי אחסון לסוכנים ב-Filestore, צריך להתקין את Agent Substrate, להגדיר את השילוב של מנהל התקן ה-CSI של Filestore ולהגדיר את עומסי העבודה של הסוכנים כך שישתמשו בנפחי CSI דינמיים.

התקנת Agent Substrate

כדי להכין את הפרויקט ב- Google Cloud ולהתקין את Agent Substrate באשכול GKE Standard, פועלים לפי ההוראות במאמר התקנת Agent Substrate ב-GKE.

התקנה והגדרה של מנהל ההתקן של Filestore CSI

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

מישור הבקרה של Agent Substrate‏ (ateapi) מתקשר ישירות עם הבקר של מנהל ההתקן של Filestore CSI דרך gRPC ברשת. מנהל ההתקן של CSI מקצה, מצרף ומנתק באופן דינמי נפחים לכל שחקן ממאגר הנפחים של Filestore, בסנכרון עם מחזור החיים של כל שחקן.

יצירת עומסי עבודה שמשתמשים בנפחי אחסון של Filestore

ב-Agent Substrate, מגדירים נפחי Filestore חיצוניים באופן הצהרתי במשאב ActorTemplate, במקום ליצור אובייקטים נפרדים של PersistentVolumeClaim ב-Kubernetes. בשלבים הבאים מוסבר איך להגדיר StorageClass ו-CSIDriverConfig של Filestore, לפרוס WorkerPool ו-ActorTemplate שמחברים נפח חיצוני של Filestore ולנהל את מחזור החיים של השחקן.

יצירת StorageClass

יוצרים קובץ בשם storageclass.yaml כדי להקצות נפחים דינמיים ממאגר הנפחים של Filestore:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: substrate-volumepool-sc
provisioner: filestore.csi.storage.gke.io
parameters:
  volume-pool: "projects/PROJECT_ID/locations/LOCATION/volumePools/VOLUME_POOL_NAME"
allowVolumeExpansion: false
reclaimPolicy: Delete
volumeBindingMode: Immediate

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

  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • ‫LOCATION: האזור שבו נמצא מאגר הנפחים, למשל us-central1.
  • ‫VOLUME_POOL_NAME: השם של מאגר הנפחים ב-Filestore.

מחילים את StorageClass:

kubectl apply -f storageclass.yaml

רישום של CSIDriverConfig

המשאב CSIDriverConfig מגשר בין מנהל ההקצאות (filestore.csi.storage.gke.io) של StorageClass לבין נקודת הקצה של gRPC ברשת של שירות הבקר של Filestore CSI, וגם לנתיב של שקע הדומיין המקומי של Unix של הפלאגין של צומת ה-CSI.

יוצרים קובץ בשם csi-driver-config.yaml:

apiVersion: ate.dev/v1alpha1
kind: CSIDriverConfig
metadata:
  name: filestore.csi.storage.gke.io
spec:
  driverName: filestore.csi.storage.gke.io
  controllerEndpoint: tcp://csi-filestore-controller.gcp-filestore-csi-driver.svc:10000
  nodeSocketOverride: unix:///var/lib/kubelet/plugins/filestore.csi.storage.gke.io/csi.sock
  tls:
    enabled: true
    usePodIdentity: true
    serverName: csi-filestore-controller.gcp-filestore-csi-driver.svc

מחילים את CSIDriverConfig:

kubectl apply -f csi-driver-config.yaml

הגדרת WorkerPool וActorTemplate

  1. יוצרים את מרחב השמות של ate-demo ושל Kubernetes שישמש כגבול הבידוד של מאגר ה-workers, תבנית ה-actor וה-actors:

    kubectl ate create atespace ate-demo
    kubectl create namespace ate-demo
    
  2. יוצרים משאב WorkerPool כדי לשמור על עומסי עבודה פיזיים במצב המתנה שמוכנים לארח ארגזי חול של שחקנים. שומרים את המניפסט הבא בתור worker-pool.yaml:

    apiVersion: ate.dev/v1alpha1
    kind: WorkerPool
    metadata:
      name: agent-pool
      namespace: ate-demo
      labels:
        workload: stateful-agent
    spec:
      replicas: 5
      workerImage: ko://github.com/agent-substrate/substrate/cmd/ateom-gvisor
    
  3. מחילים את המניפסט WorkerPool:

    kubectl apply -f worker-pool.yaml
    
  4. יוצרים קובץ בשם actor-template.yaml שמגדיר את ה-ActorTemplate שטוען נפח של 5GiB מ-substrate-volumepool-sc:

    metadata:
      atespace: ate-demo
      name: stateful-agent-template
    workerSelector:
      matchLabels:
        workload: stateful-agent
    containers:
    - name: agent
      image: CONTAINER_IMAGE
      volumeMounts:
      - name: shared-storage
        mountPath: /mnt/shared
      readyz:
        httpGet:
          path: /readyz
          port: 8080
    sandboxConfig:
      sandboxClass: SANDBOX_CLASS_GVISOR
      configName: gvisor-default
    snapshotsConfig:
      storageLocation: gs://SNAPSHOT_BUCKET/stateful-agent
    volumes:
    - name: shared-storage
      externalVolumeTemplate:
        capacity: 5Gi
        storageClassName: substrate-volumepool-sc
    

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

    • ‫CONTAINER_IMAGE: קובץ האימג' של הקונטיינר לעומס העבודה של הסוכן, למשל gcr.io/my-project/agent-app@sha256:7f28ab0....
    • ‫SNAPSHOT_BUCKET: הקטגוריה של Cloud Storage שמשמשת את Agent Substrate לאחסון קובצי snapshot של שחקנים.

    במניפסט הזה, volumes[].externalVolumeTemplate מציין את קיבולת הנפח המבוקשת (5Gi) ואת StorageClass (substrate-volumepool-sc) שה-provisioner שלו תואם ל-CSIDriverConfig, ו-containers[].volumeMounts טוען את הנפח הזה ב-/mnt/shared. כל אמצעי אחסון שמוצהר ב-volumes חייב להיות מותקן על ידי מאגר אחד לפחות.

  5. יוצרים את ActorTemplate באמצעות Agent Substrate API באמצעות ה-CLI של kubectl ate:

    kubectl ate create actor-template -f actor-template.yaml
    

יצירה, השעיה והפעלה מחדש של שחקן

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

  1. יצירת דמות חדשה מתוך stateful-agent-template:

    kubectl ate create actor ACTOR_NAME \
        --template=stateful-agent-template \
        -a ate-demo
    

    מחליפים את ACTOR_NAME בשם תווית DNS-1123 של הגורם, למשל my-agent-1.

    כשיוצרים את השחקן, Agent Substrate מקצה באופן דינמי נפח Filestore ייעודי מ-substrate-volumepool-sc ומעלה אותו ב-/mnt/shared.

  2. השעיית המשתמש כשהוא לא פעיל:

    kubectl ate suspend actor ACTOR_NAME \
        -a ate-demo
    

    השעיית ה-actor שומרת את מצב הזיכרון שלו ב-Cloud Storage, מבטלת את הטעינה של אמצעי האחסון ב-Filestore ומנתקת אותו, תוך שמירה על כל קובצי סביבת העבודה באמצעי האחסון, ומשחררת את עומס העבודה.

  3. המשך הפעולה של השחקן כשמגיעה בקשה או משימה חדשה:

    kubectl ate resume actor ACTOR_NAME \
        -a ate-demo
    

    כשממשיכים את ה-actor, הוא מוקצה לעומס עבודה זמין, משחזר את תמונת המצב של הזיכרון שלו ומחבר מחדש את נפח האחסון הקיים ב-Filestore ב-/mnt/shared, כשכל הקבצים שלמים.

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