Usar volumes de agentes do Filestore com o GKE Agent Sandbox

O Google Kubernetes Engine (GKE) Agent Sandbox oferece isolamento no nível do kernel para código não confiável gerado por modelos usando o gVisor. Ao combinar o GKE Agent Sandbox com volumes de agentes do Filestore, você pode oferecer ambientes isolados e seguros com suporte de armazenamento de arquivos persistente e de alta densidade.

Neste guia, mostramos como configurar um pool de nós ativado para gVisor, definir um SandboxTemplate com modelos de declaração de volume do Filestore, pré-aquecer sandboxes com SandboxWarmPool e reivindicar sandboxes com SandboxClaim.

Antes de começar

Conclua a configuração do cluster e do driver CSI em Configurar o ambiente do GKE para volumes do agente do Filestore.

Criar um pool de nós com o gVisor ativado

Crie um pool de nós dedicado configurado com isolamento de sandbox do gVisor:

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

Substitua:

  • CLUSTER_NAME: o nome do cluster do GKE.
  • REGION: a região em que o cluster está localizado.
  • PROJECT_ID: o ID do projeto Google Cloud .

Criar um SandboxTemplate

Defina um manifesto SandboxTemplate chamado warmpool-filestore-template.yaml. O modelo configura as definições de ambiente de execução do gVisor, contextos de segurança não raiz e um bloco volumeClaimTemplates que segmenta o volume-pool-sc StorageClass:

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"

Aplique o manifesto:

kubectl apply -f warmpool-filestore-template.yaml

Criar um SandboxWarmPool

Para minimizar a latência de inicialização da sandbox, defina um manifesto SandboxWarmPool chamado sandbox-warmpool.yaml que mantenha instâncias de pod pré-aquecidas:

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

Aplique o manifesto:

kubectl apply -f sandbox-warmpool.yaml

Verifique se os pods do pool quente estão prontos:

kubectl get sandboxwarmpool filestore-warmpool -n default

Reivindicar um pod de sandbox

Quando uma sessão de agente começar, envie um manifesto SandboxClaim chamado sandbox-claim.yaml para reivindicar um sandbox pré-aquecido:

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

Aplique o manifesto:

kubectl apply -f sandbox-claim.yaml

Verificar o volume ativado

  1. Verifique se a declaração está vinculada a um pod:

    kubectl get sandboxclaim agent-session-1
    
  2. Encontre o pod associado à sua reivindicação:

    kubectl get pods -l extensions.agents.x-k8s.io/claimed-by=agent-session-1
    
  3. Verifique se o volume está ativado dentro do contêiner reivindicado:

    kubectl logs POD_NAME -c agent-container
    

    Substitua POD_NAME pelo nome do pod retornado na etapa anterior.

    O registro confirma que /workspace/session-init.txt foi criado no volume montado do Filestore.

A seguir