资讯详情

如何在 AKS 集群上用 Kata VM 隔离部署 OpenSandbox 并验证沙箱端到端可用

📅 2026/9/15 14:53:51 | 华诺云谱 👁 阅读
如何在 AKS 集群上用 Kata VM 隔离部署 OpenSandbox 并验证沙箱端到端可用
如何在 AKS 集群上用 Kata VM 隔离部署 OpenSandbox 并验证沙箱端到端可用【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox本文的目标是在一个已有 Kata 节点池的 AKS 集群上部署 OpenSandboxcontroller、生命周期 server、ingress 网关创建一个运行在独立 Kata VM 内的沙箱并逐步验证命令执行、出站白名单、Credential Vault 密钥注入、ingress 网关访问这几条链路端到端可用。仓库中的完整示例位于 examples/aks-kata配套说明文档见 docs/examples/aks-kata.md。开始前注意示例中的 Helm values 使用不安全、公开的演示凭据api_key aks-kata-demo-key和固定的secureAccess签名密钥这样本地kubectl port-forward可以开箱即用。在把 server 或网关暴露到127.0.0.1以外的环境之前必须先替换这两个值例如随机 api_key签名密钥可用openssl rand -base64 32生成。准备条件一个 AKS 集群满足kubectl get runtimeclass能看到kata-vm-isolation这个 RuntimeClassHelm 3Python 3.10执行pip install opensandbox requests安装 SDK 与依赖一个 Azure OpenAI 资源endpoint API key用于验证 Credential Vault 链路示例由以下文件组成都在 examples/aks-kata 下文件用途main.pyCLI 工具——按步骤创建、检查、操作沙箱controller-values.yamlOpenSandbox controller 的 Helm valuesserver-values.yaml生命周期 server 与 ingress 网关的 Helm valuesbatchsandbox-template-configmap.yaml通过nodeSelector把沙箱 Pod 固定到 Kata 节点的 BatchSandbox 模板1. 安装 OpenSandbox以下命令在仓库根目录执行kubectl create namespace opensandbox-system --dry-runclient -o yaml | kubectl apply -f - kubectl create namespace opensandbox --dry-runclient -o yaml | kubectl apply -f - kubectl apply -f examples/aks-kata/batchsandbox-template-configmap.yaml helm upgrade --install opensandbox-controller ./kubernetes/charts/opensandbox-controller \ --namespace opensandbox-system \ -f examples/aks-kata/controller-values.yaml helm upgrade --install opensandbox-server ./kubernetes/charts/opensandbox-server \ --namespace opensandbox-system \ -f examples/aks-kata/server-values.yaml等三个 Deployment 滚动完成kubectl rollout status deploy/opensandbox-controller-manager -n opensandbox-system --timeout180s kubectl rollout status deploy/opensandbox-server -n opensandbox-system --timeout180s kubectl rollout status deploy/opensandbox-ingress-gateway -n opensandbox-system --timeout180s安装完成后集群中各组件的分工opensandbox-controlleropensandbox-system命名空间是 Kubernetes operator管理 BatchSandbox CRD、池和快照opensandbox-server提供生命周期 APIopensandbox-ingress-gateway带鉴权地把外部 HTTP 流量路由进沙箱 PodBatchSandbox 模板负责通过nodeSelector: kubernetes.azure.com/kata-vm-isolation: true把沙箱 Pod 钉到支持 Kata 的 AKS 节点。server 的关键配置见 server-values.yamlworkload_provider batchsandbox、secure_runtime.type kata/k8s_runtime_class kata-vm-isolation、egress sidecar 使用dnsnft模式、ingress 网关使用header路由加secureAccess。2. 启动 port-forward开两个独立终端分别转发生命周期 server 和 ingress 网关# 终端 1 — 生命周期 server kubectl port-forward -n opensandbox-system svc/opensandbox-server 18080:80 # 终端 2 — ingress 网关 kubectl port-forward -n opensandbox-system svc/opensandbox-ingress-gateway 28080:803. 设置环境变量export SANDBOX_DOMAINhttp://127.0.0.1:18080 export SANDBOX_API_KEYaks-kata-demo-key # 下面两行替换为你自己的 Azure OpenAI 资源信息 export AZURE_OPENAI_ENDPOINThttps://your-resource.openai.azure.com export AZURE_OPENAI_API_KEYyour-real-key # 可选 # export AZURE_OPENAI_DEPLOYMENTgpt-4o-miniSANDBOX_DOMAIN和SANDBOX_API_KEY对应本地 port-forward 端口与 demo values 中的api_keyAZURE_OPENAI_ENDPOINT/AZURE_OPENAI_API_KEY是你自己的真实值文档中的your-resource、your-real-key是占位写法。4. 可选启用 Pause/ResumePause 会把沙箱 rootfs 提交为 OCI 镜像推送到 registryResume 从该镜像重建沙箱没有 registry 时pause和resume步骤会记录错误并继续python3 main.py all会打印跳过信息并照常走完全流程。本节以 Azure Container RegistryACR为例任意 OCI registry 均可完整说明见 Pause / Resume 指南。以下命令中的resource-group、cluster-name、acr-name三个占位符分别替换为你的 AKS 资源组名、集群名和 ACR 实例名。Step 1给 kubelet 身份授予 AcrPushKUBELET_ID$(az aks show \ -g resource-group -n cluster-name \ --query identityProfile.kubeletidentity.clientId -o tsv) ACR_ID$(az acr show --name acr-name --query id -o tsv) az role assignment create --assignee $KUBELET_ID --role AcrPush --scope $ACR_IDStep 2创建推送/拉取 SecretACR_PASSWORD$(az acr credential show --name acr-name \ --query passwords[0].value -o tsv) kubectl create secret docker-registry acr-snapshot-push-secret \ --docker-serveracr-name.azurecr.io \ --docker-usernameacr-name \ --docker-password$ACR_PASSWORD \ --namespaceopensandboxStep 3升级 controller 并注入快照配置helm upgrade opensandbox-controller ./kubernetes/charts/opensandbox-controller \ --namespace opensandbox-system \ --reuse-values \ --set controller.snapshot.registryacr-name.azurecr.io/opensandbox-snapshots \ --set controller.snapshot.snapshotPushSecretacr-snapshot-push-secret \ --set controller.snapshot.resumePullSecretacr-snapshot-push-secret kubectl rollout status deploy/opensandbox-controller-manager \ -n opensandbox-system --timeout90schart 中controller.snapshot.registry、snapshotPushSecret、resumePullSecret默认都是空字符串见 controller chart values所以不执行本步时快照功能不可用。另外controller.snapshot.containerdSocketPath默认为表示 controller 使用内置默认值/var/run/containerd/containerd.sock如果你的节点使用非默认 containerd socket需要显式设置该值。5. 用 main.py 逐步验证以下命令都在示例目录下执行cd examples/aks-kata想一次性跑通全流程创建 → 全部步骤 → 删除可以直接执行python3 main.py all下面按单步执行讲解验证逻辑。创建沙箱python3 main.py create文档示例输出sandbox ID 每次不同Creating Kata-isolated sandbox on AKS... OpenSandbox API: http://127.0.0.1:18080 Sandbox image: sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/code-interpreter:v1.1.0 SANDBOX_ID96045ee2-6614-435c-9fa8-d4b6f9592598 Use --sandbox-id 96045ee2-6614-435c-9fa8-d4b6f9592598 for subsequent steps.把输出的 ID 存下来供后续步骤使用下面用示例值演示export SANDBOX_ID96045ee2-6614-435c-9fa8-d4b6f9592598创建请求会带上 deny-by-default 的出站策略只放行 Azure OpenAI、pypi.org、files.pythonhosted.org见 main.py 中的network_policy与credential_proxy配置。验证 Pod 确实跑在 Kata VM 上这是判断“Kata 隔离是否生效”的核心检查kubectl get pod -n opensandbox -o wide # NODE 列应该显示 aks-sandboxagent-* kubectl get pod -n opensandbox -o jsonpath{.items[0].spec.runtimeClassName} # 预期: kata-vm-isolation python3 main.py exec --sandbox-id $SANDBOX_ID -c uname -r # 预期: 6.6.137.mshv1-1.azl3 (mshv Microsoft Hypervisor Kata VM 客户机内核)三个检查分别确认Pod 调度到 Kata 节点池、Pod 的runtimeClassName是kata-vm-isolation、沙箱内看到的是独立客户机内核而不是宿主机内核。配置 Credential Vault 并验证 LLM 链路python3 main.py credentials --sandbox-id $SANDBOX_ID预期输出[credentials] Credential Vault configured.再让沙箱里的 LLM 调用走一遍python3 main.py llm --sandbox-id $SANDBOX_ID -q What is the capital of France? Reply in one word.文档示例输出[llm] Question: What is the capital of France? Reply in one word. [llm] Model: gpt-4o-mini [llm] Answer: Paris能拿到回答说明出站白名单和密钥注入都工作正常。可以进一步验证密钥只存在于 egress 侧python3 main.py exec --sandbox-id $SANDBOX_ID -c echo \$AZURE_OPENAI_API_KEY # 预期: fake-key-inside-sandbox沙箱内看到的只是假 key真实的 Azure OpenAI key 存在 Credential Vault 中由 egress sidecar 仅对发往https://your-resource.openai.azure.com/openai/*的匹配出站请求以api-key头注入。在沙箱内执行命令python3 main.py exec --sandbox-id $SANDBOX_ID -c uname -a # [exec][stdout] Linux ...-0 6.6.137.mshv1-1.azl3 ... x86_64 GNU/Linux文档示例 python3 main.py exec --sandbox-id $SANDBOX_ID -c cat /etc/os-release | head -3 # [exec][stdout] PRETTY_NAMEUbuntu 24.04.4 LTS文档示例不带-c时exec会运行内置演示序列。通过 ingress 网关访问沙箱内 HTTP 服务沙箱入口进程是python3 -m http.server 8080根目录为/tmp/www/外部流量经过 ingress 网关并携带 secure-access 头由 SDK 的get_endpoint()返回调用方不需要手工构造OpenSandbox-Secure-Access与OpenSandbox-Ingress-To头# 向沙箱写入文件再经网关取回 python3 main.py exec --sandbox-id $SANDBOX_ID -c echo hello /tmp/www/greeting.txt python3 main.py http --sandbox-id $SANDBOX_ID -p /greeting.txt # [http] GET /greeting.txt - 200 (6 bytes)文档示例 # hello # 目录列表 python3 main.py http --sandbox-id $SANDBOX_ID -p / # 不存在的文件 python3 main.py http --sandbox-id $SANDBOX_ID -p /nonexistent.txt # [http] GET /nonexistent.txt - 404文档示例/greeting.txt返回 200、不存在的文件返回 404说明经网关的入站路由和鉴权链路可用。查看状态、暂停/恢复、删除python3 main.py status --sandbox-id $SANDBOX_ID # 文档示例: # Sandbox: 96045ee2-6614-435c-9fa8-d4b6f9592598 # State: Running # Image: ...code-interpreter:v1.1.0如果执行了第 4 节的 ACR 配置可以继续验证暂停/恢复快照推送约 1–5 分钟python3 main.py pause --sandbox-id $SANDBOX_ID # [lifecycle] sandbox is PAUSED文档示例 python3 main.py status --sandbox-id $SANDBOX_ID # State: Paused # Pod 已消失但 BatchSandbox CR 和快照还在 kubectl get pods -n opensandbox # No resources found kubectl get sandboxsnapshot -n opensandbox # 显示 phase 为 Succeed 的快照 python3 main.py resume --sandbox-id $SANDBOX_ID # [lifecycle] state after resume: Running文档示例验证完成后删除沙箱python3 main.py delete --sandbox-id $SANDBOX_ID # [lifecycle] sandbox 96045ee2-... deleted.文档示例 kubectl get pods -n opensandbox # No resources found安全模型要点Kata VM 隔离每个沙箱运行在专用 Kata VMruntimeClassName: kata-vm-isolation中落在带kubernetes.azure.com/kata-vm-isolation: true标签的 AKS Kata 节点池上沙箱看到的是自己的客户机内核而非宿主机内核。出站隔离创建请求设置了 deny-by-default 出站策略只放行显式允许的域名。逐服务鉴权即使绕过网关直连 Podexecd端口 44772需要自己的 access token 头egress sidecar端口 18080需要OPENSANDBOX-EGRESS-AUTH头只有用户 HTTP 服务端口 8080没有内置鉴权这正是 secureAccess 要保护的部分。清理执行以下命令删除本示例安装的全部内容。注意第 1 步会删除opensandbox命名空间下所有BatchSandbox沙箱第 5 步会删除整个命名空间请确认没有混用其他工作负载# 1) 删除运行中的沙箱 kubectl delete batchsandbox --all -n opensandbox # 2) 卸载 Helm release helm uninstall opensandbox-server -n opensandbox-system helm uninstall opensandbox-controller -n opensandbox-system # 3) 删除 BatchSandbox 模板 ConfigMap kubectl delete configmap aks-kata-batchsandbox-template -n opensandbox-system # 4) 删除快照推送/拉取 Secret如果创建过 kubectl delete secret acr-snapshot-push-secret -n opensandbox --ignore-not-found # 5) 删除命名空间 kubectl delete namespace opensandbox kubectl delete namespace opensandbox-system相关文档完整场景说明docs/examples/aks-kata.md安全容器运行时Kata/gVisor/Firecracker原理与验证方式docs/guides/secure-container.md示例代码与 valuesexamples/aks-kata【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。