Google Kubernetes Engine (GKE) Agent Substrate היא פלטפורמת תשתית שמנהלת את מחזור החיים של ארגזי חול של סוכני AI עם שמירת מצב (stateful). באמצעות Agent Substrate, פלטפורמות יכולות להשעות עומסי עבודה של סוכנים לא פעילים כדי לחסוך בעלויות המחשוב, ולהמשיך אותם תוך פחות משנייה כשמגיעות הנחיות או משימות חדשות.
נפחי האחסון לסוכנים ב-Filestore מספקים את שכבת האחסון המתמיד ל-Agent Substrate, ושומרים על קובצי סביבת העבודה, מאגרי המקורות של הקוד ורכיבי הטיוטה במחזורי ההשעיה וההמשך של ארגז החול.
איך Agent Substrate משתמש בנפחי אחסון לסוכנים
בשלבים הבאים מוסבר איך Agent Substrate ונפחי האחסון לסוכנים ב-Filestore תומכים בסוכן אינטראקטיבי לכתיבת קוד, שעוזר למפתחים ליצור תכונות, להריץ בדיקות ולנפות באגים בקוד:
- הפעלת הסשן: כשמפתח שולח משימה, Agent Substrate יוצר סביבת ארגז חול ב-GKE ומחבר נפח Filestore ייעודי. הנציג משכפל את מאגר הפרויקט, מתקין יחסי תלות ומכין את סביבת העבודה.
- השעיה חסכונית במצב חוסר פעילות: בזמן שהמפתח בודק את ההבדלים בקוד או יוצר את ההנחיה הבאה, Agent Substrate מבטל את הטעינה של אמצעי האחסון וסוגר את סביבת המחשוב. השימוש במשאבי המחשוב יורד לאפס, וכל הקבצים בסביבת העבודה, היסטוריית ה-Git והמטמונים של ה-build נשארים בנפח.
- המשך מיידי: כשהמפתח שולח הנחיה חדשה, 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
יוצרים את מרחב השמות של
ate-demoושל Kubernetes שישמש כגבול הבידוד של מאגר ה-workers, תבנית ה-actor וה-actors:kubectl ate create atespace ate-demo kubectl create namespace ate-demo
יוצרים משאב
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מחילים את המניפסט
WorkerPool:kubectl apply -f worker-pool.yaml
יוצרים קובץ בשם
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חייב להיות מותקן על ידי מאגר אחד לפחות.-
יוצרים את
ActorTemplateבאמצעות Agent Substrate API באמצעות ה-CLI שלkubectl ate:kubectl ate create actor-template -f actor-template.yaml
יצירה, השעיה והפעלה מחדש של שחקן
אחרי שיוצרים את ActorTemplate והתמונה המושלמת מוכנה, אפשר ליצור מופע של שחקן ולנהל את מצב ההפעלה שלו:
יצירת דמות חדשה מתוך
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.השעיית המשתמש כשהוא לא פעיל:
kubectl ate suspend actor ACTOR_NAME \ -a ate-demoהשעיית ה-actor שומרת את מצב הזיכרון שלו ב-Cloud Storage, מבטלת את הטעינה של אמצעי האחסון ב-Filestore ומנתקת אותו, תוך שמירה על כל קובצי סביבת העבודה באמצעי האחסון, ומשחררת את עומס העבודה.
המשך הפעולה של השחקן כשמגיעה בקשה או משימה חדשה:
kubectl ate resume actor ACTOR_NAME \ -a ate-demoכשממשיכים את ה-actor, הוא מוקצה לעומס עבודה זמין, משחזר את תמונת המצב של הזיכרון שלו ומחבר מחדש את נפח האחסון הקיים ב-Filestore ב-
/mnt/shared, כשכל הקבצים שלמים.
המאמרים הבאים
- מגדירים את הסביבה ל-GKE.
- להגדיר ארגזי חול שחוממו מראש באמצעות Agent Sandbox.
- אחסון דינמי באמצעות קישור מאוחר של Agent Sandbox.