Kubernetes v1.13對裸盤支持轉移到beta

做者:Ben Swartzlander(NetApp),Saad Ali(谷歌)html

Kubernetes v1.13將裸盤(raw block volume)支持轉移到beta。此功能容許持久卷(persistent volume)做爲塊設備(block device),而不是做爲已安裝的文件系統在容器內部公開。linux

什麼是塊設備?

塊設備容許隨機訪問固定大小的塊中的數據。硬盤驅動器、SSD和CD-ROM驅動器都是塊設備的示例。git

持久存儲一般以分層方式實現,在塊設備(如旋轉磁盤或SSD)之上使用文件系統(如ext4)。而後,應用程序讀取和寫入文件,而不是在塊上操做。操做系統負責使用指定的文件系統,將文件做爲塊讀取和寫入底層設備。程序員

值得注意的是,整個磁盤都是塊設備,磁盤分區也是,存儲區域網絡(SAN)設備的LUN也是。github

爲何要將裸盤添加到kubernetes?

有些專門的應用程序須要直接訪問塊設備,例如,文件系統層會引入沒必要要的開銷。最多見的狀況是數據庫,它們更喜歡直接在底層存儲上組織數據。裸盤設備也經常使用於任何自己實現某種存儲服務的軟件(軟件定義的存儲系統)。數據庫

從程序員的角度來看,塊設備是一個很是大的字節數組,一般具備一些最小的讀寫粒度,一般爲512字節,但更常見爲4K或更大。api

隨着在Kubernetes內部運行數據庫軟件和存儲基礎架構軟件變得愈來愈廣泛,Kubernetes中對裸盤設備支持的需求變得更加劇要。數組

哪一個卷插件支持裸盤?

在發佈此博客時,如下樹內(in-tree)卷類型支持裸盤:安全

  • AWS EBS
  • Azure Disk
  • Cinder
  • Fibre Channel
  • GCE PD
  • iSCSI
  • Local volumes
  • RBD (Ceph)
  • Vsphere

樹外(Out-of-tree)CSI卷驅動程序也能夠支持裸盤。 Kubernetes CSI對裸盤的支持目前是alpha。請參閱此處的文檔。網絡

Kubernetes裸盤API

裸盤與普通卷有不少共同點。二者都是經過建立綁定到PersistentVolume對象的PersistentVolumeClaim對象來請求的,並經過將它們包含在PodSpec的volumes數組中而附加到Kubernetes中的Pod。

可是有兩個重要的區別。首先,要請求裸盤PersistentVolumeClaim,必須在PersistentVolumeClaimSpec中設置volumeMode =「Block」。將volumeMode留空與指定volumeMode =「Filesystem」相同,這會致使傳統行爲。PersistentVolumes在其PersistentVolumeSpec中也有一個volumeMode字段,而「Block」類型的PVC只能綁定到「Block」類型的PV,而「Filesystem」PVC只能綁定到「Filesystem」PV。

其次,在Pods中使用裸盤時,必須在PodSpec的Container部分而不是VolumeMount中指定VolumeDevice。VolumeDevices具備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 ioctls向設備發送SCSI命令。

默認狀況下,Linux不容許容器將SCSI命令從容器內部發送到磁盤。爲此,你必須將SYS_RAWIO功能授予容器安全上下文(context)以容許此操做。請參閱此處的文檔。

此外,雖然Kubernetes保證向容器提供塊設備,但不能保證它其實是SCSI磁盤或任何其餘類型的磁盤。用戶必須確保所需的磁盤類型與其pod一塊兒使用,或者僅部署可處理各類塊設備類型的應用程序。

怎樣能瞭解更多?

此處查看有關快照功能的其餘文檔。

我如何參與?

加入Kubernetes存儲SIGCSI社區,幫助咱們添加更多優秀功能,並改進現有功能如裸盤存儲!

鳴謝

特別感謝幫助Kubernetes增長塊卷支持的全部貢獻者,包括:


圖片描述

KubeCon + CloudNativeCon和Open Source Summit大會日期:

  • 會議日程通告日期:2019 年 4 月 10 日
  • 會議活動舉辦日期:2019 年 6 月 24 至 26 日

KubeCon + CloudNativeCon和Open Source Summit贊助方案
KubeCon + CloudNativeCon和Open Source Summit多元化獎學金現正接受申請
KubeCon + CloudNativeCon和Open Source Summit即將首次合體落地中國
KubeCon + CloudNativeCon和Open Source Summit購票窗口,當即購票!

相關文章
相關標籤/搜索