这篇文章已经一年多了,较旧的文章可能包含过时的内容。请检查从发表以来,页面中的信息是否变得不正确。

Kubernetes 1.20:CSI 驱动程序中的 Pod 身份假扮和短时卷

作者: Shihang Zhang(谷歌)

通常,当 CSI 驱动程序挂载 诸如 Secret 和证书之类的凭据时,它必须通过存储提供者的身份认证才能访问这些凭据。 然而,对这些凭据的访问是根据 Pod 的身份而不是 CSI 驱动程序的身份来控制的。 因此,CSI 驱动程序需要某种方法来取得 Pod 的服务帐户令牌。

当前,有两种不是那么理想的方法来实现这一目的,要么通过授予 CSI 驱动程序使用 TokenRequest API 的权限,要么直接从主机文件系统中读取令牌。

两者都存在以下缺点:

  • 违反最少特权原则
  • 每个 CSI 驱动程序都需要重新实现获取 Pod 的服务帐户令牌的逻辑

第二种方式问题更多,因为:

  • 令牌的受众默认为 kube-apiserver
  • 该令牌不能保证可用(例如,AutomountServiceAccountToken=false
  • 该方法不适用于以与 Pod 不同的(非 root 用户)用户身份运行的 CSI 驱动程序。请参见 服务帐户令牌的文件许可权部分
  • 该令牌可能是旧的 Kubernetes 服务帐户令牌,如果 BoundServiceAccountTokenVolume=false,该令牌不会过期。

Kubernetes 1.20 引入了一个内测功能 CSIServiceAccountToken 以改善安全状况。这项新功能允许 CSI 驱动程序接收 Pod 的绑定服务帐户令牌

此功能还提供了一个重新发布卷的能力,以便可以刷新短时卷。

Pod 身份假扮

使用 GCP APIs

使用 Workload Identity,Kubernetes 服务帐户可以在访问 Google Cloud API 时验证为 Google 服务帐户。 如果 CSI 驱动程序要代表其为挂载卷的 Pod 访问 GCP API,则可以使用 Pod 的服务帐户令牌来 交换 GCP 令牌。启用功能 CSIServiceAccountToken 后, 可通过 NodePublishVolume RPC 调用中的卷上下文来访问 Pod 的服务帐户令牌。例如:通过 Secret 存储 CSI 驱动 访问 Google Secret Manager

使用Vault

如果用户将 Kubernetes 作为身份验证方法配置, 则 Vault 使用 TokenReview API 来验证 Kubernetes 服务帐户令牌。 对于使用 Vault 作为资源提供者的 CSI 驱动程序,它们需要将 Pod 的服务帐户提供给 Vault。 例如,Secret 存储 CSI 驱动证书管理器 CSI 驱动

短时卷

为了使诸如证书之类的短时卷保持有效,CSI 驱动程序可以在其 CSIDriver 对象中指定 RequiresRepublish=true, 以使 kubelet 定期针对已挂载的卷调用 NodePublishVolume。 这些重新发布操作使 CSI 驱动程序可以确保卷内容是最新的。

下一步

此功能是 Alpha 版,预计将在 1.21 版中移至 Beta 版。 请参阅以下 KEP 和 CSI 文档中的更多内容:

随时欢迎您提供反馈!