做者: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
有些专门的应用程序须要直接访问块设备,例如,文件系统层会引入没必要要的开销。最多见的状况是数据库,它们更喜欢直接在底层存储上组织数据。裸盘设备也经常使用于任何自己实现某种存储服务的软件(软件定义的存储系统)。数据库
从程序员的角度来看,块设备是一个很是大的字节数组,一般具备一些最小的读写粒度,一般为512字节,但更常见为4K或更大。api
随着在Kubernetes内部运行数据库软件和存储基础架构软件变得愈来愈广泛,Kubernetes中对裸盘设备支持的需求变得更加剧要。数组
在发布此博客时,如下树内(in-tree)卷类型支持裸盘:安全
树外(Out-of-tree)CSI卷驱动程序也能够支持裸盘。 Kubernetes CSI对裸盘的支持目前是alpha。请参阅此处的文档。网络
裸盘与普通卷有不少共同点。二者都是经过建立绑定到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。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteMany volumeMode: Block storageClassName: my-sc resources: requests: storage: 1Gi
在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插件对裸盘支持仍然是alpha,但今天能够添加支持。CSI规范详细说明了如何处理具备BlockVolume功能而不是MountVolume功能的卷请求。CSI插件能够支持这两种卷。有关更多详细信息,请参阅此处。
由于块设备其实是设备,因此能够从容器内部对它们执行低级操做,这是文件系统卷没法实现的。例如,其实是SCSI磁盘的块设备支持使用Linux ioctls向设备发送SCSI命令。
默认状况下,Linux不容许容器将SCSI命令从容器内部发送到磁盘。为此,你必须将SYS_RAWIO功能授予容器安全上下文(context)以容许此操做。请参阅此处的文档。
此外,虽然Kubernetes保证向容器提供块设备,但不能保证它其实是SCSI磁盘或任何其余类型的磁盘。用户必须确保所需的磁盘类型与其pod一块儿使用,或者仅部署可处理各类块设备类型的应用程序。
在此处查看有关快照功能的其余文档。
加入Kubernetes存储SIG和CSI社区,帮助咱们添加更多优秀功能,并改进现有功能如裸盘存储!
特别感谢帮助Kubernetes增长块卷支持的全部贡献者,包括:
KubeCon + CloudNativeCon和Open Source Summit大会日期:
KubeCon + CloudNativeCon和Open Source Summit赞助方案
KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请
KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国
KubeCon + CloudNativeCon和Open Source Summit购票窗口,当即购票!