智能体强化学习(Agentic RL)和智能体评测需要为每个任务准备隔离的执行环境,并稳定采集执行结果与奖励。ACK Rollout Server 在 ACK 集群中按任务创建沙箱、执行 Agent、验证结果并返回奖励,无需自行维护沙箱调度与回收。
适用范围
已创建 Kubernetes 1.24 及以上版本的 ACK 集群。
已为集群配置
kubectl,并具有在目标命名空间中创建工作负载、Service、RBAC 和 PVC 的权限。集群有空闲的 CPU、内存和存储资源,用于运行 ACK Rollout Server 及其创建的沙箱 Pod。
安装 ACK Rollout Server
ACK Rollout Server 通过 Helm Chart 部署。推荐在控制台的应用目录中安装,页面提供参数提示,且镜像地址会自动适配集群地域;如果需要在流水线中自动化部署或在多个集群中批量部署,使用 Helm CLI。
通过应用目录安装
登录容器服务管理控制台,在左侧导航栏选择。
搜索并选择
ack-rollout-server,然后单击一键部署。在创建页面配置以下参数。
参数
示例值
说明
集群
当前 ACK 集群
ACK Rollout Server 所在集群。
命名空间
kube-rl建议使用独立命名空间。命名空间不存在时可在页面创建。
发布名称
ack-rollout-server本文后续命令均使用该名称。
Chart 版本
最新版本
建议选择应用目录提供的最新稳定版本。
单击确定,等待应用安装完成。
其余参数保持默认即可:应用目录会根据集群地域自动替换镜像地址中的地域占位符,默认的 single 部署模式在同一个 Pod 中运行 ACK Rollout Server 和 Redis,Viewer 不启用。
通过 Helm CLI 安装
以下命令使用 ACK 应用目录对应的 Helm 仓库。使用 Helm CLI 时镜像地址不会自动替换,需要通过 REGION_ID 指定集群地域。
helm repo add aliyun-incubator \
https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm repo update
export REGION_ID="<REGION_ID>"
helm upgrade --install ack-rollout-server \
aliyun-incubator/ack-rollout-server \
--namespace kube-rl \
--create-namespace \
--set global.imagePrefix=registry-${REGION_ID}.ack.aliyuncs.com \
--set redis.image.repository=registry-${REGION_ID}.ack.aliyuncs.com/acs/redis验证安装结果
查看工作负载和 Service:
kubectl -n kube-rl get pod,svc
kubectl -n kube-rl rollout status deployment/ack-rollout-server --timeout=5m默认配置下,ACK Rollout Server Pod 应处于 Running 状态,并显示 READY 2/2,对应 Server 容器和 Redis 容器。
ACK Rollout Server Service 默认为 ClusterIP 类型。将服务端口转发到本地:
kubectl -n kube-rl port-forward service/ack-rollout-server 8080:8080保持该命令运行,打开另一个终端并检查服务状态:
curl -s http://127.0.0.1:8080/health | python3 -m json.tool返回结果中的 status 为 ok,且 workers 中至少包含一个 Worker,表示服务已就绪。
快速开始:提交第一个 Rollout 任务
本节使用内置的 oracle Agent 执行参考解答,无需配置大模型服务。任务会在沙箱中创建一个文件,Verifier 检查文件内容并返回奖励。
创建任务目录
将 <TASK_IMAGE> 替换为集群节点可以拉取的 Linux 镜像地址,该镜像需包含 /bin/bash、cat 和 mkdir 命令。如果使用私有镜像,请先在安装参数中配置沙箱使用的镜像拉取凭证。
export TASK_IMAGE="<TASK_IMAGE>"
export TASK_NAME=quickstart-task
mkdir -p ${TASK_NAME}/{environment,solution,tests}
cat > ${TASK_NAME}/task.toml <<EOF
version = "1.0"
source = "ack-rollout-server-quickstart"
[metadata]
description = "Create a file with the expected content"
difficulty = "easy"
[environment]
docker_image = "${TASK_IMAGE}"
cpus = 1
memory_mb = 512
storage_mb = 2048
[agent]
timeout_sec = 120.0
[verifier]
timeout_sec = 60.0
EOF
cat > ${TASK_NAME}/instruction.md <<'EOF'
在 /tmp/greeting.txt 中写入以下内容:
Hello from ACK Rollout Server!
EOF
cat > ${TASK_NAME}/environment/Dockerfile <<'EOF'
FROM ubuntu:22.04
EOF
cat > ${TASK_NAME}/solution/solve.sh <<'EOF'
#!/bin/bash
set -euo pipefail
printf 'Hello from ACK Rollout Server!\n' > /tmp/greeting.txt
EOF
cat > ${TASK_NAME}/tests/test.sh <<'EOF'
#!/bin/bash
set -euo pipefail
mkdir -p /logs/verifier
if [ -f /tmp/greeting.txt ] && [ "$(cat /tmp/greeting.txt)" = "Hello from ACK Rollout Server!" ]; then
echo 1 > /logs/verifier/reward.txt
else
echo 0 > /logs/verifier/reward.txt
fi
EOF
chmod +x ${TASK_NAME}/solution/solve.sh ${TASK_NAME}/tests/test.sh任务目录结构如下:
quickstart-task/
├── task.toml
├── instruction.md
├── environment/
│ └── Dockerfile
├── solution/
│ └── solve.sh
└── tests/
└── test.sh其中:
task.toml定义任务镜像、资源和超时时间。instruction.md是提供给 Agent 的任务描述。solution/solve.sh是oracleAgent 使用的参考解答。tests/test.sh是 Verifier 执行的验证脚本,需将奖励写入/logs/verifier/reward.txt。已在
task.toml中指定docker_image,因此本示例不会构建environment/Dockerfile。
打包并提交任务
将任务目录打包为 tar.gz。归档文件中的顶层目录名必须与请求中的 task_path 一致。
tar -czf /tmp/${TASK_NAME}.tar.gz ${TASK_NAME}调用异步接口提交任务:
export SERVER=http://127.0.0.1:8080
curl -s -X POST ${SERVER}/api/v1/runs/async \
-F 'metadata={"job_id":"quickstart","task_id":"quickstart-task","task_path":"quickstart-task","agent":{"name":"oracle"}}' \
-F "task_archive=@/tmp/${TASK_NAME}.tar.gz" \
| python3 -m json.tool请求成功后返回 run_id,任务初始状态为 queued,例如:
{
"run_id": "quickstart-task-xxxxxx",
"status": "queued"
}查询任务状态和结果
将 <RUN_ID> 替换为提交接口返回的 run_id:
export RUN_ID="<RUN_ID>"
curl -s ${SERVER}/api/v1/runs/async/${RUN_ID}/status \
| python3 -m json.tool任务状态通常按照 queued、running、completed 的顺序变化。任务到达终态后,查询执行结果:
curl -s ${SERVER}/api/v1/runs/async/${RUN_ID}/result \
| python3 -m json.tool执行成功时,返回结果中的 status 为 completed,奖励为 1.0,例如:
{
"run_id": "quickstart-task-xxxxxx",
"status": "completed",
"rewards": {
"reward": 1.0
}
}至此,ACK Rollout Server 已完成任务接收、排队、沙箱创建、Agent 执行、Verifier 验证和结果返回的完整流程。
常见问题
Pod 长时间未就绪
查看 Pod 事件和容器日志:
POD_NAME="<POD_NAME>"
kubectl -n kube-rl describe pod ${POD_NAME}
kubectl -n kube-rl logs deployment/ack-rollout-server --all-containers --tail=100重点检查集群资源是否充足、镜像是否可以拉取,以及 PVC 是否已绑定。
任务长时间处于 queued 状态
先检查服务健康状态和 Worker 列表:
curl -s ${SERVER}/health | python3 -m json.tool如果 workers 为空,请检查 ACK Rollout Server Pod 日志。如果 Worker 已注册但没有空闲容量,请等待正在运行的任务结束。
任务因镜像拉取失败而结束
确认 task.toml 中的 environment.docker_image 可以从集群节点访问。对于私有镜像,请在 ACK Rollout Server 安装参数中配置镜像拉取 Secret,并确保该 Secret 与 ACK Rollout Server 位于同一命名空间。