这篇文章发布已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

Kubernetes 1.24:卷填充器升级至 Beta 版

卷填充器功能现在已经发布两个版本,并且正在进入 Beta 阶段!AnyVolumeDataSource 特性门在 Kubernetes v1.24 中默认启用,这意味着用户可以将任何自定义资源指定为 PVC 的数据源。

一篇早期的博客文章详细介绍了卷填充器功能的工作原理。简而言之,集群管理员可以在集群中安装 CRD 和相关的填充器控制器,任何可以创建 CR 实例的用户都可以通过利用填充器来创建预填充的卷。

可以并行安装多个填充器以用于不同的目的。SIG 存储社区已经看到了一些公开的实现,并且应该很快会出现更多的原型。

强烈建议集群管理员在安装任何填充器之前安装卷数据源验证器控制器和相关的 VolumePopulator CRD,以便用户可以获得有关无效 PVC 数据源的反馈。

新特性

构建填充器的 lib-volume-populator 库现在包含用于帮助运维人员监控和检测问题的指标。该库现在处于 Beta 阶段,最新版本是 v1.0.1。

卷数据源验证器控制器也添加了指标支持,并且处于 Beta 阶段。VolumePopulator CRD 处于 Beta 阶段,最新版本是 v1.0.1。

试用一下

要了解其工作原理,您可以安装示例 “hello” 填充器并尝试一下。

首先安装卷数据源验证器控制器。

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

等待 Job 完成(包括其所有依赖项)。

kubectl wait --for=condition=Complete job/example-job

最后检查 Job 的日志。

kubectl logs job/example-job

输出应该是

Hello, world!

请注意,该卷已经包含一个文本文件,其中包含 CR 中的字符串内容。这只是最简单的示例。实际的填充器可以设置卷以包含任意内容。

如何编写自己的卷填充器

鼓励有兴趣编写新填充器的开发人员使用 lib-volume-populator 库,并且仅在该库周围提供一个小型的控制器包装器,以及一个能够附加到卷并将适当数据写入卷的 Pod 镜像。

各个填充器可能非常通用,可以与每种 PVC 类型一起使用,或者它们可以执行特定于供应商的操作,以快速地用数据填充卷,例如,如果该卷是由同一供应商的特定 CSI 驱动程序配置的,则可以直接与该卷的存储进行通信。

如何了解更多信息?

增强提案,卷填充器,其中包含有关此功能的历史和技术实现的许多详细信息。

关于持久卷的文档主题中的卷填充器和数据源,介绍了如何在集群中使用此功能。

请通过加入 Kubernetes 存储 SIG 来参与,以帮助我们增强此功能。已经有很多好主意,我们很高兴有更多!