跳转至

执行组列表

鹤思在每个作业和作业步请求中使用一个有序的 GID 列表:

gids[0] = 有效(主)GID
gids[1:] = supplementary GID

前端收集有效 GID 和进程的 supplementary group,去重后保证有效 GID 位于首项。这组执行组始终对应提交者在宿主机上的权限,包括容器作业的 批处理脚本和通过 ccon run 提交的子步骤。

后端在每个执行节点按提交者身份执行最终校验。有效 GID 必须存在于该用户在节点的 组集合中;主 GID 缺失时在 payload 启动前失败。supplementary GID 只取 与节点实际组的交集;有请求的补充组被移除时,步骤只提示部分补充组已移除, 不列出具体 GID 或数量,并继续执行。节点存在但前端未请求的额外组不会 自动加入,也不会触发告警。

多节点作业步必须先由所有分配节点完成主 GID 校验,才能确认分配成功。 任一节点失败都会阻止部分 payload 启动,并继续执行原有状态上报、cgroup 清理和资源释放。

容器身份

提交者在宿主机上的身份与容器内的运行身份相互独立。ccon --user 和 cbatch --pod-user 只选择容器内的运行身份,不会改变提交者在宿主机上的组权限。

  • 未启用 user namespace:容器以提交者的 UID、有效 GID 和节点校验后的补充组启动。 显式指定的 UID/GID 必须与提交者 UID/EGID 一致,root 提交者也遵循此规则。
  • 启用 user namespace:默认容器身份为 0:0,可用 --user / --pod-user 指定节点映射范围内的 UID/GID。作业只使用提交者的有效 EGID,不携带补充组。 属于多个宿主机组的用户仍可提交 userns 作业,但作业不保留补充组权限。 容器 UID/GID 无须存在于宿主机 NSS。

只指定 UID 时,省略的 GID 使用该模式的默认值:userns 为 0,非 userns 为提交者 EGID。 两个模式均设置 CRI SupplementalGroupsPolicy=Strict,避免镜像的 /etc/group 自动追加组;容器运行时须支持此策略。

独立容器作业在前端取得提交身份、确定脚本和命令行中的最终 userns 选项后, 仅保留有效 EGID,再校验身份。容器子步骤继承父作业的 Pod 设置;启用 userns 时, 调度端还会在校验前将子步骤的组列表替换为父作业的有效 EGID。 即使提交子步骤的进程仍带有补充组,或其 EGID 与父作业不同,也按父作业身份执行。 调度端和执行节点继续校验 userns 仅使用单个有效组的限制。

userns 的 UID/GID mapping 使用该账户现有的 SubUID/SubGID 区间;SubGID 自动分配 仍以账户 NSS 主 GID 选择区间,不因某次提交的 EGID 改变而重新分配。 namespace 映射始终从容器 ID 0 开始,不随指定的运行身份变化;节点在启动 payload 前, 分别按实际 UID/GID 映射区间校验指定值。 原生 idmapped mount 和 bindfs 均把提交者 UID/EGID 对应到指定的容器 UID/GID(默认 0:0), 挂载转换和新文件创建组不再假定 EGID 等于 NSS 主 GID。 目前不支持 userns 下继承宿主机补充组的挂载权限。