部署到 Google Kubernetes Engine (GKE)¶
GKE 是 Google Cloud 托管的 Kubernetes 服务。它允许你使用 Kubernetes 部署和管理容器化应用程序。
要部署你的智能体,你需要一个运行在 GKE 上的 Kubernetes 集群。你可以使用 Google Cloud Console 或 gcloud 命令行工具创建集群。
在此示例中,我们将一个简单的智能体部署到 GKE。Python 智能体是一个使用 Gemini Flash 作为 LLM 的 FastAPI 应用程序。Go 智能体使用 ADK 启动器和一个极简容器中的静态链接二进制文件。你可以使用 Vertex AI 或 AI Studio 作为 LLM 提供商。使用环境变量 GOOGLE_GENAI_USE_ENTERPRISE 可以选择 Agent Platform 或 AI Studio 作为 LLM 提供商。
环境变量¶
按照设置与安装指南设置你的环境变量。你还需要安装 kubectl 命令行工具。安装说明请参阅 Google Kubernetes Engine 文档。
export GOOGLE_CLOUD_PROJECT=your-project-id # 你的 GCP 项目 ID
export GOOGLE_CLOUD_LOCATION=us-central1 # 或你偏好的区域
export GOOGLE_GENAI_USE_ENTERPRISE=true # 如果使用 Agent Platform 则设置为 true
export GOOGLE_CLOUD_PROJECT_NUMBER=$(gcloud projects describe --format json $GOOGLE_CLOUD_PROJECT | jq -r ".projectNumber")
如果你没有安装 jq,可以使用以下命令获取项目编号:
然后从输出中复制项目编号。
启用 API 和权限¶
确保你已通过 Google Cloud 认证(gcloud auth login 和 gcloud config set project <your-project-id>)。
为你的项目启用必要的 API。你可以使用 gcloud 命令行工具来完成。
gcloud services enable \
container.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com
向默认的计算引擎服务账号授予 gcloud builds submit 命令所需的角色。
ROLES_TO_ASSIGN=(
"roles/artifactregistry.writer"
"roles/storage.objectViewer"
"roles/logging.viewer"
"roles/logging.logWriter"
)
for ROLE in "${ROLES_TO_ASSIGN[@]}"; do
gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \
--member="serviceAccount:${GOOGLE_CLOUD_PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="${ROLE}"
done
部署载荷¶
当你将 ADK 智能体工作流部署到 Google Cloud GKE 时,以下内容会上传到服务中:
- 你的 ADK 智能体代码
- 你的 ADK 智能体代码中声明的所有依赖项
- 你的智能体使用的 ADK API 服务器代码版本
默认部署不包含 ADK Web 用户界面库,除非你在部署设置中明确指定,例如 adk deploy gke 命令的 --with_ui 选项。
部署选项¶
你可以通过 手动使用 Kubernetes 清单 或 使用 adk deploy gke 命令自动部署 两种方式将智能体部署到 GKE。选择最适合你工作流程的方式。
选项 1:使用 gcloud 和 kubectl 手动部署¶
创建 GKE 集群¶
你可以使用 gcloud 命令行工具创建 GKE 集群。此示例在 us-central1 区域创建一个名为 adk-cluster 的 Autopilot 集群。
如果创建的是 GKE Standard 集群,请确保启用了 Workload Identity。AutoPilot 集群默认已启用 Workload Identity。
gcloud container clusters create-auto adk-cluster \
--location=$GOOGLE_CLOUD_LOCATION \
--project=$GOOGLE_CLOUD_PROJECT
创建集群后,你需要使用 kubectl 连接到它。此命令会配置 kubectl 以使用新集群的凭据。
gcloud container clusters get-credentials adk-cluster \
--location=$GOOGLE_CLOUD_LOCATION \
--project=$GOOGLE_CLOUD_PROJECT
创建你的智能体¶
我们将引用 LLM 智能体 页面上定义的 capital_agent 示例。
按如下方式组织你的项目文件:
代码文件¶
在 your-project-directory/ 根目录下创建以下文件(main.py、requirements.txt、Dockerfile、capital_agent/agent.py、capital_agent/__init__.py)。
-
这是
capital_agent目录中的 Capital Agent 示例capital_agent/agent.pyfrom google.adk.agents import LlmAgent # 定义工具函数 def get_capital_city(country: str) -> str: """检索给定国家的首都。""" # 替换为实际逻辑(例如 API 调用、数据库查询) capitals = {"france": "Paris", "japan": "Tokyo", "canada": "Ottawa"} return capitals.get(country.lower(), f"抱歉,我不知道 {country} 的首都。") # 将工具添加到智能体 capital_agent = LlmAgent( model="gemini-flash-latest", name="capital_agent", # 你的智能体名称 description="回答用户关于给定国家首都的问题。", instruction="""你是一个提供国家首都的智能体……(之前的指令文本)""", tools=[get_capital_city] # 直接提供函数 ) # ADK 将发现 root_agent 实例 root_agent = capital_agent将你的目录标记为 Python 包
-
此文件使用 ADK 的
get_fast_api_app()来设置 FastAPI 应用程序:main.pyimport os import uvicorn from fastapi import FastAPI from google.adk.cli.fast_api import get_fast_api_app # 获取 main.py 所在的目录 AGENT_DIR = os.path.dirname(os.path.abspath(__file__)) # 示例会话服务 URI(例如 SQLite) # 注意:使用 'sqlite+aiosqlite' 而不是 'sqlite',因为 DatabaseSessionService 需要异步驱动 SESSION_SERVICE_URI = "sqlite+aiosqlite:///./sessions.db" # 示例 CORS 允许的来源 ALLOWED_ORIGINS = ["http://localhost", "http://localhost:8080", "*"] # 如果你打算提供 Web 界面则设置为 True,否则设置为 False SERVE_WEB_INTERFACE = True # 调用函数获取 FastAPI 应用实例 # 确保 agent 目录名称('capital_agent')与你的智能体文件夹匹配 app: FastAPI = get_fast_api_app( agents_dir=AGENT_DIR, session_service_uri=SESSION_SERVICE_URI, allow_origins=ALLOWED_ORIGINS, web=SERVE_WEB_INTERFACE, ) if __name__ == "__main__": # 使用 Cloud Run 提供的 PORT 环境变量,默认为 8080 uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))注意:我们将
agent_dir指定为main.py所在的目录,并使用os.environ.get("PORT", 8080)以兼容 Cloud Run。 -
列出必要的 Python 包:
-
定义容器镜像:
DockerfileFROM python:3.13-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt RUN adduser --disabled-password --gecos "" myuser && \ chown -R myuser:myuser /app COPY . . USER myuser ENV PATH="/home/myuser/.local/bin:$PATH" CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port $PORT"]
在 your-project-directory/ 根目录下创建以下文件。
-
定义智能体并嵌入 ADK 启动器。启动器处理
web、api和webui子命令,用于启动 REST API 服务器和 Web 界面:main.gopackage main import ( "context" "fmt" "log" "os" "strings" "google.golang.org/adk/v2/agent" "google.golang.org/adk/v2/agent/llmagent" "google.golang.org/adk/v2/cmd/launcher" "google.golang.org/adk/v2/cmd/launcher/full" "google.golang.org/adk/v2/model/gemini" "google.golang.org/adk/v2/tool" "google.golang.org/adk/v2/tool/functiontool" "google.golang.org/genai" ) type getCapitalCityArgs struct { Country string `json:"country" jsonschema:"The country to look up."` } func getCapitalCity(_ tool.Context, args getCapitalCityArgs) (string, error) { capitals := map[string]string{ "france": "Paris", "japan": "Tokyo", "canada": "Ottawa", } capital, ok := capitals[strings.ToLower(args.Country)] if !ok { return "", fmt.Errorf("capital not found for %s", args.Country) } return capital, nil } func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-flash-latest", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } capitalTool, err := functiontool.New( functiontool.Config{ Name: "get_capital_city", Description: "Retrieves the capital city for a given country.", }, getCapitalCity, ) if err != nil { log.Fatalf("Failed to create tool: %v", err) } capitalAgent, err := llmagent.New(llmagent.Config{ Name: "capital_agent", Model: model, Description: "Answers questions about capital cities.", Instruction: "You are an agent that provides the capital city of a country.", Tools: []tool.Tool{capitalTool}, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(capitalAgent), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } }要使用 Vertex AI 而不是 AI Studio,请设置
genai.ClientConfig以使用 Vertex AI 后端: -
定义容器镜像。Go 编译为自包含的静态二进制文件,因此容器使用极简的 distroless 基础镜像——无需运行时依赖或包管理器:
Dockerfile# 阶段 1:构建 Go 二进制文件 FROM golang:1.25 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # 编译静态链接的 Linux/amd64 二进制文件 RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -ldflags="-s -w" -o capital_agent . # 阶段 2:将二进制文件复制到极简运行时镜像中 FROM gcr.io/distroless/static-debian12 COPY --from=builder /app/capital_agent /app/capital_agent EXPOSE 8080 # 启动 API 服务器和 Web UI CMD ["/app/capital_agent", "web", "-port", "8080", "api", "webui"]
构建容器镜像¶
你需要创建一个 Google Artifact Registry 仓库来存储你的容器镜像。你可以使用 gcloud 命令行工具来完成。
gcloud artifacts repositories create adk-repo \
--repository-format=docker \
--location=$GOOGLE_CLOUD_LOCATION \
--description="ADK repository"
构建容器镜像并将其推送到 Artifact Registry:
使用 Cloud Build 从你的源目录直接构建并推送镜像:
多阶段 Dockerfile 在构建器阶段内处理编译,因此你可以 使用 Cloud Build 而无需本地 Go 工具链:
gcloud builds submit \
--tag $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo/adk-agent:latest \
--project=$GOOGLE_CLOUD_PROJECT \
.
或者,你可以在本地编译二进制文件并构建一个不使用多阶段 Dockerfile 的更小镜像——如果你已经安装了 Go,这很有用:
# 交叉编译 linux/amd64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o capital_agent .
# 构建并推送镜像
docker build -t $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo/adk-agent:latest .
docker push $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo/adk-agent:latest
验证镜像是否已构建并推送到 Artifact Registry:
gcloud artifacts docker images list \
$GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo \
--project=$GOOGLE_CLOUD_PROJECT
为 Agent Platform 配置 Kubernetes 服务账号¶
如果你的智能体使用 Agent Platform,你需要创建一个具有必要权限的 Kubernetes 服务账号。此示例创建一个名为 adk-agent-sa 的服务账号,并将其绑定到 Agent Platform User 角色。
如果你使用的是 AI Studio 并通过 API 密钥访问模型,可以跳过此步骤。
gcloud projects add-iam-policy-binding projects/${GOOGLE_CLOUD_PROJECT} \
--role=roles/aiplatform.user \
--member=principal://iam.googleapis.com/projects/${GOOGLE_CLOUD_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GOOGLE_CLOUD_PROJECT}.svc.id.goog/subject/ns/default/sa/adk-agent-sa \
--condition=None
创建 Kubernetes 清单文件¶
在你的项目目录中创建一个名为 deployment.yaml 的 Kubernetes 部署清单文件。此文件定义了如何在 GKE 上部署你的应用程序。
cat << EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: adk-agent
spec:
replicas: 1
selector:
matchLabels:
app: adk-agent
template:
metadata:
labels:
app: adk-agent
spec:
serviceAccount: adk-agent-sa
containers:
- name: adk-agent
imagePullPolicy: Always
image: $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo/adk-agent:latest
resources:
limits:
memory: "128Mi"
cpu: "500m"
ephemeral-storage: "128Mi"
requests:
memory: "128Mi"
cpu: "500m"
ephemeral-storage: "128Mi"
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
- name: GOOGLE_CLOUD_PROJECT
value: $GOOGLE_CLOUD_PROJECT
- name: GOOGLE_CLOUD_LOCATION
value: $GOOGLE_CLOUD_LOCATION
- name: GOOGLE_GENAI_USE_ENTERPRISE
value: "$GOOGLE_GENAI_USE_ENTERPRISE"
# 如果使用 AI Studio,将 GOOGLE_GENAI_USE_ENTERPRISE 设置为 false 并设置以下内容:
# - name: GOOGLE_API_KEY
# value: $GOOGLE_API_KEY
# 添加你的智能体可能需要的其他环境变量
---
apiVersion: v1
kind: Service
metadata:
name: adk-agent
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: adk-agent
EOF
部署应用程序¶
使用 kubectl 命令行工具部署应用程序。此命令将部署和服务清单文件应用到你的 GKE 集群。
稍等片刻后,你可以使用以下命令检查部署状态:
此命令列出了与你的部署关联的 Pod。你应该会看到一个状态为 Running 的 Pod。
Pod 运行后,你可以使用以下命令检查服务状态:
如果输出显示了 External IP,则表示你的服务可以从互联网访问。外部 IP 可能需要几分钟才能分配完成。
你可以使用以下命令获取服务的外部 IP 地址:
选项 2:使用 adk deploy gke 自动部署¶
仅限 Python
adk deploy gke 命令仅适用于 Python。Go 没有等效的 CLI 命令。Go 智能体必须使用选项 1 中描述的手动方式部署。
ADK 提供了一个 CLI 命令来简化 GKE 部署。这避免了手动构建镜像、编写 Kubernetes 清单或推送到 Artifact Registry 的需要。
前提条件¶
在开始之前,请确保你已完成以下设置:
-
一个正在运行的 GKE 集群: 你需要一个在 Google Cloud 上运行的 Kubernetes 集群。
-
所需的 CLI:
gcloudCLI: Google Cloud CLI 必须已安装、已认证并配置为使用你的目标项目。运行gcloud auth login和gcloud config set project [YOUR_PROJECT_ID]。- kubectl: Kubernetes CLI 必须已安装,以便将应用程序部署到你的集群。
-
已启用的 Google Cloud API: 确保你的 Google Cloud 项目中已启用以下 API:
- Kubernetes Engine API (
container.googleapis.com) - Cloud Build API (
cloudbuild.googleapis.com) - Container Registry API (
containerregistry.googleapis.com)
- Kubernetes Engine API (
-
所需的 IAM 权限: 运行命令的用户或计算引擎默认服务账号至少需要以下角色:
-
Kubernetes Engine Developer (
roles/container.developer):用于与 GKE 集群交互。 -
Storage Object Viewer (
roles/storage.objectViewer):允许 Cloud Build 从 gcloud builds submit 上传源代码的 Cloud Storage 存储桶下载源代码。 -
Artifact Registry Create on Push Writer (
roles/artifactregistry.createOnPushWriter):允许 Cloud Build 将构建好的容器镜像推送到 Artifact Registry。此角色还允许在首次推送时按需在 Artifact Registry 中创建特殊的 gcr.io 仓库。 -
Logs Writer (
roles/logging.logWriter):允许 Cloud Build 将构建日志写入 Cloud Logging。
为 Agent Platform 配置 Workload Identity¶
如果你的智能体使用 Agent Platform,集群中运行的工作负载需要调用 Agent Platform API 的权限。与手动方式不同,adk deploy gke 生成的清单使用 default 命名空间中的 default Kubernetes 服务账号。通过 Workload Identity 将 Agent Platform User 角色授予该服务账号,以便智能体可以访问 Gemini 等模型。
使用 AI Studio 时可跳过
如果你使用的是 AI Studio 并通过 API 密钥访问模型,可以跳过此步骤。
gcloud projects add-iam-policy-binding projects/${GOOGLE_CLOUD_PROJECT} \
--role=roles/aiplatform.user \
--member=principal://iam.googleapis.com/projects/${GOOGLE_CLOUD_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GOOGLE_CLOUD_PROJECT}.svc.id.goog/subject/ns/default/sa/default \
--condition=None
如果你使用的是 Google Cloud 项目但跳过了此步骤,智能体的 Pod 会成功启动,但在验证部署时向模型发送的请求会因 403 PERMISSION_DENIED 错误而失败。
deploy gke 命令¶
该命令接受智能体的路径和指定目标 GKE 集群的参数。
语法¶
参数与选项¶
| 参数 | 描述 | 必需 |
|---|---|---|
| AGENT_PATH | 你的智能体根目录的本地文件路径。 | 是 |
| --project | 你的 GKE 集群所在的 Google Cloud 项目 ID。 | 是 |
| --cluster_name | 你的 GKE 集群名称。 | 是 |
| --region | 你的集群所在的 Google Cloud 区域(例如 us-central1)。 | 是 |
| --with_ui | 同时部署智能体的后端 API 和配套的前端用户界面。 | 否 |
| --log_level | 设置部署过程的日志级别。选项:debug、info、warning、error。 | 否 |
工作原理¶
当你运行 adk deploy gke 命令时,ADK 会自动执行以下步骤:
-
容器化:从你的智能体源代码构建 Docker 容器镜像。
-
镜像推送:为容器镜像打标签并将其推送到你项目的 Artifact Registry。
-
清单生成:动态生成必要的 Kubernetes 清单文件(一个
Deployment和一个Service)。 -
集群部署:将这些清单应用到你指定的 GKE 集群,这将触发以下操作:
Deployment 指示 GKE 从 Artifact Registry 拉取容器镜像并在一个或多个 Pod 中运行。
Service 为你的智能体创建一个稳定的网络端点。默认情况下,这是一个 LoadBalancer 服务,它会分配一个公共 IP 地址将你的智能体暴露到互联网。
使用示例¶
以下是将位于 ~/agents/multi_tool_agent/ 的智能体部署到名为 test 的 GKE 集群的实际示例。
adk deploy gke \
--project myproject \
--cluster_name test \
--region us-central1 \
--with_ui \
--log_level info \
~/agents/multi_tool_agent/
验证部署¶
如果你使用了 adk deploy gke,请使用 kubectl 验证部署:
- 检查 Pod:确保你的智能体 Pod 处于 Running 状态。
adk-default-service-name-xxxx-xxxx ... 1/1 Running 的输出。
- 查找外部 IP:获取你的智能体服务的公共 IP 地址。
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
adk-default-service-name LoadBalancer 34.118.228.70 34.63.153.253 80:32581/TCP 5d20h
我们可以导航到外部 IP 并通过 UI 与智能体交互

测试你的智能体¶
将智能体部署到 GKE 后,你可以通过部署的 UI(如果已启用)或使用 curl 等工具直接调用其 API 端点与之交互。你需要使用部署后提供的服务 URL。
UI 测试¶
如果你在部署智能体时启用了 UI:
你只需在 Web 浏览器中导航到 Kubernetes 服务 URL 即可测试你的智能体。
ADK 开发 UI 允许你直接在浏览器中与智能体交互、管理会话和查看执行详情。
要验证你的智能体是否按预期工作,你可以:
- 从下拉菜单中选择你的智能体。
- 输入消息并验证你是否收到了智能体的预期响应。
如果你遇到任何异常行为,请使用以下命令检查智能体的 Pod 日志:
API 测试(curl)¶
你可以使用 curl 等工具与智能体的 API 端点交互。这对于程序化交互或未启用 UI 的部署场景非常有用。
设置应用程序 URL¶
Go:API 路径前缀
Go ADK 服务器默认在 /api 路径前缀下提供所有 REST 端点。
在测试 Go 部署时,请在以下示例中的每个路径前加上 /api。例如:
| Python | Go |
|---|---|
$APP_URL/list-apps |
$APP_URL/api/list-apps |
$APP_URL/apps/… |
$APP_URL/api/apps/… |
$APP_URL/run_sse |
$APP_URL/api/run_sse |
该前缀可以在启动时通过 api 子命令的 -path_prefix 修改,
例如 CMD ["/app/capital_agent", "web", "-port", "8080", "api", "-path_prefix", ""]
会完全移除前缀。
列出可用应用¶
验证已部署的应用程序名称。
(如果需要,根据此输出调整以下命令中的 app_name。默认值通常是智能体目录名称,例如 capital_agent)。
创建或更新会话¶
初始化或更新特定用户和会话的状态。如果不同,请将 capital_agent 替换为你的实际应用名称。
curl -X POST \
$APP_URL/apps/capital_agent/users/user_123/sessions/session_abc \
-H "Content-Type: application/json" \
-d '{"preferred_language": "English", "visit_count": 5}'
运行智能体¶
向你的智能体发送提示。将 capital_agent 替换为你的应用名称,并根据需要调整用户/会话 ID 和提示内容。
Go:JSON 字段名使用驼峰命名
Python ADK REST API 在 JSON 请求体中使用 snake_case 字段名
(例如 app_name、user_id、new_message)。Go ADK REST API
使用 camelCase(例如 appName、userId、newMessage)。请使用
与你的部署语言对应的正确格式。
- 如果你想接收服务器发送事件(SSE),请设置
"streaming": true。 - 响应将包含智能体的执行事件,包括最终答案。
故障排查¶
以下是部署智能体到 GKE 时可能遇到的一些常见问题:
403 Permission Denied for Gemini 2.0 Flash¶
这通常意味着 Kubernetes 服务账号没有访问 Agent Platform API 的必要权限。请确保你已按照为 Agent Platform 配置 Kubernetes 服务账号一节中的说明创建了服务账号并将其绑定到 Agent Platform User 角色。如果你使用 adk deploy gke 部署,请按照为 Agent Platform 配置 Workload Identity一节中的说明改为绑定 default 服务账号。如果你使用的是 AI Studio,请确保已在部署清单中设置了 GOOGLE_API_KEY 环境变量且其有效。
404 或 Not Found 响应¶
这通常意味着你的请求中存在错误。请检查应用程序日志以诊断问题。
export POD_NAME=$(kubectl get pod -l app=adk-agent -o jsonpath='{.items[0].metadata.name}')
kubectl logs $POD_NAME
尝试写入只读数据库¶
仅限 Python
此错误适用于使用 SQLite 进行会话存储的 Python 部署。 Go 部署默认使用内存会话服务,不受此问题影响。
你可能会看到 UI 中没有创建会话 ID,且智能体不响应任何消息。这通常是由 SQLite 数据库为只读导致的。如果你在本地运行了智能体然后创建了容器镜像,SQLite 数据库会被复制到容器中,数据库在容器中就会变成只读的。
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) attempt to write a readonly database
[SQL: UPDATE app_states SET state=?, update_time=CURRENT_TIMESTAMP WHERE app_states.app_name = ?]
要修复此问题,你可以:
在构建容器镜像之前删除本地机器上的 SQLite 数据库文件。这会在容器启动时创建一个新的 SQLite 数据库。
或者(推荐),你可以在项目目录中添加 .dockerignore 文件以排除 SQLite 数据库被复制到容器镜像中。
重新构建容器镜像并再次部署应用程序。
流式传输日志权限不足 ERROR: (gcloud.builds.submit)¶
当你没有足够的权限来流式传输构建日志,或者你的 VPC-SC 安全策略限制了对默认日志存储桶的访问时,可能会出现此错误。
要检查构建进度,请按照错误消息中提供的链接操作或在 Google Cloud Console 中导航到 Cloud Build 页面。
你也可以使用构建容器镜像一节中的命令验证镜像是否已构建并推送到 Artifact Registry。
Gemini-2.0-Flash 不支持 Live API¶
当你使用 ADK 开发 UI 访问已部署的智能体时,基于文本的聊天可以正常工作,但语音功能(例如点击麦克风按钮)会失败。你可能会在 Pod 日志中看到 websockets.exceptions.ConnectionClosedError,表明你的模型"在 Live API 中不受支持"。
出现此错误是因为智能体配置的模型(例如示例中的 gemini-flash-latest)不支持 Gemini Live API。Live API 是实时双向音视频流传输所必需的。
清理¶
要删除 GKE 集群及所有关联资源,请运行:
gcloud container clusters delete adk-cluster \
--location=$GOOGLE_CLOUD_LOCATION \
--project=$GOOGLE_CLOUD_PROJECT
要删除 Artifact Registry 仓库,请运行:
gcloud artifacts repositories delete adk-repo \
--location=$GOOGLE_CLOUD_LOCATION \
--project=$GOOGLE_CLOUD_PROJECT
如果你不再需要该项目,也可以将其删除。这将删除与该项目关联的所有资源,包括 GKE 集群、Artifact Registry 仓库以及你创建的任何其他资源。