内容提要
OpenKruise Agents v0.6.0 发布,新增流量控制面与代理组件,支持 L4/L7 网络访问控制、MCP 工具级 ACL 及凭据代理注入;新增 CheckpointRestore 与暂停实例批量升级;引入 PoolAutoscaler 实现声明式预热池扩缩容;支持探针驱动的自动暂停、定时唤醒与流量唤醒,提升安全、运维与成本优化能力。
延伸解读
安全控制的分层与边界
v0.6.0 将出口流量拆成节点侧 L4 与集中式 L7 两级:L4 拒绝在 Pod 内直接丢弃,L7 无法覆盖 L4 的拒绝决定。这种设计兼顾低延迟与统一审计,但文章明确提醒,控制仅覆盖经网关路由的流量;以 root 运行或拥有 NET_ADMIN/SYS_ADMIN 的容器可绕过 Pod 内 ACL,需配合 NetworkPolicy、主机防火墙等做纵深防御。
凭据代理注入的实际意义
凭据存放在 Kubernetes Secret 中,由出口代理按请求解析并改写外发请求,Agent 代码只看到占位头。这意味着密钥不会出现在 Pod 规格、环境变量或 Sandbox 元数据里,轮换 Secret 也无需重启 Sandbox。配合 failStrategy: Block,凭据缺失时请求会失败关闭,而不是带着空凭据继续外发,适合对上游 API 密钥敏感的平台团队。
升级与暂停实例的运维取舍
CheckpointRestore 保留 rootfs,但内存与 IP 仍会丢失,且不支持更换业务镜像,适合滚动 agent-runtime、traffic-proxy 等边车。stateFilter 可把 Paused 实例纳入批量升级,控制器逐个唤醒、升级、再暂停,使休眠池升级后保持原状,避免一次升级把休眠池变成持续计费。选择模式时需在数据连续性与镜像灵活性之间权衡。
自动暂停与唤醒的注意事项
空闲暂停依赖 exec 探针周期性上报活动状态,定时唤醒由探针输出下次激活时间,流量唤醒则要求请求先通过认证,未授权请求返回 401 且 Sandbox 保持暂停。文章指出唤醒成功也可能伴随请求失败(如返回 503),应检查 Sandbox.status.phase 后重试;探针失败或超时不会触发暂停或唤醒,属于安全侧行为。
Q&A
OpenKruise Agents v0.6.0 在架构上最大的变化是什么?
v0.6.0 从纯工作负载层升级为自带数据平面的工作负载层,新增 traffic-control-plane 和 traffic-proxy 两个组件,组件总数从 4 个增加到 6 个;CRD 数量从 6 个翻倍到 12 个,新增 PoolAutoscaler、TrafficPolicy、GlobalTrafficPolicy、SecurityProfile、GlobalSecurityProfile,形成覆盖集群、租户和沙箱的多级控制体系。
如何防止 Agent 沙箱访问云元数据端点等内部服务?
通过 SecurityProfile 或 GlobalSecurityProfile 配置 L7 规则,匹配 metadata.internal、*.internal.company.com 等域名并执行 block 动作(如返回 403),可有效防御提示注入代码发起的 SSRF 攻击。集群级基线可通过 priority 字段排在租户策略之前生效。
Agent 调用 MCP Server 时如何限制只能使用特定工具?
使用 SecurityProfile 中的 mcpToolPolicy,它只治理 JSON-RPC 的 tools/call 请求,并按 params.name 精确匹配工具名;将 defaultAction 设为 deny 即可实现工具级白名单,避免域级控制过粗带来的风险。
沙箱里的 Agent 代码如何安全地使用上游 API Key?
凭据存放在 Kubernetes Secrets 中,由出口代理在请求离开集群时按请求解析并重写请求头;Agent 代码只看到自己的占位头。凭据不会出现在 Pod spec、环境变量或沙箱元数据中,轮换 Secret 无需重启沙箱即可生效。
CheckpointRestore 升级模式和默认的 Recreate 有什么区别?
Recreate 会销毁重建 Pod,丢失内存、IP 和可写 rootfs 层,但支持更换业务镜像;CheckpointRestore 在升级前做快照、升级后恢复,保留 rootfs 数据,但内存/IP 仍会丢失且不支持更换业务镜像,适合滚动升级 agent-runtime、traffic-proxy 等 sidecar。
如何让处于暂停状态的沙箱也参与批量升级而不被意外唤醒?
在 SandboxUpdateOps 中设置 stateFilter.states 包含 Paused,控制器会逐个唤醒暂停的沙箱、完成升级后重新暂停,且 spec.paused 保持为 true,升级结束后整个池子恢复原状,不会把休眠池变成持续计费。
PoolAutoscaler 如何配置预热池的自动扩缩容?
PoolAutoscaler 通过 scaleTargetRef 指向 SandboxSet,设置 minReplicas/maxReplicas,用 capacityPolicy.targetAvailable(如 50%)按可用容量水位反馈扩缩,并支持 cronPolicies 定时覆盖。建议采用非对称稳定窗口:扩容快(如 60 秒)、缩容慢(如 300 秒),cron 触发优先于水位策略。
沙箱空闲时如何自动暂停以节省成本,又保证用户请求不失败?
通过 SandboxSet 的 probes 和 autoPausePolicy 配置:exec 探针定期上报活动状态,持续空闲超过 thresholdDuration 即暂停;恢复侧支持定时唤醒(探针输出下次激活时间,提前 leadTime 唤醒)和流量唤醒(暂停后首个请求触发唤醒而非报错)。注意唤醒请求需通过认证,且唤醒调用本身可能返回 503,应检查 Sandbox.status.phase 后重试。
v0.6.0 的网络访问控制有哪些必须注意的限制?
控制仅覆盖经过网关路由的流量;以 root 或拥有 NET_ADMIN/SYS_ADMIN 权限运行的容器可绕过 Pod 内 ACL。因此需与 Kubernetes NetworkPolicy、主机防火墙或云安全组配合使用,属于纵深防御而非绝对屏障。此外,策略一旦选中 Pod 即成为白名单,缺少 peer 字段的规则会被编译器跳过,且必须放行集群 DNS Service。