本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

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,幫助我們增強此特性。我們已經有很多好點子,並且非常歡迎更多人的參與!