Filestore-Agent-Volumes mit GKE Agent Sandbox verwenden

Die Google Kubernetes Engine (GKE) Agent Sandbox bietet mit gVisor eine Isolation auf Kernelebene für nicht vertrauenswürdigen, modellgenerierten Code. Durch die Kombination von GKE Agent Sandbox mit Filestore-Agenten-Volumes können Sie sichere, isolierte Umgebungen bereitstellen, die durch persistenten, hochdichten Dateispeicher unterstützt werden.

In dieser Anleitung wird gezeigt, wie Sie einen gVisor-fähigen Knotenpool konfigurieren, ein SandboxTemplate mit Filestore-Volume-Claim-Vorlagen definieren, Sandboxes mit SandboxWarmPool vorab aufwärmen und Sandboxes mit SandboxClaim beanspruchen.

Hinweis

Führen Sie die Cluster- und CSI-Treiberkonfiguration unter GKE-Umgebung für Filestore-Agent-Volumes einrichten aus.

gVisor-fähigen Knotenpool erstellen

Erstellen Sie einen dedizierten Knotenpool, der mit der gVisor-Sandbox-Isolierung konfiguriert ist:

gcloud container node-pools create gvisor-pool \
    --cluster=CLUSTER_NAME \
    --location=REGION \
    --project=PROJECT_ID \
    --image-type=cos_containerd \
    --sandbox=type=gvisor \
    --num-nodes=2 \
    --machine-type=n2-standard-16 \
    --enable-autoscaling \
    --min-nodes=1 \
    --max-nodes=10 \
    --scopes=cloud-platform

Ersetzen Sie Folgendes:

  • CLUSTER_NAME: Name Ihres GKE-Clusters.
  • REGION: Die Region, in der sich der Cluster befindet.
  • PROJECT_ID: Projekt-ID in Google Cloud .

SandboxTemplate erstellen

Definieren Sie ein SandboxTemplate-Manifest mit dem Namen warmpool-filestore-template.yaml. Die Vorlage konfiguriert gVisor-Laufzeiteinstellungen, Sicherheitskontexte ohne Root-Berechtigungen und einen volumeClaimTemplates-Block, der auf die volume-pool-sc StorageClass ausgerichtet ist:

apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxTemplate
metadata:
  name: warmpool-filestore-template
  namespace: default
spec:
  podTemplate:
    spec:
      runtimeClassName: gvisor
      automountServiceAccountToken: false
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        fsGroup: 1000
      nodeSelector:
        sandbox.gke.io/runtime: gvisor
      tolerations:
        - key: "sandbox.gke.io/runtime"
          value: "gvisor"
          effect: "NoSchedule"
      containers:
        - name: agent-container
          image: busybox
          command: ["/bin/sh", "-c"]
          args:
            - |
              echo "Sandbox started with Filestore volume mounted!"
              ls -la /workspace
              date > /workspace/session-init.txt
              cat /workspace/session-init.txt
              sleep 3600
          securityContext:
            capabilities:
              drop: ["ALL"]
            allowPrivilegeEscalation: false
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          volumeMounts:
            - name: agent-workspace
              mountPath: /workspace
  volumeClaimTemplates:
    - metadata:
        name: agent-workspace
      spec:
        accessModes: ["ReadWriteMany"]
        storageClassName: "volume-pool-sc"
        resources:
          requests:
            storage: "1Gi"

Wenden Sie das Manifest an:

kubectl apply -f warmpool-filestore-template.yaml

SandboxWarmPool erstellen

Um die Startlatenz der Sandbox zu minimieren, definieren Sie ein SandboxWarmPool-Manifest mit dem Namen sandbox-warmpool.yaml, in dem vorbereitete Pod-Instanzen verwaltet werden:

apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxWarmPool
metadata:
  name: filestore-warmpool
  namespace: default
spec:
  replicas: 3
  sandboxTemplateRef:
    name: warmpool-filestore-template

Wenden Sie das Manifest an:

kubectl apply -f sandbox-warmpool.yaml

Prüfen Sie, ob die Pods des Warmpools bereit sind:

kubectl get sandboxwarmpool filestore-warmpool -n default

Sandbox-Pod anfordern

Wenn eine Agentensitzung beginnt, senden Sie ein SandboxClaim-Manifest mit dem Namen sandbox-claim.yaml, um eine vorab aufgewärmte Sandbox zu beanspruchen:

apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxClaim
metadata:
  name: agent-session-1
  namespace: default
spec:
  sandboxTemplateRef:
    name: warmpool-filestore-template

Wenden Sie das Manifest an:

kubectl apply -f sandbox-claim.yaml

Bereitgestelltes Volume prüfen

  1. Prüfen Sie, ob der Anspruch an einen Pod gebunden ist:

    kubectl get sandboxclaim agent-session-1
    
  2. Suchen Sie den Pod, der mit Ihrem Anspruch verknüpft ist:

    kubectl get pods -l extensions.agents.x-k8s.io/claimed-by=agent-session-1
    
  3. Prüfen Sie, ob das Volume im beanspruchten Container bereitgestellt ist:

    kubectl logs POD_NAME -c agent-container
    

    Ersetzen Sie POD_NAME durch den Namen des Pods, der im vorherigen Schritt zurückgegeben wurde.

    Das Log bestätigt, dass /workspace/session-init.txt auf dem bereitgestellten Filestore-Volume erstellt wurde.

Nächste Schritte