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

原始區塊磁碟區 Beta 版支援

Kubernetes v1.13 將原始區塊磁碟區支援移至 Beta 版。此功能允許將持久性磁碟區作為區塊裝置 (而非掛載的檔案系統) 在容器內公開。

什麼是區塊裝置?

區塊裝置可隨機存取固定大小區塊中的資料。硬碟、SSD 和 CD-ROM 光碟機都是區塊裝置的範例。

通常,持久性儲存實作是以分層方式進行,檔案系統 (如 ext4) 位於區塊裝置 (如旋轉磁碟或 SSD) 之上。然後,應用程式讀取和寫入檔案,而不是對區塊進行操作。作業系統負責讀取和寫入檔案,使用指定的檔案系統,以區塊形式到基礎裝置。

值得注意的是,雖然整個磁碟是區塊裝置,但磁碟分割區和儲存區域網路 (SAN) 裝置的 LUN 也是如此。

為何在 Kubernetes 中新增原始區塊磁碟區?

有些特殊應用程式需要直接存取區塊裝置,例如,因為檔案系統層會引入不必要的額外負荷。最常見的情況是資料庫,它們偏好直接在基礎儲存體上組織其資料。原始區塊裝置也常被任何本身實作某種儲存服務的軟體 (軟體定義儲存系統) 使用。

從程式設計師的角度來看,區塊裝置是一個非常大的位元組陣列,通常對於讀取和寫入有一些最小的粒度,通常為 512 個位元組,但通常為 4K 或更大。

隨著在 Kubernetes 內部執行資料庫軟體和儲存基礎架構軟體變得越來越普遍,Kubernetes 中對原始區塊裝置支援的需求也變得越來越重要。

哪些磁碟區外掛程式支援原始區塊?

截至本部落格發布時,以下內建磁碟區類型支援原始區塊

  • AWS EBS
  • Azure Disk
  • Cinder
  • 光纖通道
  • GCE PD
  • iSCSI
  • 本機磁碟區
  • RBD (Ceph)
  • Vsphere

樹狀結構外的 CSI 磁碟區驅動程式 也可能支援原始區塊磁碟區。Kubernetes CSI 對原始區塊磁碟區的支援目前為 Alpha 階段。請參閱此處的文件。

Kubernetes 原始區塊磁碟區 API

原始區塊磁碟區與一般磁碟區有很多共同之處。兩者都是透過建立繫結至 PersistentVolume 物件的 PersistentVolumeClaim 物件來請求,並透過將它們包含在 PodSpec 的磁碟區陣列中來附加到 Kubernetes 中的 Pod。

但是,有 2 個重要的差異。首先,若要請求原始區塊 PersistentVolumeClaim,您必須在 PersistentVolumeClaimSpec 中設定 volumeMode = "Block"。將 volumeMode 留空與指定 volumeMode = "Filesystem" 相同,這會導致傳統行為。PersistentVolumes 在其 PersistentVolumeSpec 中也有一個 volumeMode 欄位,而且 "Block" 類型的 PVC 只能繫結到 "Block" 類型的 PV,而 "Filesystem" 類型的 PVC 只能繫結到 "Filesystem" 類型的 PV。

其次,在 Pod 中使用原始區塊磁碟區時,您必須在 PodSpec 的 Container 部分中指定 VolumeDevice,而不是 VolumeMountVolumeDevices 具有 devicePaths 而不是 mountPaths,並且在容器內部,應用程式將在該路徑看到裝置,而不是掛載的檔案系統。

應用程式開啟、讀取和寫入容器內部的裝置節點,就像它們在非容器化或虛擬化環境中與系統上的任何區塊裝置互動一樣。

建立新的原始區塊 PVC

首先,確保與您選擇的儲存類別關聯的佈建器是支援原始區塊的佈建器。然後建立 PVC。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Block
  storageClassName: my-sc
  resources:
    requests:
    storage: 1Gi

使用原始區塊 PVC

當您在 Pod 定義中使用 PVC 時,您可以選擇區塊裝置的裝置路徑,而不是檔案系統的掛載路徑。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: busybox
      command:
        - sleep
        - “3600”
      volumeDevices:
        - devicePath: /dev/block
          name: my-volume
      imagePullPolicy: IfNotPresent
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: my-pvc

作為儲存供應商,我如何將原始區塊裝置的支援新增至我的 CSI 外掛程式?

CSI 外掛程式的原始區塊支援仍處於 Alpha 階段,但今天可以新增支援。CSI 規格 詳細說明如何處理對具有 BlockVolume 功能而不是 MountVolume 功能的磁碟區的要求。CSI 外掛程式可以同時支援這兩種磁碟區類型,或僅支援其中一種。如需更多詳細資訊,請參閱此處的文件

問題/注意事項

由於區塊裝置實際上是裝置,因此可以從容器內部對它們執行低階動作,這對於檔案系統磁碟區來說是不可能的。例如,實際上是 SCSI 磁碟的區塊裝置支援使用 Linux ioctl 將 SCSI 命令傳送到裝置。

但是,預設情況下,Linux 不允許容器從容器內部將 SCSI 命令傳送到磁碟。為了這樣做,您必須將 SYS_RAWIO 功能授予容器安全性內容才能允許這樣做。請參閱此處的文件。

此外,雖然 Kubernetes 保證將區塊裝置交付到容器,但不保證它實際上是 SCSI 磁碟或任何其他類型的磁碟。使用者必須確保他的 Pod 使用所需的磁碟類型,或者僅部署可以處理各種區塊裝置類型的應用程式。

如何瞭解更多資訊?

請在此處查看有關快照功能的其他文件:原始區塊磁碟區支援

如何參與?

加入 Kubernetes 儲存 SIG 和 CSI 社群,並協助我們新增更多強大的功能並改進現有的功能,例如原始區塊儲存!

https://github.com/kubernetes/community/tree/master/sig-storage https://github.com/container-storage-interface/community/blob/master/README.md

特別感謝所有協助將區塊磁碟區支援新增至 Kubernetes 的貢獻者,包括