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

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

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

עלויות

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

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

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

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

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

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

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

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

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

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

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

  4. במסוף Cloud de Confiance , מפעילים את 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: המזהה של הפרויקט הנוכחי ב- Cloud de Confiance by S3NS . הגדרת המשתנה הזה עוזרת לוודא שכל המשאבים, כמו אשכול GKE, נוצרים בפרויקט הנכון.
  • CLUSTER_NAME: השם של אשכול GKE, לדוגמה agent-sandbox-cluster.
  • LOCATION: האזור שבו נוצר אשכול GKE. Cloud de Confiance by S3NS אם יוצרים אשכול במצב 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
    

הפעלת 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 עוזר לוודא שמספר מסוים של תרמילים (Pods) מחוממים מראש תמיד פועלים ומוכנים לשימוש. השימוש במשאב המותאם אישית הזה מצמצם את זמן האחזור של ההפעלה.

כדי לפרוס סביבת ארגז חול על ידי יצירת 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: Always
          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).

לפנות משאבים

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

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

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

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