本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.24:卷填充器(Volume Populators)进阶至 Beta
卷填充器(Volume Populators)特性已经发布了两个版本,现在进入了 Beta 阶段!在 Kubernetes v1.24 中,`AnyVolumeDataSource` 特性门控默认启用,这意味着用户可以将任何自定义资源指定为 PVC 的数据源。
在之前的一篇博客文章中详细介绍了卷填充器特性是如何工作的。简而言之,集群管理员可以在集群中安装一个 CRD 和相关的填充器控制器,任何可以创建该 CR 实例的用户都可以利用该填充器创建预填充的卷。
可以为不同目的并排安装多个填充器。SIG-storage 社区已经看到一些公开的实现,更多的原型应该很快就会出现。
强烈建议集群管理员在安装任何填充器之前,先安装 volume-data-source-validator 控制器和相关的 `VolumePopulator` CRD,这样用户就可以获得关于无效 PVC 数据源的反馈。
新特性
用于构建填充器的 lib-volume-populator 库现在包含了指标,以帮助运维人员监控和检测问题。该库现在是 Beta 版,最新版本为 v1.0.1。
volume data source validator 控制器也添加了指标支持,并且处于 Beta 阶段。`VolumePopulator` CRD 是 Beta 版,最新版本为 v1.0.1。
试一试
要了解其工作原理,你可以安装示例 “hello” 填充器并尝试一下。
首先安装 volume-data-source-validator 控制器。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/volume-data-source-validator/v1.0.1/client/config/crd/populator.storage.k8s.io_volumepopulators.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/volume-data-source-validator/v1.0.1/deploy/kubernetes/rbac-data-source-validator.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/volume-data-source-validator/v1.0.1/deploy/kubernetes/setup-data-source-validator.yaml
接下来安装示例填充器。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/lib-volume-populator/v1.0.1/example/hello-populator/crd.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/lib-volume-populator/87a47467b86052819e9ad13d15036d65b9a32fbb/example/hello-populator/deploy.yaml
你的集群现在有了一个新的 CustomResourceDefinition,它提供了一个名为 Hello 的测试 API。创建一个 `Hello` 自定义资源的实例,并带有一些文本。
apiVersion: hello.example.com/v1alpha1
kind: Hello
metadata:
name: example-hello
spec:
fileName: example.txt
fileContents: Hello, world!
创建一个 PVC,将该 CR 作为其数据源。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
dataSourceRef:
apiGroup: hello.example.com
kind: Hello
name: example-hello
volumeMode: Filesystem
接下来,运行一个读取 PVC 中文件的 Job。
apiVersion: batch/v1
kind: Job
metadata:
name: example-job
spec:
template:
spec:
containers:
- name: example-container
image: busybox:latest
command:
- cat
- /mnt/example.txt
volumeMounts:
- name: vol
mountPath: /mnt
restartPolicy: Never
volumes:
- name: vol
persistentVolumeClaim:
claimName: example-pvc
等待作业完成(包括其所有依赖项)。
kubectl wait --for=condition=Complete job/example-job
最后检查作业的日志。
kubectl logs job/example-job
输出应为
Hello, world!
请注意,该卷已经包含了一个文本文件,其内容是来自 CR 的字符串。这只是最简单的例子。实际的填充器可以设置卷以包含任意内容。
如何编写自己的卷填充器
鼓励有兴趣编写新填充器的开发人员使用 lib-volume-populator 库,并且只提供一个围绕该库的小型控制器包装器,以及一个能够附加到卷并将适当数据写入卷的 Pod 镜像。
单个填充器可以非常通用,以至于它们可以与每种类型的 PVC 一起工作,或者如果卷是由同一供应商的特定 CSI 驱动程序配置的,它们可以执行供应商特定的操作来快速填充卷的数据,例如,通过直接与该卷的存储进行通信。
我如何了解更多信息?
增强提案 卷填充器 包含了大量关于此特性历史和技术实现的细节。
关于持久卷的文档主题中的卷填充器和数据源部分,解释了如何在你的集群中使用此特性。
请加入 Kubernetes 存储 SIG,帮助我们增强此特性。我们已经有很多好点子,并且非常欢迎更多人的参与!