正式 sandbox 集群的 Kata 4.1.0 / clh-runtime-rs 已部署成功。两台节点上的 Kata guest 均能启动,guest kernel 为 6.18.35;但按普通 Pod 方式挂载 csi.spiffe.io 后,guest 内连接 Workload API 失败。
因此,不能把普通 Pod 的 CSI Workload API 注入原样复用于 ci-vm,也不能把路径存在误判为身份可用。
为每个动态 Kata Pod 提供其自身、可由 Kubernetes workload 语义证明的 SPIFFE identity:
关联 #83、#47。
2026-09-17 已完成 live PoC,结论:方案可行。Kata Pod 内以 native sidecar 启动 SPIRE Agent,使用 audience=spire-server 的 Pod-bound PSAT 向中央 Server 注册;Server 开启 use_pod_uid_for_agent_id 后,Agent ID 为 spiffe://ddupan.top/spire/agent/k8s_psat/sandbox-kata-poc/pod/{pod-uid}。随后创建 parentID 精确绑定该 Agent、SPIFFE ID 为 spiffe://ddupan.top/ci/poc/task/build、selector 为 unix:uid:2000 的临时 entry。guest 内 uid 2000 的 workload 通过 emptyDir 中的本地 Unix socket 成功取得 X.509-SVID,Pod exit 0;日志确认 registered=true 且签发的就是业务身份。关键约束:Pod 必须设置 shareProcessNamespace: true,否则 unix attestor 无法在 Agent 容器的 /proc 中解析另一个容器的 SO_PEERCRED PID。控制器还必须先创建 entry 再放行 job,本次用临时 init gate 验证了该顺序。PoC 后已删除 Pod、ConfigMap、entry 与三个临时 Agent,移除临时 Server profile并恢复 HelmRelease;Flux Ready=True、中央 Server 1/1、sandbox 两个 Agent 与 CSI 均正常,无残留。SPIRE 1.15.3 本身已支持 use_pod_uid_for_agent_id;缺口是当前 hardened chart 0.30.2 未暴露该字段。正式实现应给 chart 补齐 values/template 并向上游提交,随后采用包含修复的 release,不能依赖手改 ConfigMap。
已建立内部 fork:https://git.ddupan.top/panxiao81/helm-charts-hardened 。fork main 从当前部署的上游 tag spire-0.30.2(e5901d68)精确分叉,补丁提交为 c1deb08a,内部 chart tag 为 spire-0.30.2-ddupan.1。新增 nodeAttestor.k8sPSAT.usePodUIDForAgentID,以及 externalK8sPSAT defaults/单 cluster override,默认 false。已补单元渲染测试和生成参数文档;go test ./...、helm lint、helm template 均通过,渲染确认 sandbox cluster 输出 use_pod_uid_for_agent_id: true。本次只建立并验证 fork,尚未切换线上 HelmRelease。
2026-09-18 已完成线上切换。PR #96 已合并,Flux GitRepository 固定到内部 fork tag spire-0.30.2-ddupan.1@c1deb08a;Helm revision 8 使用 chart [email protected].2-ddupan.1+c1deb08ad4be,Ready=True 且无 drift。最终 Server 配置为 homelab=false、sandbox=false、sandbox-kata=true,现有 homelab/sandbox DaemonSet Agent ID 保持 node UID 不变。使用永久 sandbox-kata profile 再次启动 Kata smoke Agent,Pod UID 6709f320-97b9-449c-ab1e-10b83060660f 成功得到精确匹配的 .../sandbox-kata/pod/6709f320-97b9-449c-ab1e-10b83060660f Agent ID。测试 Pod、ConfigMap 和 Agent 记录均已清理。
完成永久 sandbox-kata profile 的 CI workload 正反向端到端验收:Kata Pod 内 Agent 以 Pod UID parent 注册;动态 entry 绑定 spiffe://ddupan.top/ci/poc/task/build 与 unix:uid:2000。uid 2000 workload 成功获取 X.509-SVID并 exit 0;同 guest 内 uid 2001 返回 PermissionDenied/no identity issued并 exit 1。日志确认 registered=true、SPIFFE ID 和 TTL 均正确。测试 Pod、ConfigMap、entry 与 Agent 已清理。结论:Kata+SPIRE 数据面已就绪,但尚未达到可直接承载真实 CI 的控制面就绪状态;仍需调度器自动创建 Pod/entry、等待 entry 同步后放行 workload、复制/注入 trust bundle、删除时清理 entry/Agent,并将正式 CI ServiceAccount 加入 sandbox-kata allowlist。若 CI 需要访问 Bao/zot,还需为正式业务 SPIFFE ID 配置并验收对应授权映射。
No dependencies set.
The note is not visible to the blocked user.
背景
正式 sandbox 集群的 Kata 4.1.0 / clh-runtime-rs 已部署成功。两台节点上的 Kata guest 均能启动,guest kernel 为 6.18.35;但按普通 Pod 方式挂载 csi.spiffe.io 后,guest 内连接 Workload API 失败。
已验证现象
因此,不能把普通 Pod 的 CSI Workload API 注入原样复用于 ci-vm,也不能把路径存在误判为身份可用。
目标
为每个动态 Kata Pod 提供其自身、可由 Kubernetes workload 语义证明的 SPIFFE identity:
需要评估的路线
验收
关联 #83、#47。
2026-09-17 已完成 live PoC,结论:方案可行。Kata Pod 内以 native sidecar 启动 SPIRE Agent,使用 audience=spire-server 的 Pod-bound PSAT 向中央 Server 注册;Server 开启 use_pod_uid_for_agent_id 后,Agent ID 为 spiffe://ddupan.top/spire/agent/k8s_psat/sandbox-kata-poc/pod/{pod-uid}。随后创建 parentID 精确绑定该 Agent、SPIFFE ID 为 spiffe://ddupan.top/ci/poc/task/build、selector 为 unix:uid:2000 的临时 entry。guest 内 uid 2000 的 workload 通过 emptyDir 中的本地 Unix socket 成功取得 X.509-SVID,Pod exit 0;日志确认 registered=true 且签发的就是业务身份。关键约束:Pod 必须设置 shareProcessNamespace: true,否则 unix attestor 无法在 Agent 容器的 /proc 中解析另一个容器的 SO_PEERCRED PID。控制器还必须先创建 entry 再放行 job,本次用临时 init gate 验证了该顺序。PoC 后已删除 Pod、ConfigMap、entry 与三个临时 Agent,移除临时 Server profile并恢复 HelmRelease;Flux Ready=True、中央 Server 1/1、sandbox 两个 Agent 与 CSI 均正常,无残留。SPIRE 1.15.3 本身已支持 use_pod_uid_for_agent_id;缺口是当前 hardened chart 0.30.2 未暴露该字段。正式实现应给 chart 补齐 values/template 并向上游提交,随后采用包含修复的 release,不能依赖手改 ConfigMap。
已建立内部 fork:https://git.ddupan.top/panxiao81/helm-charts-hardened 。fork main 从当前部署的上游 tag spire-0.30.2(e5901d68)精确分叉,补丁提交为 c1deb08a,内部 chart tag 为 spire-0.30.2-ddupan.1。新增 nodeAttestor.k8sPSAT.usePodUIDForAgentID,以及 externalK8sPSAT defaults/单 cluster override,默认 false。已补单元渲染测试和生成参数文档;go test ./...、helm lint、helm template 均通过,渲染确认 sandbox cluster 输出 use_pod_uid_for_agent_id: true。本次只建立并验证 fork,尚未切换线上 HelmRelease。
2026-09-18 已完成线上切换。PR #96 已合并,Flux GitRepository 固定到内部 fork tag spire-0.30.2-ddupan.1@c1deb08a;Helm revision 8 使用 chart [email protected].2-ddupan.1+c1deb08ad4be,Ready=True 且无 drift。最终 Server 配置为 homelab=false、sandbox=false、sandbox-kata=true,现有 homelab/sandbox DaemonSet Agent ID 保持 node UID 不变。使用永久 sandbox-kata profile 再次启动 Kata smoke Agent,Pod UID 6709f320-97b9-449c-ab1e-10b83060660f 成功得到精确匹配的 .../sandbox-kata/pod/6709f320-97b9-449c-ab1e-10b83060660f Agent ID。测试 Pod、ConfigMap 和 Agent 记录均已清理。
完成永久 sandbox-kata profile 的 CI workload 正反向端到端验收:Kata Pod 内 Agent 以 Pod UID parent 注册;动态 entry 绑定 spiffe://ddupan.top/ci/poc/task/build 与 unix:uid:2000。uid 2000 workload 成功获取 X.509-SVID并 exit 0;同 guest 内 uid 2001 返回 PermissionDenied/no identity issued并 exit 1。日志确认 registered=true、SPIFFE ID 和 TTL 均正确。测试 Pod、ConfigMap、entry 与 Agent 已清理。结论:Kata+SPIRE 数据面已就绪,但尚未达到可直接承载真实 CI 的控制面就绪状态;仍需调度器自动创建 Pod/entry、等待 entry 同步后放行 workload、复制/注入 trust bundle、删除时清理 entry/Agent,并将正式 CI ServiceAccount 加入 sandbox-kata allowlist。若 CI 需要访问 Bao/zot,还需为正式业务 SPIFFE ID 配置并验收对应授权映射。