本文发表已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已失效。

Kubernetes 1.24: 卷填充器升级到 Beta

卷填充器 (volume populators) 功能现已发布两个版本,并进入 Beta 阶段!在 Kubernetes v1.24 中,AnyVolumeDataSource Feature Gate 默认启用,这意味着用户可以将任何自定义资源指定为 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!

创建一个将该 CR 作为其数据源的 PVC。

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 驱动程序供应的,例如,通过直接与该卷的存储进行通信。

如何了解更多?

增强提案 卷填充器 (Volume Populators) 包含了关于该功能历史和技术实现的许多细节。

持久卷文档主题中的卷填充器和数据源 (Volume populators and data sources) 解释了如何在你的集群中使用此功能。

请加入 Kubernetes Storage SIG 来帮助我们增强此功能。已经有很多好的想法,我们非常欢迎更多!