Kubernetes v1.37:Rootless 模式(KubeletInUserNamespace)升级至 Beta
Kubernetes 官方博客宣布,Kubernetes v1.37 中 KubeletInUserNamespace 特性(即 Rootless mode)正式从 Alpha 升级至 Beta。这一特性允许 kubelet 在非特权用户命名空间中运行,无需 root 权限,从而显著提升 Kubernetes 节点的安全性。这是 Kubernetes 在多租户和安全隔离方向的重要进展。
什么是 Rootless 模式
传统 Kubernetes 的安全问题
传统 Kubernetes 部署中,kubelet 需要以 root 权限运行,因为它需要:
- 创建和管理网络命名空间
- 挂载文件系统
- 配置 cgroup
- 管理容器生命周期
这带来了安全风险:如果 kubelet 被攻破,攻击者可能获得节点的 root 权限,进而影响整个集群。
Rootless 模式的解决方案
KubeletInUserNamespace 特性允许 kubelet 在用户命名空间(user namespace)中运行。用户命名空间是 Linux 内核提供的安全隔离机制,它将容器内的 root 用户映射到宿主机上的非特权用户。
这意味着:
- kubelet 在其命名空间内看起来是 root,但在宿主机上是非特权用户
- 即使 kubelet 被攻破,攻击者也无法获得宿主机的 root 权限
- 显著降低了容器逃逸的风险
技术实现
用户命名空间映射
Rootless 模式的核心是用户命名空间映射。kubelet 在启动时创建一个用户命名空间,并将宿主机上的非特权 UID/GID 范围映射到命名空间内的 root(UID 0)。
这需要:
- 宿主机上配置
/etc/subuid和/etc/subgid,为用户分配可映射的 UID/GID 范围 - kubelet 以非 root 用户启动
- kubelet 在用户命名空间内创建容器
与 Rootless Docker/Podman 的关系
Rootless 模式与 Rootless Docker 和 Podman 的 rootless 模式概念类似,但有重要区别:
- Rootless Docker/Podman 是单容器引擎的 rootless 运行
- Kubernetes Rootless 模式是整个 kubelet 的 rootless 运行,包括 Pod 管理、网络、存储等
Beta 阶段的改进
从 Alpha 升级到 Beta,Kubernetes 团队做了大量改进:
1. 稳定性提升
- 修复了多个与用户命名空间相关的 bug
- 改进了 cgroup v2 的支持
- 优化了网络插件的兼容性
2. 功能完善
- 支持更多存储插件
- 改进了设备插件的支持
- 增强了与 CNI 插件的集成
3. 文档和测试
- 完善了官方文档
- 增加了端到端测试覆盖率
- 提供了更详细的部署指南
适用场景
1. 多租户环境
在多租户 Kubernetes 集群中,Rootless 模式可以:
- 降低单个租户被攻破后的影响范围
- 满足金融、政府等行业的严格安全要求
- 支持在共享基础设施上运行不可信工作负载
2. 边缘计算
边缘设备通常资源有限且物理安全难以保证:
- Rootless 模式降低了边缘节点被物理攻破后的风险
- 可以在受限环境中更安全地运行 Kubernetes
3. 开发环境
开发者可以在自己的机器上:
- 无需 root 权限运行完整的 Kubernetes 集群
- 更安全地测试集群级别的功能
- 与生产环境更一致的开发体验
限制和注意事项
1. 内核要求
Rootless 模式需要较新的 Linux 内核,支持:
- 用户命名空间(user namespaces)
- cgroup v2
- 网络命名空间
建议使用 Linux 5.4 或更高版本内核。
2. 存储插件兼容性
某些存储插件可能需要 root 权限才能正常工作,特别是:
- 需要挂载特定文件系统的插件
- 需要直接访问块设备的插件
- 某些 CSI 驱动
在使用 Rootless 模式前,需要验证存储插件的兼容性。
3. 网络插件兼容性
网络插件也可能需要特殊配置:
- 某些 CNI 插件可能需要修改以支持 rootless 运行
- 网络策略的实现可能受限
- Service 类型 LoadBalancer 可能需要额外配置
4. 性能开销
用户命名空间引入了一定的性能开销:
- UID/GID 映射的额外计算
- 某些系统调用的间接层
- 文件系统权限检查的额外步骤
在大多数场景下,这个开销是可以接受的,但在高性能场景下需要评估。
如何启用
在 Kubernetes v1.37 中,KubeletInUserNamespace 特性默认在 Beta 阶段启用。要使用 Rootless 模式,需要:
- 确保宿主机内核支持用户命名空间和 cgroup v2
- 配置
/etc/subuid和/etc/subgid - 以非 root 用户启动 kubelet
- 在 kubelet 配置中启用相关选项
- 配置兼容的 CNI 和 CSI 插件
详细的部署步骤请参考 Kubernetes 官方文档。
总结
Kubernetes v1.37 中 Rootless 模式升级至 Beta 是 Kubernetes 安全演进的重要里程碑。通过允许 kubelet 在非特权用户命名空间中运行,Rootless 模式显著降低了容器逃逸和节点被攻破的风险,特别适用于多租户环境、边缘计算和安全敏感场景。虽然在存储插件、网络插件和性能方面仍有一些限制,但随着社区的持续改进,Rootless 模式有望成为 Kubernetes 部署的标准安全选项。对于关注集群安全的运维团队来说,现在是开始评估和测试 Rootless 模式的好时机。
来源:https://kubernetes.io/blog/2026/09/04/kubernetes-v1-37-rootless-beta/