הפעלת ארגז חול של סוכנים ב-GKE

במאמר הזה מוסבר איך להפעיל את התכונה Agent Sandbox באשכול Google Kubernetes Engine ‏ (GKE). בנוסף, מוסבר איך ליצור סביבת ארגז חול באשכול כדי להריץ בבטחה קוד לא מהימן.

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

עלויות

‫Agent Sandbox מוצע ללא תשלום ב-GKE. התמחור של GKE חל על המשאבים שאתם יוצרים.

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

לפני שמתחילים

  1. בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  3. מפעילים את ממשקי ה-API של Artifact Registry ו-Google Kubernetes Engine.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    הפעלת ממשקי ה-API

  4. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

  5. מוודאים שהאשכול פועל ב-GKE בגרסה 1.35.2-gke.1269000 ואילך.

הגדרת משתני סביבה

כדי לפשט את הפקודות שמריצים במסמך הזה, אפשר להגדיר משתני סביבה ב-Cloud Shell. ב-Cloud Shell, מגדירים את משתני הסביבה השימושיים הבאים על ידי הרצת הפקודות הבאות:

export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export LOCATION="us-central1"
export CLUSTER_VERSION="1.35.2-gke.1269000"
export NODE_POOL_NAME="agent-sandbox-pool"
export MACHINE_TYPE="e2-standard-2"

הסבר על משתני הסביבה האלה:

  • PROJECT_ID: המזהה של הפרויקט הנוכחי ב- Google Cloud . הגדרת המשתנה הזה עוזרת לוודא שכל המשאבים, כמו אשכול GKE, נוצרים בפרויקט הנכון.
  • CLUSTER_NAME: השם של אשכול GKE, לדוגמה agent-sandbox-cluster.
  • LOCATION: האזור Google Cloud או האזור שבו נוצר אשכול GKE. אם יוצרים אשכול במצב Autopilot, צריך להגדיר את האזור (לדוגמה, us-central1). אם יוצרים אשכול רגיל, צריך להגדיר את האזור (לדוגמה, us-central1-a).
  • CLUSTER_VERSION: הגרסה של GKE שבה יפעל האשכול. כדי להשתמש בתכונה Agent Sandbox צריך גרסה 1.35.2-gke.1269000 ואילך.
  • NODE_POOL_NAME: השם של מאגר הצמתים שיריץ עומסי עבודה בסביבת ארגז חול. לדוגמה, agent-sandbox-pool. המשתנה הזה נדרש רק אם יוצרים אשכול GKE Standard.
  • MACHINE_TYPE: סוג המכונה של הצמתים במאגר הצמתים, לדוגמה e2-standard-2. פרטים על סדרות שונות של מכונות ואפשרויות שונות זמינים במאמר השוואה בין משפחות של מכונות ומשאבים. המשתנה הזה נדרש רק אם יוצרים אשכול GKE Standard.

הפעלת ארגז חול של סוכן

אפשר להפעיל את התכונה Agent Sandbox כשיוצרים אשכול חדש או כשמעדכנים אשכול קיים.

הפעלת ארגז חול של סוכנים כשיוצרים אשכול GKE חדש

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

טייס אוטומטי

כדי ליצור אשכול GKE Autopilot חדש עם Agent Sandbox מופעל, צריך לכלול את הדגל --enable-agent-sandbox:

gcloud beta container clusters create-auto ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-agent-sandbox

באשכול Autopilot, מוודאים שמשתנה הסביבה LOCATION מוגדר לאזור (לדוגמה, us-central1).

רגילה

כדי ליצור אשכול GKE Standard חדש עם Agent Sandbox מופעל, צריך ליצור את האשכול, להוסיף מאגר צמתים עם gVisor מופעל ואז להפעיל את התכונה Agent Sandbox. כדי לחסוך בעלויות, מומלץ ליצור אשכול אזורי עם צומת יחיד לכל מאגר:

  1. יוצרים את האשכול:

    gcloud beta container clusters create ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --num-nodes=1 \
        --cluster-version=${CLUSTER_VERSION}
    

    במקרה של אשכול Standard, מוודאים שמשתנה הסביבה LOCATION מוגדר לאזור (לדוגמה, us-central1-a).

  2. יוצרים מאגר צמתים נפרד עם gVisor מופעל:

    gcloud container node-pools create ${NODE_POOL_NAME} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${MACHINE_TYPE} \
        --location=${LOCATION} \
        --num-nodes=1 \
        --image-type=cos_containerd \
        --sandbox=type=gvisor
    

    האזור LOCATION צריך להיות זהה לאזור שבו השתמשתם כשיצרתם את האשכול.

  3. מעדכנים את האשכול כדי להפעיל את התכונה Agent Sandbox:

    gcloud beta container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-agent-sandbox
    

הפעלת ארגז חול של סוכנים כשמעדכנים אשכול GKE קיים

כדי להפעיל את Agent Sandbox באשכול קיים, האשכול צריך לפעול בגרסה 1.35.2-gke.1269000 ואילך.

מוודאים שמשתנה הסביבה LOCATION מוגדר לאזור או לאזור הזמין שבו נמצא האשכול הקיים.

  1. אם אתם משתמשים באשכול GKE Standard, ‏ Agent Sandbox מסתמך על gVisor. אם באשכול Standard שלכם אין מאגר צמתים עם gVisor, אתם צריכים ליצור כזה מאגר קודם:

    gcloud container node-pools create ${NODE_POOL_NAME} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${MACHINE_TYPE} \
        --location=${LOCATION} \
        --image-type=cos_containerd \
        --sandbox=type=gvisor
    
  2. מעדכנים את האשכול כדי להפעיל את התכונה Agent Sandbox:

    gcloud beta container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-agent-sandbox
    

אימות ההגדרה

כדי לבדוק אם התכונה Agent Sandbox מופעלת, צריך לבדוק את תיאור האשכול.

gcloud beta container clusters describe ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --format="value(addonsConfig.agentSandboxConfig.enabled)"

אם יצרתם אשכול במצב Autopilot, המיקום הוא האזור (לדוגמה, us-central1). אם יצרתם אשכול סטנדרטי, המיקום הוא האזור (לדוגמה, us-central1-a).

אם התכונה מופעלת בהצלחה, הפקודה מחזירה True.

דרישות לפריסת ארגז חול של סוכן

כדי לפרוס עומס עבודה, כמו Sandbox או SandboxTemplate, בהצלחה, מניפסט ה-YAML צריך לכלול הגדרות אבטחה והגדרות תצורה ספציפיות. ‫GKE אוכף את הדרישות האלה באמצעות מדיניות אימות כניסה (VAP). אם לא עומדים בדרישות האלה, בקרת הכניסה דוחה את הפריסה.

הגדרה נדרשת

קובץ המניפסט של הפריסה צריך לכלול את ההגדרות הבאות:

  • runtimeClassName: gvisor: מוודא שה-Pod יפעל בארגז חול של gVisor.
  • automountServiceAccountToken: false: מונע מה-Pod לטעון באופן אוטומטי את אסימון חשבון השירות שמוגדר כברירת מחדל.
  • securityContext.runAsNonRoot: true: מוודא שהקונטיינר לא יפעל כמשתמש root.
  • securityContext.capabilities.drop: ["ALL"]: מסיר את כל היכולות של Linux מהקונטיינר.
  • resources.limits: צריך לציין מגבלות על המעבד (CPU) והזיכרון כדי למנוע תרחישים פוטנציאליים של התקפת מניעת שירות (DoS).
  • nodeSelector: צריך לטרגט sandbox.gke.io/runtime: gvisor.
  • tolerations: צריך לכלול toleration ל-taint‏ sandbox.gke.io/runtime=gvisor:NoSchedule.

הגדרה אסורה

קובץ המניפסט של הפריסה לא יכול לכלול את הרכיבים הבאים:

  • hostNetwork: true, ‏hostPID: true או hostIPC: true.
  • privileged: true בהקשרים של אבטחת קונטיינרים.
  • HostPath כרכים.
  • נוספו יכולות (capabilities.add).
  • ההגדרות של hostPort.
  • ‫sysctl בהתאמה אישית.
  • הנפחים הצפויים של אסימונים או אישורים של חשבונות שירות.

פריסת סביבת ארגז חול

מומלץ לפרוס סביבת ארגז חול על ידי הגדרת SandboxTemplate ולהשאיר מופעים מחוממים מראש מוכנים באמצעות SandboxWarmPool. לאחר מכן תוכלו לבקש מכונה ממאגר הצמתים החמים הזה באמצעות SandboxClaim. לחלופין, אפשר ליצור ארגז חול ישירות, אבל בגישה הזו אין תמיכה בבריכות חמות.

‫SandboxTemplate,‏ SandboxWarmPool,‏ SandboxClaim ו-Sandbox הם משאבים מותאמים אישית של Kubernetes.

ה-SandboxTemplate משמש כתוכנית פעולה לשימוש חוזר. ה-SandboxWarmPool עוזר לוודא שמספר מסוים של תרמילי Pod מחוממים מראש תמיד פועלים ומוכנים לשימוש. השימוש במשאב המותאם אישית הזה מצמצם את זמן האחזור של ההפעלה.

כדי לפרוס סביבת ארגז חול על ידי יצירת SandboxTemplate ו-SandboxWarmPool, מבצעים את השלבים הבאים:

  1. ב-Cloud Shell, יוצרים קובץ בשם sandbox-template.yaml עם התוכן הבא:

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxTemplate
    metadata:
      name: python-runtime-template
      namespace: default
    spec:
      podTemplate:
        metadata:
          labels:
            sandbox-type: python-runtime
        spec:
          runtimeClassName: gvisor # Required
          automountServiceAccountToken: false # Required
          securityContext:
            runAsNonRoot: true # Required
          nodeSelector:
            sandbox.gke.io/runtime: gvisor # Required
          tolerations:
          - key: "sandbox.gke.io/runtime"
            value: "gvisor"
            effect: "NoSchedule" # Required
          containers:
          - name: runtime
            image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0
            ports:
            - containerPort: 8888
            resources:
              requests:
                cpu: "250m"
                memory: "512Mi"
              limits:
                cpu: "500m"
                memory: "1Gi" # Required
            securityContext:
              capabilities:
                drop: ["ALL"] # Required
          restartPolicy: OnFailure
    
  2. החלת מניפסט SandboxTemplate:

    kubectl apply -f sandbox-template.yaml
    
  3. יוצרים קובץ בשם sandbox-warmpool.yaml עם התוכן הבא:

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxWarmPool
    metadata:
      name: python-runtime-warmpool
      namespace: default
      labels:
        app: python-runtime-warmpool
    spec:
      replicas: 2
      sandboxTemplateRef:
        # This must match the name of the SandboxTemplate.
        name: python-runtime-template
    
  4. החלת מניפסט SandboxWarmPool:

    kubectl apply -f sandbox-warmpool.yaml
    

יצירת SandboxClaim

הבקשה SandboxClaim מבקשת ארגז חול מהתבנית. מכיוון שיצרתם מאגר חם, ארגז החול שנוצר מאמץ Pod פעיל מהמאגר במקום להתחיל Pod חדש.

כדי לבקש ארגז חול מהתבנית על ידי יצירת SandboxClaim, צריך לבצע את השלבים הבאים:

  1. יוצרים קובץ בשם sandbox-claim.yaml עם התוכן הבא:

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxClaim
    metadata:
      name: sandbox-claim
      namespace: default
    spec:
      sandboxTemplateRef:
        # This must match the name of the SandboxTemplate.
        name: python-runtime-template
    
  2. החלת מניפסט SandboxClaim:

    kubectl apply -f sandbox-claim.yaml
    
  3. מוודאים שארגז החול, התביעה ומאגר המכונות הווירטואליות המוכנות מוכנים:

    kubectl get sandboxwarmpool,sandboxclaim,sandbox,pod
    

חלופה: יצירת ארגז חול ישירות

אם אתם לא צריכים את זמני ההפעלה המהירים שמאפשרים מאגרי משאבים חמים, אתם יכולים לפרוס ארגז חול ישירות בלי להשתמש בתבניות.

כדי לפרוס סביבה מבודדת על ידי יצירת ארגז חול ישירות, מבצעים את השלבים הבאים:

  1. יוצרים קובץ בשם sandbox.yaml עם התוכן הבא:

    apiVersion: agents.x-k8s.io/v1alpha1
    kind: Sandbox
    metadata:
      name: sandbox-example-2
    spec:
      replicas: 1
      podTemplate:
        metadata:
          labels:
            sandbox: sandbox-example
        spec:
          runtimeClassName: gvisor
          restartPolicy: OnFailure
          automountServiceAccountToken: false # Required
          securityContext:
            runAsNonRoot: true # Required
            runAsUser: 1000 # Required if image defaults to root (e.g. busybox)
          nodeSelector:
            sandbox.gke.io/runtime: gvisor
          tolerations:
          - key: "sandbox.gke.io/runtime"
            value: "gvisor"
            effect: "NoSchedule" # Required
          containers:
          - name: my-container
            image: busybox
            command: ["/bin/sh", "-c"]
            args: ["sleep 3600000; echo 'Container finished successfully'; exit 0"]
            securityContext:
              capabilities:
                drop: ["ALL"] # Required
              allowPrivilegeEscalation: false
            resources:
              limits:
                cpu: "100m"
                memory: "128Mi" # Required
    
  2. החלת מניפסט Sandbox:

    kubectl apply -f sandbox.yaml
    
  3. מוודאים שארגז החול פועל:

    kubectl get sandbox
    

השבתת ארגז החול של הסוכן

כדי להשבית את התכונה Agent Sandbox, משתמשים בפקודה gcloud beta container clusters update עם הדגל --no-enable-agent-sandbox.

gcloud beta container clusters update ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --no-enable-agent-sandbox

אם יצרתם אשכול במצב Autopilot, המיקום הוא האזור (לדוגמה, us-central1). אם יצרתם אשכול סטנדרטי, המיקום הוא האזור (לדוגמה, us-central1-a).

פינוי משאבים

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

gcloud container clusters delete $CLUSTER_NAME \
    --location=${LOCATION} \
    --quiet

אם יצרתם אשכול במצב Autopilot, המיקום הוא האזור (לדוגמה, us-central1). אם יצרתם אשכול סטנדרטי, המיקום הוא האזור (לדוגמה, us-central1-a).

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