本文已发布超过一年。较早的文章可能包含过时内容。请检查页面中的信息自发布以来是否已发生变化。

Kubernetes 1.26: 支持在挂载时将 Pod 的 fsGroup 传递给 CSI Driver

fsGroup 对 CSI 驱动的委托功能首次在 Kubernetes 1.22 中以 Alpha 状态引入,并在 Kubernetes 1.25 中升级到 Beta。对于 Kubernetes 1.26,我们很高兴地宣布此功能已升级到正式可用 (GA)。

在此版本中,如果你为(Linux)Pod 在安全上下文中指定了 fsGroup,则 Pod 中所有容器内的进程都属于你指定的附加组。

在之前的 Kubernetes 版本中,kubelet 会总是根据你在 Pod 的 .spec.securityContext.fsGroupChangePolicy 字段中指定的策略,对卷中的文件应用 fsGroup 所有权和权限更改。

从 Kubernetes 1.26 开始,CSI 驱动可以选择在卷挂载时应用 fsGroup 设置,这使得 kubelet 无需更改这些卷中文件和目录的权限。

工作原理是什么?

支持此功能的 CSI 驱动应声明其支持 VOLUME_MOUNT_GROUP 节点能力。

在识别此信息后,kubelet 在 Pod 启动期间通过 NodeStageVolumeRequestNodePublishVolumeRequest CSI 调用将 fsGroup 信息传递给 CSI 驱动。

因此,CSI 驱动应使用挂载选项fsGroup 应用于卷中的文件。例如,Azure File CSIDriver 利用 gid 挂载选项将 fsGroup 信息映射到卷中的所有文件。

需要注意的是,在上面的例子中,kubelet 没有直接更改该卷文件中文件和目录的权限。此外,两个策略定义不再生效:CSIDriver 对象的 .spec.fsGroupPolicy 和 Pod 的 .spec.securityContext.fsGroupChangePolicy

有关此功能内部工作原理的更多详细信息,请查看增强提案以及 CSI 开发者文档中的CSI 驱动 fsGroup 支持

为什么重要?

如果没有此功能,在某些存储环境中无法将 fsGroup 信息应用于文件。

例如,Azure 文件不支持 POSIX 风格的文件所有权和权限概念。CSI 驱动只能在卷级别设置文件权限。

如何使用它?

此功能对用户应该是基本透明的。如果你维护一个应支持此功能的 CSI 驱动,请阅读CSI Driver fsGroup 支持以获取更多关于如何在你的 CSI 驱动中支持此功能的信息。

现有的不支持此功能的 CSI 驱动将继续正常工作:它们不会从 kubelet 接收任何 fsGroup 信息。此外,对于这些卷,kubelet 将继续根据 CSIDriver 中 .spec.fsGroupPolicy 和相关 Pod 中 .spec.securityContext.fsGroupChangePolicy 中指定的策略对文件执行所有权和权限更改。