上个月发布的 Kubernetes v1.26 引入了一项 alpha 功能,允许您为 PersistentVolumeClaim 指定数据源,即使源数据属于不同的命名空间。启用新功能后,您可以在新 PersistentVolumeClaim 的 dataSourceRef
字段中指定 namespace。一旦 Kubernetes 检查访问是正常的,新的 PersistentVolume 就可以从其他命名空间中指定的存储源填充其数据。
在 Kubernetes v1.26 之前,如果您的集群启用了该AnyVolumeDataSource
功能,您已经可以从同一集群中的相同命名空间数据源配置新卷。但是,这仅适用于同一命名空间中的数据源,因此用户无法使用其他命名空间中的数据源声明来供给 PersistentVolume。为了解决这个问题,Kubernetes v1.26 在 PersistentVolumeClaim API 的dataSourceRef
字段中添加了一个新的 alpha namespace
字段。
怎么运行?
一旦 csi-provisioner 发现指定的数据源dataSourceRef
具有非空 namespace 名称,它会检查 PersistentVolumeClaim 字段.spec.dataSourceRef.namespace
指定的命名空间内的所有引用授权,以查看访问数据源是否被允许。如果有任何 ReferenceGrant 允许访问,则 csi-provisioner 会从数据源中提供一个卷。
实践一下
使用跨命名空间卷配置需要以下内容:
- 为 kube-apiserver 和 kube-controller-manager 启用
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
功能门[1] - 为特定
VolumeSnapShot
控制器安装 CRD - 安装 CSI Provisioner 控制器并启用
CrossNamespaceVolumeDataSource
feature gate - 安装 CSI 驱动程序
- 为 ReferenceGrants 安装 CRD
结合起来
要查看其工作原理,您可以安装示例并进行试用。此示例通过 prod 命名空间中的 VolumeSnapshot 在 dev 命名空间中创建 PVC。这是一个简单的例子。对于实际使用过程中,您可能想要使用更复杂的方法。
这个例子假设
- 您的 Kubernetes 集群已部署,且
AnyVolumeDataSource
和CrossNamespaceVolumeDataSource
功能门控已启用 - 有两个命名空间,dev 和 prod
- CSI 驱动程序已部署
- 在prod命名空间中存在一个名为
new-snapshot-demo
的现有 VolumeSnapshot - ReferenceGrant CRD(来自 Gateway API 项目)已经部署
Grant ReferenceGrants 对 CSI Provisioner 的读取权限
仅当 CSI 驱动程序具有CrossNamespaceVolumeDataSource
控制器功能时才需要访问 ReferenceGrants 。对于此示例,外部供应商需要 referencegrants (gateway.networking.k8s.io
API 组)的get、list和watch 权限。
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["referencegrants"]
verbs: ["get", "list", "watch"]
为 CSI Provisioner 启用 CrossNamespaceVolumeDataSource feature gate
添加--feature-gates=CrossNamespaceVolumeDataSource=true
到 csi-provisioner 命令行。例如,使用此清单片段重新定义容器:
- args:
- -v=5
- --csi-address=/csi/csi.sock
- --feature-gates=Topology=true
- --feature-gates=CrossNamespaceVolumeDataSource=true
image: csi-provisioner:latest
imagePullPolicy: IfNotPresent
name: csi-provisioner
创建一个 ReferenceGrant
这是 ReferenceGrant 示例的清单。
代码语言:javascript复制apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-prod-pvc
namespace: prod
spec:
from:
- group: ""
kind: PersistentVolumeClaim
namespace: dev
to:
- group: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: new-snapshot-demo
使用跨命名空间数据源创建 PersistentVolumeClaim
Kubernetes 在 dev 上创建一个 PersisentVolumeClaim,而 CSI 驱动程序从 prod 上的快照填充在 dev 上使用的 PersisentVolume。
代码语言:javascript复制apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
namespace: dev
spec:
storageClassName: example
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
dataSourceRef:
apiGroup: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: new-snapshot-demo
namespace: prod
volumeMode: Filesystem
总结
该增强功能,建议阅读 Provision volumes from cross-namespace snapshots[2]包括有关此功能的历史和技术实现的大量详细信息。
参考资料
[1]
功能门: https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/
[2]
Provision volumes from cross-namespace snapshots: https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3294-provision-volumes-from-cross-namespace-snapshots
- END -