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

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

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

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

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

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

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

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

התקנת Agent Substrate

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

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

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

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

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

ב-Agent Substrate, מגדירים נפחים חיצוניים של Filestore באופן הצהרתי במשאב ActorTemplate, במקום ליצור אובייקטים נפרדים של Kubernetes PersistentVolumeClaim. בשלבים הבאים מוסבר איך להגדיר 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 מגשר בין מנהל ההקצאות (provisioner) של Kubernetes StorageClass (filestore.csi.storage.gke.io) לבין נקודת הקצה ברשת gRPC של שירות בקר ה-CSI של Filestore, ולבין הנתיב של שקע הדומיין המקומי של 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 atespace ואת מרחב השמות של Kubernetes שישמשו כגבול הבידוד של מאגר העובדים, תבנית השחקן והשחקנים:

    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 שמטמיע נפח אחסון של ‎5 GiB מ-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 משתמש כדי לאחסן תמונות מצב של שחקנים.

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

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

    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
    

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

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

    kubectl ate resume actor ACTOR_NAME \
        -a ate-demo
    

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

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

  • מגדירים את הסביבה ל-GKE.
  • הגדרת ארגזי חול מחוממים מראש באמצעות Agent Sandbox.
  • כדאי לנסות אחסון דינמי באמצעות Agent Sandbox late-binding.