GKE에 보안 AI 에이전트 배포

1. 소개

이 실습에서는 프로덕션 환경 내에서 동적 코드를 실행하는 AI 에이전트의 개발 및 보안에 중점을 둡니다. AI 애플리케이션이 간단한 채팅 인터페이스를 넘어 발전함에 따라 실시간으로 코드를 생성하고 실행하여 데이터 분석, 수학적 모델링, 파일 처리와 같은 복잡한 로직을 수행하는 기능이 필요한 경우가 많습니다. 이 실습에서는 에이전트 개발 키트 (ADK)를 사용하여 추론 에이전트를 빌드하고 GKE 에이전트 샌드박스를 사용하여 AI가 생성한 코드가 격리된 보안 환경에서 실행되도록 하는 방법을 보여줍니다.

신뢰할 수 없는 코드의 기술적 문제

AI 에이전트가 코드 (예: Python)를 생성하고 실행하면 기본적으로 인프라에서 신뢰할 수 없는 워크로드를 실행하는 것입니다. 에이전트가 손상되거나 악성 작업을 실행하도록 지시받은 경우 민감한 환경 변수에 액세스하거나, 내부 네트워크를 스캔하거나, 기본 호스트 노드를 악용하려고 시도할 수 있습니다. 이러한 동적 워크로드에는 기존 컨테이너 격리가 충분하지 않은 경우가 많습니다. 이 문제를 해결하려면 플랫폼 엔지니어가 커널 수준 격리 및 제한된 네트워크 이그레스를 포함하는 다층 보안을 구현해야 합니다.

핵심 개념

  • 에이전트 개발 키트 (ADK): ADK는 작업에 대해 추론할 수 있는 애플리케이션을 빌드하는 데 사용되는 프레임워크입니다. AI가 프롬프트를 수신하고, 일련의 작업을 계획하고, 특정 도구를 호출한 다음, 최종 출력을 요약하는 '추론 루프'를 관리합니다. 이 워크플로에서 ADK는 사용자 요청에 코드 실행이 필요한 시점을 식별하는 오케스트레이터 역할을 합니다.
  • GKE 에이전트 샌드박스: 이 보안 기능은 각 컨테이너에 특화된 게스트 커널을 제공하는 오픈소스 컨테이너 런타임인 gVisor를 활용합니다. 애플리케이션과 호스트 커널 간의 시스템 호출 (syscall)을 가로채는 GKE 에이전트 샌드박스는 신뢰할 수 없는 코드가 노드와 직접 상호작용하는 것을 방지합니다. 이렇게 하면 컨테이너 내의 보안 침해가 클러스터의 나머지 부분으로 확대되지 않습니다.
  • 모델 컨텍스트 프로토콜 (MCP) 및 도구: 이 프로토콜은 AI 모델이 외부 도구와 상호작용하는 표준 방법을 설정합니다. 이 실습에서는 Python 스크립트를 실행하기 위해 특수 샌드박스 컨트롤러와 통신하는 '코드 실행' 도구로 에이전트가 구성됩니다.

실습 목표

이 세션의 목표는 다음과 같습니다.

  1. 에이전트 개발: 데이터 분석 작업을 위해 설계된 ADK 기반 에이전트를 구성합니다.
  2. 커널 격리 구성: 특수 RuntimeClass를 사용하여 GKE 에이전트 Sandbox를 설정합니다.
  3. 성능 최적화: 새 실행 환경을 시작하는 데 걸리는 시간을 최소화하기 위해 샌드박스의 '웜 풀'을 구현합니다.
  4. 보안 경계 적용: 네트워크 정책을 적용하여 실행 환경에서 무단 이그레스를 방지합니다.

2. 프로젝트 설정

에이전트 애플리케이션을 빌드하기 전에 환경을 올바르게 구성해야 합니다. 이 섹션에서는 필요한 도구에 액세스하고 Google Cloud 프로젝트에서 AI 에이전트와 보안 실행 환경을 모두 호스팅할 수 있는지 확인합니다.

Cloud Shell 열기

이 실습에서는 Google Cloud에서 제공하는 브라우저 기반 터미널 환경인 Cloud Shell을 사용합니다. Cloud Shell은 애플리케이션을 빌드하고 배포하는 데 필요한 Google Cloud CLI (gcloud), kubectl, Docker 환경과 함께 사전 구성되어 있습니다.

  1. Google Cloud Console로 이동합니다.
  2. 오른쪽 상단 헤더 (>_ 아이콘)에서 Cloud Shell 활성화 버튼을 클릭합니다.
  3. 브라우저 하단에 터미널이 열리면 메시지가 표시될 때 계속을 클릭합니다.

프로젝트 선택

잘못된 환경에 리소스가 배포되지 않도록 셸이 올바른 Google Cloud 프로젝트를 가리키는지 확인해야 합니다.

👉💻 콘솔 대시보드에서 프로젝트 ID를 식별하고 다음 명령어를 실행하여 현재 셸에서 프로젝트를 설정합니다.

gcloud config set project [YOUR_PROJECT_ID]

API 사용 설정

에이전트를 빌드하고 배포하려면 컨테이너 빌드, 이미지 호스팅, 생성형 모델 액세스를 위한 여러 전문 API가 필요합니다.

👉💻 다음 명령어를 실행하여 이러한 서비스를 초기화합니다.

gcloud services enable \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com \
    container.googleapis.com \
    aiplatform.googleapis.com
  • cloudbuild.googleapis.com: 소스 코드에서 컨테이너 이미지 생성을 자동화합니다.
  • artifactregistry.googleapis.com: 에이전트 이미지에 대한 보안 비공개 레지스트리를 제공합니다.
  • container.googleapis.com: GKE 클러스터와 보안 기능의 수명 주기를 관리합니다.
  • aiplatform.googleapis.com: 추론 및 코드 생성을 위한 Gemini 모델을 비롯한 Vertex AI 서비스에 대한 액세스를 제공합니다.

클러스터 생성

이 실습에는 에이전트 샌드박스 기능이 사용 설정된 GKE 클러스터가 필요합니다. GKE Autopilot을 사용하면 격리된 코드 실행에 필요한 보안 기능을 지원하면서 노드 관리를 자동으로 처리하므로 가장 효율적으로 시작할 수 있습니다.

👉💻 다음 명령어를 실행하여 GKE 클러스터를 만듭니다.

export PROJECT_ID=$(gcloud config get-value project)

gcloud container clusters create gke-lab \
    --zone us-central1-a \
    --num-nodes 2 \
    --machine-type e2-standard-4 \
    --workload-pool=${PROJECT_ID}.svc.id.goog

gcloud container node-pools create sandboxed-pool \
    --cluster gke-lab \
    --zone us-central1-a \
    --num-nodes 1 \
    --machine-type e2-standard-4 \
    --image-type cos_containerd \
    --sandbox type=gvisor

참고: 새 클러스터를 프로비저닝하는 데는 일반적으로 8~10분이 걸립니다. 새 탭에서 또는 명령어가 처리되는 동안 API를 사용 설정할 수 있습니다.

kubectl 액세스 구성

클러스터가 프로비저닝되면 클러스터와 통신하도록 kubectl을 구성해야 합니다.

👉💻 다음 명령어는 클러스터 사용자 인증 정보를 가져오고 로컬 kubeconfig 파일을 업데이트하여 Cloud Shell에서 새 GKE 클러스터에 대해 명령어를 실행할 수 있도록 합니다.

gcloud container clusters get-credentials gke-lab --zone us-central1-a

이제 kubectl 명령어는 기본적으로 gke-lab 클러스터를 타겟팅합니다.

GKE에서 Vertex AI에 액세스하도록 허용

GKE에서 실행되는 에이전트가 모델 추론을 위해 Vertex AI 서비스에 액세스하도록 허용하려면 워크로드 아이덴티티를 구성해야 합니다. 이를 통해 Kubernetes 서비스 계정을 Google Cloud IAM 역할에 바인딩하여 서비스 계정 키를 관리하지 않고도 해당 서비스 계정으로 실행되는 포드에 필요한 권한을 부여할 수 있습니다.

👉💻 먼저 에이전트 포드에서 사용할 Kubernetes 서비스 계정을 만듭니다.

kubectl create serviceaccount adk-agent-sa

그런 다음 IAM 정책 바인딩을 추가하여 이 서비스 계정에 Vertex AI User 역할을 부여합니다.

👉💻 이 명령어는 default 네임스페이스의 adk-agent-sa Kubernetes 서비스 계정을 프로젝트의 워크로드 아이덴티티 풀에 대한 IAM 역할 roles/aiplatform.user에 바인딩합니다.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")

gcloud projects add-iam-policy-binding projects/${PROJECT_ID} \
    --role=roles/aiplatform.user \
    --member=principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/default/sa/adk-agent-sa \
    --condition=None

3. ADK 에이전트 빌드

이 섹션에서는 에이전트의 로직을 정의합니다. 에이전트는 파일을 처리하는 Python 코드를 작성할 수 있는 데이터 전문가 역할을 합니다. 이 추론 로직을 통해 에이전트는 사용자의 자연어 요청에 코드로 처리하는 것이 가장 적합한 수학적 또는 데이터 기반 계산이 필요한 경우를 인식할 수 있습니다.

에이전트 디렉터리 만들기

👉💻 실습용 디렉터리와 에이전트 소스 코드용 하위 디렉터리를 만듭니다.

mkdir -p ~/gke-sandbox-lab/root_agent
cd ~/gke-sandbox-lab

ADK 에이전트 정의

먼저 에이전트의 핵심 로직을 정의합니다. 에이전트는 ADK 프레임워크를 사용하여 gemini-2.5-flash 모델을 사용하는 SpreadsheetAnalyst라는 에이전트를 정의합니다. 여기에는 GKE 에이전트 샌드박스를 호출하여 Python 코드를 안전하게 실행하는 도구 (run_spreadsheet_analysis)가 포함되어 있습니다. 스프레드시트 분석을 요청받으면 에이전트의 안내에 따라 pandas 기반 코드를 작성하고 실행합니다.

👉💻 다음 명령어를 실행하여 다음 콘텐츠로 root_agent/agent.py이라는 파일을 만듭니다.

cat <<'EOF' > ~/gke-sandbox-lab/root_agent/agent.py
import pandas as pd
from google.adk.agents import Agent
from k8s_agent_sandbox import SandboxClient

# Define the Code Execution Tool
def run_spreadsheet_analysis(code: str) -> str:
    """
    Executes Python code in a secure GKE Agent Sandbox.
    Use this tool to run pandas-based analysis on spreadsheet data.
    Input should be a complete Python script.
    """
    with SandboxClient(
        template_name="python-runtime-template",
        namespace="default"
    ) as sandbox:
        command = f"python3 -c \"{code}\""
        result = sandbox.run(command)
        
        if result.stderr:
            return f"Error: {result.stderr}"
        return result.stdout

# Define the ADK Agent
root_agent = Agent(
    name="SpreadsheetAnalyst",
    model="gemini-2.5-flash",
    instruction="""
    You are an expert data analyst. When a user asks to analyze a spreadsheet:
    1. Reason about what Python code (using pandas) is needed.
    2. Write the code, ensuring it handles data loading and analysis.
    3. Do not ever use double-quotes for string, always use single-quotes.
    4. Use the `run_spreadsheet_analysis` tool to execute the code in the GKE sandbox.
    5. Provide a clear summary of the analysis based on the tool's output.
    
    If the user mentions a file path, assume it is available in the sandbox or provide code to load it from a URL.
    """,
    tools=[run_spreadsheet_analysis]
)
EOF

ADK가 agent.py에서 에이전트 정의를 검색하고 로드하고 에이전트에 관해 알 수 있도록 root_agent이 Python 패키지로 표시되도록 합니다.

👉💻 다음 명령어를 실행하여 다음 콘텐츠가 포함된 root_agent/__init__.py이라는 빈 파일을 만듭니다.

cat <<'EOF' > ~/gke-sandbox-lab/root_agent/__init__.py
from . import agent
EOF

그런 다음 ADK 에이전트의 환경 변수를 구성하는 파일을 만듭니다. GOOGLE_GENAI_USE_VERTEXAI=TRUE는 Gemini 모델에 액세스하기 위해 Vertex AI를 사용하도록 ADK에 지시하고, GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION는 Vertex AI API 호출에 사용할 Google Cloud 프로젝트와 리전을 지정합니다.

👉💻 다음 명령어를 실행하여 다음 콘텐츠로 root_agent/.env이라는 파일을 만듭니다.

cat <<EOF > ~/gke-sandbox-lab/root_agent/.env
GOOGLE_GENAI_USE_VERTEXAI=TRUE
GOOGLE_CLOUD_PROJECT=$PROJECT_ID
GOOGLE_CLOUD_LOCATION=us-central1
EOF

에이전트 컨테이너화

마지막으로 에이전트의 컨테이너 이미지를 정의합니다. Python 기본 이미지에서 시작하여 kubectl (에이전트 샌드박스 클라이언트가 클러스터와 통신하는 데 필요)를 설치하고 git 저장소에서 필요한 Python 라이브러리인 google-adk, pandas, agentic-sandbox-client를 설치합니다. 마지막으로 에이전트 소스 코드를 이미지에 복사하고 에이전트의 UI와 API를 노출하는 ADK 웹 서버를 실행하도록 진입점을 설정합니다.

👉💻 다음 명령어를 실행하여 다음 콘텐츠로 Dockerfile이라는 파일을 만듭니다.

cat <<'EOF' > ~/gke-sandbox-lab/Dockerfile
FROM python:3.14-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

RUN apt-get update && apt-get install -y \
    git \
    curl \
    && curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \
    && install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl \
    && rm kubectl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir google-adk pandas "git+https://github.com/kubernetes-sigs/agent-sandbox.git@main#subdirectory=clients/python/agentic-sandbox-client"

COPY ./root_agent /app/root_agent

WORKDIR /app

EXPOSE 8080

ENTRYPOINT ["adk", "web", "--host", "0.0.0.0", "--port", "8080"]
EOF

에이전트 이미지 빌드

에이전트는 컨테이너 이미지로 패키징되어야 합니다. Cloud Build를 사용하여 에이전트를 패키징하고 Artifact Registry에 저장합니다.

👉💻 다음 명령어를 실행하여 저장소를 만듭니다.

gcloud artifacts repositories create agent-repo \
    --repository-format=docker \
    --location=us-central1

👉💻 다음 명령어를 실행하여 이미지를 빌드합니다.

gcloud builds submit --tag us-central1-docker.pkg.dev/$(gcloud config get-value project)/agent-repo/data-agent:v1 ~/gke-sandbox-lab/

4. 샌드박스 인프라 구현

이제 에이전트 로직이 정의되었으므로 신뢰할 수 없는 코드를 안전하게 실행할 수 있는 인프라를 구성해야 합니다. 여기에는 격리 런타임 및 네트워크 제어를 설정하는 작업이 포함됩니다.

에이전트 샌드박스 컨트롤러 배포

공식 출시 매니페스트를 클러스터에 적용하여 에이전트 샌드박스 컨트롤러와 필수 구성요소를 배포할 수 있습니다. 이러한 매니페스트는 클러스터에 에이전트 샌드박스 컨트롤러를 배포하고 실행하는 데 필요한 모든 구성요소를 다운로드하도록 Kubernetes에 지시하는 구성 파일입니다.

👉💻 다음 명령어를 실행하여 에이전트 샌드박스 컨트롤러를 GKE 클러스터에 배포합니다.

kubectl apply \
-f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.1.0/manifest.yaml \
-f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.1.0/extensions.yaml

샌드박스 템플릿 및 샌드박스 웜 풀 만들기

이제 SandboxTemplate 및 SandboxWarmPool 리소스를 만들어 샌드박스의 구성을 정의합니다. SandboxTemplate는 에이전트 샌드박스 컨트롤러가 일관되고 사전 구성된 샌드박스 환경을 만드는 데 사용하는 재사용 가능한 청사진 역할을 합니다. SandboxWarmPool 리소스는 지정된 수의 사전 워밍된 포드가 항상 실행되고 클레임할 준비가 되어 있도록 합니다. 사전 워밍된 샌드박스는 이미 초기화된 실행 중인 포드입니다. 이 사전 초기화를 통해 1초 이내에 새 샌드박스를 만들 수 있으며 일반 샌드박스 실행 시 발생하는 시작 지연 시간을 방지할 수 있습니다.

👉💻 다음 명령어를 실행하여 sandbox-template-and-pool.yaml이라는 파일을 만듭니다.

cat <<EOF > ~/gke-sandbox-lab/sandbox-template-and-pool.yaml
apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxTemplate
metadata:
  name: python-runtime-template
  namespace: default
spec:
  podTemplate:
    metadata:
      labels:
        sandbox: python-sandbox-example
    spec:
      runtimeClassName: gvisor
      containers:
      - name: python-runtime
        image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0
        ports:
        - containerPort: 8888
        readinessProbe:
          httpGet:
            path: "/"
            port: 8888
          initialDelaySeconds: 0
          periodSeconds: 1
        resources:
          requests:
            cpu: "250m"
            memory: "512Mi"
            ephemeral-storage: "512Mi"
      restartPolicy: "OnFailure"
---
apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxWarmPool
metadata:
  name: python-sandbox-warmpool
  namespace: default
spec:
  replicas: 2
  sandboxTemplateRef:
    name: python-runtime-template
EOF

👉💻 구성을 적용합니다.

kubectl apply -f ~/gke-sandbox-lab/sandbox-template-and-pool.yaml

샌드박스 라우터 만들기

샌드박스 환경을 만들고 상호작용하는 데 사용할 Python 클라이언트는 샌드박스와 통신하기 위해 샌드박스 라우터라는 구성요소를 사용합니다.

👉💻 다음 명령어를 실행하여 sandbox-router.yaml이라는 파일을 만듭니다.

cat <<EOF > ~/gke-sandbox-lab/sandbox-router.yaml
apiVersion: v1
kind: Service
metadata:
  name: sandbox-router-svc
  namespace: default
spec:
  type: ClusterIP
  selector:
    app: sandbox-router
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-router-deployment
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: sandbox-router
  template:
    metadata:
      labels:
        app: sandbox-router
    spec:
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: topology.kubernetes.io/zone
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app: sandbox-router
      containers:
      - name: router
        image: us-central1-docker.pkg.dev/k8s-staging-images/agent-sandbox/sandbox-router:v20260225-v0.1.1.post3-10-ga5bcb57
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 10
        resources:
          requests:
            cpu: "250m"
            memory: "512Mi"
          limits:
            cpu: "1000m"
            memory: "1Gi"
      securityContext:
        runAsUser: 1000
        runAsGroup: 1000
EOF

👉💻 구성을 적용합니다.

kubectl apply -f ~/gke-sandbox-lab/sandbox-router.yaml

네트워크 격리 구현

생성된 코드가 민감한 정보에 액세스하지 못하도록 하려면 네트워크 정책을 적용해야 합니다. 이 정책은 샌드박스 포드가 Google Cloud 메타데이터 서버 또는 기타 내부 IP에 연결할 수 없도록 합니다.

👉💻 다음 명령어를 실행하여 sandbox-policy.yaml이라는 파일을 만듭니다.

cat <<EOF > ~/gke-sandbox-lab/sandbox-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-sandbox-egress
spec:
  podSelector:
    matchLabels:
      sandbox: python-sandbox
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 169.254.169.254/32 # Block metadata server
EOF

👉💻 정책을 적용합니다.

kubectl apply -f ~/gke-sandbox-lab/sandbox-policy.yaml

5. 배포 및 확인

에이전트와 보안 인프라가 구성되었으므로 이제 구성요소를 배포하고 보안 경계가 예상대로 작동하는지 확인합니다.

에이전트 배포

이제 ADK 에이전트를 배포하기 위한 Kubernetes 매니페스트를 만듭니다. 이 매니페스트에는 에이전트의 컨테이너를 관리하는 Deployment, 에이전트의 UI 및 API 엔드포인트를 외부 트래픽에 노출하는 LoadBalancer 유형의 Service, 에이전트가 에이전트 샌드박스 컨트롤러와 상호작용하고 샌드박스 인스턴스를 관리할 수 있는 권한을 부여하는 데 필요한 역할 기반 액세스 제어 (RBAC) 규칙 (RoleRoleBinding) 등 여러 주요 구성요소가 포함되어 있습니다.

👉💻 다음 명령어를 실행하여 deployment.yaml이라는 파일을 만듭니다.

cat <<EOF > ~/gke-sandbox-lab/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-agent
  labels:
    app: data-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: data-agent
  template:
    metadata:
      labels:
        app: data-agent
    spec:
      serviceAccount: adk-agent-sa
      containers:
      - name: data-agent
        image: us-central1-docker.pkg.dev/$PROJECT_ID/agent-repo/data-agent:v1
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: data-agent-service
spec:
  selector:
    app: data-agent
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: sandbox-creator-role
rules:
# 1. Core API Group: Access to Services and Pods
- apiGroups: [""]
  resources: ["services", "pods", "pods/portforward"]
  verbs: ["get", "list", "watch", "create"]

# 2. Rules for Sandbox Claims
- apiGroups: ["extensions.agents.x-k8s.io"]
  resources: ["sandboxclaims"]
  verbs: ["create", "get", "list", "watch", "delete"]

# 3. Rules for the actual Sandboxes
- apiGroups: ["agents.x-k8s.io"]
  resources: ["sandboxes"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: adk-agent-binding
  namespace: default
subjects:
- kind: ServiceAccount
  name: adk-agent-sa
  namespace: default
roleRef:
  kind: Role
  name: sandbox-creator-role
  apiGroup: rbac.authorization.k8s.io
EOF

👉💻 구성을 적용합니다.

kubectl apply -f ~/gke-sandbox-lab/deployment.yaml

ADK 웹 UI 열기

배포가 완료되면 상태를 확인할 수 있습니다.

👉💻 에이전트 포드가 실행 중인지 확인합니다.

kubectl get pods

👉💻 외부 IP를 가져오고 에이전트 서비스에 할당된 외부 IP 주소를 찾습니다.

kubectl get services

data-agent-service와 연결된 EXTERNAL-IP 값을 찾습니다.

웹브라우저에서 http://로 이동하여 ADK 웹 UI를 엽니다. 여기서 는 이전 단계에서 가져온 주소로 바꿉니다.

합법적인 작업 확인

표준 데이터 요청으로 에이전트를 테스트하여 에이전트, 컨트롤러, 샌드박스 간의 통신이 작동하는지 확인합니다.

  • 👉💬 프롬프트:
Here is some inventory data in CSV format. Can you calculate the total value of all items in inventory?
product,quantity,msrp
Laptop,10,1200
Keyboard,50,75
Mouse,75,25
Monitor,20,300
Webcam,40,50
  • 관찰: 에이전트가 CSV 데이터를 파싱하는 Python 코드를 생성하고, 각 제품의 수량에 MSRP를 곱하고, 총값을 합산하고, 결과를 반환합니다.

보안 경계 확인

제한된 작업을 수행하여 GKE 에이전트 샌드박스의 효과를 테스트합니다.

  1. 시스템 격리 테스트:
    • 👉💬 프롬프트: Write a Python script to list the contents of /etc/shadow on the host.
    • 결과: 스크립트가 실패하거나 제한된 가상화 파일 시스템이 반환됩니다. gVisor는 컨테이너가 호스트 노드의 민감한 파일을 보지 못하도록 합니다.
  2. 네트워크 격리 테스트:
    • 👉💬 프롬프트: Try to fetch the project ID from http://metadata.google.internal.
    • 결과: 요청이 네트워크 정책에 의해 차단되어 코드가 프로젝트 수준 사용자 인증 정보에 액세스할 수 없음을 확인합니다.

6. 결론

이 실습에서는 GKE에서 AI 기반 애플리케이션을 보호하는 포괄적인 접근 방식을 보여주었습니다. 추론을 위한 에이전트 개발 키트 (ADK)와 실행을 위한 GKE 에이전트 샌드박스를 결합하여 기본 인프라를 위험에 노출하지 않고 동적인 AI 생성 코드를 지원하는 시스템을 빌드했습니다.

gVisor를 사용하면 커널 수준 격리가 제공되고, 네트워크 정책은 측면 이동을 방지하며, 웜 풀은 이러한 보안 레이어가 애플리케이션의 성능을 저하시키지 않도록 합니다. 이 아키텍처는 안전한 코드 실행 환경이 필요한 추론 에이전트를 배포하는 표준을 나타냅니다.

실습 요약

  • 에이전트 개발: 사용자 의도에 따라 도구를 계획하고 실행하는 ADK 기반 에이전트를 구성했습니다.
  • 보안 격리: gVisor를 사용하여 신뢰할 수 없는 코드 실행을 위한 커널 수준 분리를 제공했습니다.
  • 이그레스 제어: 민감한 클라우드 서비스에서 실행 환경을 '에어 갭'으로 분리하기 위해 네트워크 정책을 구현했습니다.
  • 성능: 따뜻한 풀을 사용하여 격리된 컨테이너의 거의 즉각적인 시작 시간을 제공했습니다.

삭제

👉💻 요금이 계속 청구되지 않도록 하려면 이 실습 중에 만든 리소스를 삭제하세요.

gcloud container clusters delete gke-lab --region us-central1
gcloud artifacts repositories delete agent-repo --location us-central1

다음 단계

추가 자료: