Kubernetes 1.20:CSI 驱动程序中的Pod模仿和短生命周期卷

半兽人 发表于: 2020-12-29   最后更新时间: 2020-12-29 00:15:50  
{{totalSubscript}} 订阅, 1,440 游览

2020/12/18 星期五

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

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

两者都存在以下缺点:

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

The second approach is more problematic due to:

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

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

此功能还提供了一个重新发布卷的能力,以便可以刷新短生命周期卷(short-lived volumes)

Pod 身份假扮(Pod Impersonation)

使用 GCP API

使用 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 驱动。

短生命周期卷(Short-lived Volumes)

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

此功能是 Alpha 版,预计将在 1.21 版中移至 Beta 版。

更新于 2020-12-29

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章