本篇文章已發布超過一年。較舊的文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.22:Volume Populators 的新設計
本月稍早發布的 Kubernetes v1.22 針對卷宗填充器引入了重新設計的方法。最初在 v1.18 中實作的 API 存在回溯相容性問題。Kubernetes v1.22 包含一個名為 dataSourceRef
的新 API 欄位,可修正這些問題。
資料來源
先前的 Kubernetes 版本已在 PersistentVolumeClaim API 中新增了 dataSource
欄位,用於複製卷宗和從快照建立卷宗。您可以在建立新的 PVC 時使用 dataSource
欄位,參考相同命名空間中的現有 PVC 或 VolumeSnapshot。這也修改了正常的佈建程序,因此新的 PVC 不會產生空的卷宗,而是包含與複製的 PVC 或複製的 VolumeSnapshot 相同的資料。
卷宗填充器採用相同的設計概念,但將其擴展到任何類型的物件,只要存在 自訂資源 來定義資料來源,以及填充器控制器來實作邏輯即可。最初,如果叢集上啟用了 AnyVolumeDataSource
功能閘道,則直接擴展了 dataSource
欄位以允許任意物件。不幸的是,該變更導致了回溯相容性問題,因此誕生了新的 dataSourceRef
欄位。
在 v1.22 中,如果啟用了 AnyVolumeDataSource
功能閘道,則會新增 dataSourceRef
欄位,其行為與 dataSource
欄位類似,但允許指定任意物件。API 伺服器確保這兩個欄位始終具有相同的內容,並且它們都是不可變的。不同之處在於,在建立時,dataSource
僅允許 PVC 或 VolumeSnapshot,並忽略所有其他值,而 dataSourceRef
允許大多數類型的物件,並且在少數不允許物件 (PVC 以外的核心物件) 的情況下,會發生驗證錯誤。
當此 API 變更升級為穩定版時,我們將棄用 dataSource
的使用,並建議在所有使用案例中使用 dataSourceRef
欄位。在 v1.22 版本中,dataSourceRef
可用 (作為 alpha 功能),特別適用於您想要用於自訂卷宗填充器的情況。
使用填充器
每個卷宗填充器都必須有一個或多個其支援的 CRD。管理員可以安裝 CRD 和填充器控制器,然後具有 dataSourceRef
的 PVC 指定填充器支援的類型的 CR 將由填充器控制器而非 CSI 驅動程式直接處理。
在底層,CSI 驅動程式仍然會被調用以建立空的卷宗,然後填充器控制器會使用適當的資料填充該卷宗。PVC 在完全填充之前不會繫結到 PV,因此可以安全地定義包含 Pod 和 PVC 規格的整個應用程式資訊清單,並且 Pod 不會在一切就緒後才開始執行,就像 PVC 是另一個 PVC 或 VolumeSnapshot 的複製品一樣。
運作方式
具有資料來源的 PVC 仍然會被相關儲存類別的 external-provisioner sidecar 注意到 (假設使用了 CSI 佈建器),但由於 sidecar 不了解資料來源種類,因此不會執行任何操作。填充器控制器也會監看具有其了解的資料來源種類的 PVC,當它看到一個時,它會建立一個與原始 PVC 具有相同大小、卷宗模式、儲存類別,甚至在相同拓撲 (如果使用了拓撲) 上的臨時 PVC。填充器控制器會建立一個 worker Pod,該 Pod 會連接到卷宗並將必要的資料寫入其中,然後從卷宗分離,並且填充器控制器會將 PV 從臨時 PVC 重新繫結到原始 PVC。
試用
使用卷宗填充器需要以下事項
- 啟用
AnyVolumeDataSource
功能閘道 - 安裝特定資料來源/填充器的 CRD
- 安裝填充器控制器本身
填充器控制器可以使用 lib-volume-populator 程式庫來完成大多數 Kubernetes API 層級的工作。個別填充器只需要提供邏輯,以根據特定的 CR 實例將資料實際寫入卷宗。此程式庫提供了一個範例填充器實作。
這些選用元件可改善使用者體驗
- 安裝 VolumePopulator CRD
- 為每個特定資料來源建立 VolumePopulator 自訂資源
- 安裝 卷宗資料來源驗證器 控制器 (alpha)
這些元件的目的是在沒有填充器的資料來源的 PVC 上產生警告事件。
整合在一起
若要了解其運作方式,您可以安裝範例 "hello" 填充器並試用。
首先安裝卷宗資料來源驗證器控制器。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/volume-data-source-validator/master/client/config/crd/populator.storage.k8s.io_volumepopulators.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/volume-data-source-validator/master/deploy/kubernetes/rbac-data-source-validator.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/volume-data-source-validator/master/deploy/kubernetes/setup-data-source-validator.yaml
接下來安裝範例填充器。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/lib-volume-populator/master/example/hello-populator/crd.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/lib-volume-populator/master/example/hello-populator/deploy.yaml
建立 Hello
CR 的實例,並包含一些文字。
apiVersion: hello.k8s.io/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.k8s.io
kind: Hello
name: example-hello
volumeMode: Filesystem
接下來,執行一個讀取 PVC 中檔案的工作。
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 驅動程式佈建的,則它們可以執行供應商特定的操作以快速使用資料填充卷宗,例如,透過直接與該卷宗的儲存空間通訊。
未來展望
由於此功能仍處於 alpha 階段,我們預期將使用更多測試和文件更新樹狀結構外的控制器。社群計劃最終將重新實作填充器程式庫作為 sidecar,以方便操作。
我們希望看到一些針對廣泛共享的使用案例的官方社群支援填充器。此外,我們預期備份供應商將使用卷宗填充器作為將備份「還原」到卷宗的方式,並且可能演變出用於執行此操作的標準化 API。
我要如何深入了解?
增強提案 卷宗填充器 包含有關此功能的歷史和技術實作的許多詳細資訊。
卷宗填充器和資料來源,在關於持久卷宗的文件主題中,說明如何在叢集中使用此功能。
請加入 Kubernetes 儲存 SIG 以協助我們增強此功能,藉此參與其中。已經有很多好主意了,我們很樂意有更多!