作者: Jonathan Dobson (Red Hat)
CSI 内联存储卷是在 Kubernetes 1.15 中作为 Alpha 功能推出的,并从 1.16 开始成为 Beta 版本。我们很高兴地宣布,这项功能在 Kubernetes 1.25 版本中正式发布(GA)。
CSI 内联存储卷与其他类型的临时卷相似,如 configMap
、downwardAPI
和 secret
。重要的区别是,存储是由 CSI 驱动提供的,它允许使用第三方供应商提供的临时存储。卷被定义为 Pod 规约的一部分,并遵循 Pod 的生命周期,这意味着卷随着 Pod 的调度而创建,并随着 Pod 的销毁而销毁。
1.25 版本有什么新内容?
1.25 版本修复了几个与 CSI 内联存储卷相关的漏洞, 并且 CSIInlineVolume 特性门控[1]已正式发布,锁定为 True
。因为没有新的 API 变化,所以除了这些错误修复外,使用该功能 Beta 版本的用户应该不会注意到任何重大变化。
- #89290 - CSI inline volumes should support fsGroup[2]
- #79980 - CSI volume reconstruction does not work for ephemeral volumes[3]
何时使用此功能
CSI 内联存储卷是为简单的本地卷准备的,这种本地卷应该跟随 Pod 的生命周期。它们对于使用 CSI 驱动为 Pod 提供 Secret、配置数据或其他特殊用途的存储可能很有用。
在以下情况下,CSI 驱动不适合内联使用:
- 卷需要持续的时间超过 Pod 的生命周期
- 卷快照、克隆或卷扩展是必需的
- CSI 驱动需要
volumeAttributes
字段,此字段应该限制给管理员使用
如何使用此功能
为了使用这个功能,CSIDriver
规约必须明确将 Ephemeral
列举为 volumeLifecycleModes
的参数之一。下面是一个来自 Secrets Store CSI Driver[4] 的简单例子。
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
name: secrets-store.csi.k8s.io
spec:
podInfoOnMount: true
attachRequired: false
volumeLifecycleModes:
- Ephemeral
所有 Pod 规约都可以引用该 CSI 驱动来创建一个内联卷,如下例所示。
代码语言:javascript复制kind: Pod
apiVersion: v1
metadata:
name: my-csi-app-inline
spec:
containers:
- name: my-frontend
image: busybox
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
command: [ "sleep", "1000000" ]
volumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "my-provider"
如果驱动程序支持一些卷属性,你也可以将这些属性作为 Pod spec
的一部分。
csi:
driver: block.csi.vendor.example
volumeAttributes:
foo: bar
使用案例示例
支持 Ephemeral
卷生命周期模式的两个现有 CSI 驱动是 Secrets Store CSI 驱动和 Cert-Manager CSI 驱动。
Secrets Store CSI Driver[5]允许用户将 Secret 作为内联卷从外部挂载到一个 Pod 中。当密钥存储在外部管理服务或 Vault 实例中时,这可能很有用。
Cert-Manager CSI Driver[6] 与 cert-manager[7] 协同工作, 无缝地请求和挂载证书密钥对到一个 Pod 中。这使得证书可以在应用 Pod 中自动更新。
安全考虑因素
应特别考虑哪些 CSI 驱动可作为内联卷使用。volumeAttributes
通常通过 StorageClass
控制,并可能包含应限制给集群管理员的属性。允许 CSI 驱动用于内联临时卷意味着任何有权限创建 Pod 的用户也可以通过 Pod 规约向驱动提供 volumeAttributes
字段。
集群管理员可以选择从 CSIDriver 规约中的 volumeLifecycleModes
中省略(或删除) Ephemeral
, 以防止驱动被用作内联临时卷,或者使用准入 Webhook[8] 来限制驱动的使用。
参考资料
关于此功能的更多信息,请参阅:
- Kubernetes 文档[9]
- CSI 文档[10]
- KEP-596[11]
- CSI 内联存储卷的 Beta 阶段博客文章[12]
参考资料
[1]
CSIInlineVolume 特性门控: https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/
[2]
#89290 - CSI inline volumes should support fsGroup: https://github.com/kubernetes/kubernetes/issues/89290
[3]
#79980 - CSI volume reconstruction does not work for ephemeral volumes: https://github.com/kubernetes/kubernetes/issues/79980
[4]
Secrets Store CSI Driver: https://github.com/kubernetes-sigs/secrets-store-csi-driver
[5]
Secrets Store CSI Driver: https://github.com/kubernetes-sigs/secrets-store-csi-driver
[6]
Cert-Manager CSI Driver: https://github.com/cert-manager/csi-driver
[7]
cert-manager: https://cert-manager.io/
[8]
准入 Webhook: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/extensible-admission-controllers/
[9]
Kubernetes 文档: https://kubernetes.io/zh-cn/docs/concepts/storage/ephemeral-volumes/#csi-ephemeral-volumes
[10]
CSI 文档: https://kubernetes-csi.github.io/docs/ephemeral-local-volumes.html
[11]
KEP-596: https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/596-csi-inline-volumes/README.md
[12]
CSI 内联存储卷的 Beta 阶段博客文章: https://kubernetes.io/blog/2020/01/21/csi-ephemeral-inline-volumes/