本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.20:CSI 驱动程序中的 Pod 模拟和短时卷
通常,当 CSI 驱动程序挂载诸如密钥和证书之类的凭据时,它必须针对存储提供程序进行身份验证才能访问这些凭据。但是,对这些凭据的访问是基于 Pod 的身份而不是 CSI 驱动程序的身份来控制的。因此,CSI 驱动程序需要某种方法来检索 Pod 的服务帐户令牌。
目前,有两种次优的方法可以实现这一点,要么授予 CSI 驱动程序使用 TokenRequest API 的权限,要么直接从主机文件系统中读取令牌。
这两种方法都存在以下缺点:
- 违反了最小权限原则
- 每个 CSI 驱动程序都需要重新实现获取 Pod 服务帐户令牌的逻辑
第二种方法问题更多,原因如下:
- 令牌的受众默认为 kube-apiserver
- 不能保证令牌可用(例如,
AutomountServiceAccountToken=false
) - 该方法不适用于以与 Pod 不同的(非 root)用户身份运行的 CSI 驱动程序。请参阅服务帐户令牌的文件权限部分
- 如果
BoundServiceAccountTokenVolume=false
,则令牌可能是不会过期的旧版 Kubernetes 服务帐户令牌
Kubernetes 1.20 引入了一个 alpha 功能 CSIServiceAccountToken
,以提高安全性。新功能允许 CSI 驱动程序接收 Pod 的绑定服务帐户令牌。
此功能还提供了一个重新发布卷的旋钮,以便可以刷新短时卷。
Pod 模拟
使用 GCP API
使用工作负载身份,Kubernetes 服务帐户可以在访问 Google Cloud API 时以 Google 服务帐户的身份进行身份验证。如果 CSI 驱动程序需要代表其挂载卷的 Pod 访问 GCP API,则可以使用 Pod 的服务帐户令牌交换 GCP 令牌。当启用 CSIServiceAccountToken
功能时,Pod 的服务帐户令牌会在 NodePublishVolume
RPC 调用中的卷上下文中传递。例如:通过 密钥存储 CSI 驱动程序访问 Google Secret Manager。
使用 Vault
如果用户将 Kubernetes 配置为身份验证方法,Vault 将使用 TokenReview
API 来验证 Kubernetes 服务帐户令牌。对于使用 Vault 作为资源提供程序的 CSI 驱动程序,它们需要向 Vault 提供 Pod 的服务帐户。例如,密钥存储 CSI 驱动程序和证书管理器 CSI 驱动程序。
短时卷
为了使诸如证书之类的短时卷保持有效,CSI 驱动程序可以在其 CSIDriver
对象中指定 RequiresRepublish=true
,以使 kubelet 定期在已挂载的卷上调用 NodePublishVolume
。这些重新发布允许 CSI 驱动程序确保卷内容是最新的。
后续步骤
此功能为 alpha 版本,预计将在 1.21 中进入 beta 版本。请参阅以下 KEP 和 CSI 文档以了解更多信息
欢迎您的反馈!
- SIG-Auth 定期举行会议,可以通过Slack 和邮件列表联系。
- SIG-Storage 定期举行会议,可以通过Slack 和邮件列表联系。