摘要:作者,Google 正在将裸磁盘支持转移到 . 目前提供裸磁盘支持。 将其保留为空与指定它相同,并会导致遗留行为。 例如,块设备,实际上是磁盘,支持向设备发送命令。 默认情况下,容器无法从容器内向磁盘发送命令。
作者:Ben Swartzlander (NetApp)、Saad Ali (Google)
Kubernetes v1.13 在测试版 Migrate 中引入了对原始块卷的支持。 此功能允许持久卷在容器内作为块设备而不是作为已安装的文件系统公开。
什么是块设备?
块设备允许您随机访问固定大小的块中的数据。 硬盘驱动器、SSD 和 CD-ROM 驱动器都是块设备的示例。
持久存储通常使用块设备(例如旋转磁盘或 SSD)上的文件系统(例如 ext4)以分层方式实现。 然后应用程序读取和写入文件而不是操作块。 操作系统负责使用指定的文件系统将文件作为块读取和写入到底层设备。
请记住,整个磁盘都是一个块设备,存储区域网络 (SAN) 设备上的磁盘分区和 LUN 也是如此。
为什么要向 Kubernetes 添加裸磁盘?
一些专门的应用程序需要直接访问块设备,例如文件系统层,因此这会产生大量开销。 最常见的情况是数据库,它更喜欢直接在底层存储上组织数据。 裸盘设备也常用于本身实现一些存储服务的软件(软件定义存储系统)。
从程序员的角度来看,块设备是一个非常大的字节数组,通常最小读写粒度为 512 字节,但更常见的是 4K 或更大。
随着在 Kubernetes 中运行数据库和存储基础设施软件变得越来越普遍,在 Kubernetes 中支持裸磁盘设备的需求变得更加重要。
哪些卷插件支持裸磁盘?b>
在发布本博客时,以下 in-tree 卷类型支持裸磁盘:
AWS EBS
Azure 磁盘
Cinder
光纤通道
GCE PD
iSCSI
本地卷
RBD (Ceph)
Vsphere
Out-of-tree CSI 卷驱动程序也可以支持裸磁盘。 Kubernetes CSI 对裸磁盘的支持目前处于 alpha 阶段。 请参阅此处的文档。
Kubernetes 裸磁盘 API
裸磁盘与常规卷有很多共同点。 两者都是通过创建绑定到 PersistentVolume 对象的 PersistentVolumeClaim 对象来请求的,并通过将其包含在 PodSpec 的卷数组中来附加到 Kubernetes 中的 Pod。
但是,有两个重要的区别。 首先,要声明裸磁盘 PersistedVolumeClaim,必须在 PersistentVolumeClaimSpec 中设置volumeMode =“Block”。 将volumeMode 保留为空与指定volumeMode="Filesystem" 相同,这是旧行为。 PersistentVolume 的 Persistent VolumeSpec 也有一个 volumeMode 字段,意味着“block”类型的 PVC 只能绑定到“block”类型的 PV,而“filesystem”PVC 只能绑定到“filesystem”类型的 PV。
其次,如果您的 Pod 使用裸磁盘,则必须在 PodSpec 的 Container 部分中指定 VolumeDevice 而不是 VolumeMount。 VolumeDevices 有 devicePath 而不是 mountPath,在容器内,应用程序看到其路径中的设备,而不是已安装的文件系统。
应用程序打开、读取和写入容器中的设备节点,就像它们与非容器化或虚拟化环境中的系统上的块设备交互一样。
创建新的裸盘PVC
首先,确保与您选择的存储类关联的配置程序是支持裸盘的配置程序。 接下来,创建 PVC。
apiVersion:v1kind:持久 VolumeClaimmetadata:名称:my-pvcspec:accessModes:- ReadWriteManyvolumeMode:块存储类名称:my-sc 资源:请求:存储:1Gi
使用裸磁盘 PVC
在 Pod 定义中使用 PVC 时,您可以选择块设备的设备路径,而不是文件系统的挂载路径。
apiVersion: v1kind: Podmetadata: name: my-podspec:containers: - name: my-container image:busybox command: - sleep - "3600" volumeDevices: - devicePath: /dev/block 名称: my-volume imagePullPolicy: IfNotPresent 卷: - 名称: my-volumepersistentVolumeClaim:claimName:my-pvc
作为存储提供商,如何向 CSI 插件添加对裸磁盘设备的支持?
CSI 插件对裸磁盘的支持仍处于 alpha 阶段,但是您今天就可以添加支持。 CSI 规范详细说明了如何使用 BlockVolume 功能而不是 MountVolume 功能处理卷请求。 CSI 插件可以支持这两种类型的卷。 请参阅此处了解更多信息。
问题/陷阱
块设备实际上是设备,因此您可以在容器内执行低级操作,但这对于文件系统卷来说是不可能的。 例如,实际上是 SCSI 磁盘的块设备支持使用 Linux ioctl 向设备发送 SCSI 命令。
默认情况下,Linux 不允许容器从容器内向磁盘发送 SCSI 命令。 为此,您必须向容器的安全上下文授予 SYS_RAWIO 功能以允许此操作。 请参阅此处的文档。
此外,虽然 Kubernetes 保证向容器提供块设备,但不能保证它实际上是 SCSI 磁盘或任何其他类型的磁盘。 用户应确保其 Pod 使用所需的磁盘类型或仅部署可以处理不同块设备类型的应用程序。
如何了解更多信息?
在此处查看有关快照功能的其他文档。
如何参与?
请加入 Kubernetes 存储 SIG 和 CSI 社区,添加出色的功能并改进现有功能,例如裸磁盘存储。
致谢
我们要感谢所有帮助向 Kubernetes 添加块卷支持的贡献者。
本·斯沃茨兰德 (https://github.com/bswartz) )
布拉德·柴尔兹 (https://github.com/childsb)
艾琳·博伊德(https://github.com/erinboyd)
木村正树(https://gitHub.com/mkimurom)
Matthew Wong(https://github.com/wongma7)
Michelle Oh(https://github.com/msau42)
谷野光宏 (https://github.com/mtanino)
萨阿德·阿里 (https://github.com/saad-ali)
KubeCon + CloudNativeCon 及开源峰会会议日期:
会议日程公布日期:2019 年 4 月 10 日
会议活动日期:2019年6月24-26日
KubeCon + CloudNativeCon及开源峰会赞助计划
KubeCon + CloudNativeCon及开源峰会多元化奖学金现已接受申请
KubeCon + CloudNativeCon 与开源峰会即将在国内首次整合
KubeCon + CloudNativeCon 与开源峰会购票窗口,快来买票吧现在!
评论前必须登录!
注册