块设备&K8S持久卷
块设备相关概念,以及K8S如何使用块设备。
·
块设备
块,是指512或4K的数据块。
块设备,就是指数据读写是按块进行的。 相对应的字符设备,其数据读写是按字节进行的。
Ceph块设备
普通块设备,是数据线连接的真实硬盘;
Ceph块设备,是通过网络连接到Ceph集群中的一块存储区域,可以看做一块硬盘。
用户可以直接使用不含文件系统的块设备(裸设备),不经过OS缓存,性能更高,最常见的场景是数据库;也可以将其格式化成特定文件系统格式,由文件系统来组织管理存储空间,为用户提供更易用更丰富的数据读写接口。
K8S创建存储卷
完成流程如下:
- 用户创建了一个包含 PVC 的 Pod,该 PVC 要求使用动态存储卷;
- Scheduler 根据 Pod 配置、节点状态、PV 配置等信息,把 Pod 调度到一个合适的 Worker 节点上;
- PV控制器 watch到该 Pod 使用的 PVC 处于 Pending 状态,于是调用 Volume Plugin(in-tree)创建存储卷,并创建 PV 对象(out-of-tree 由 External Provisioner 来处理);
- AD控制器发现 Pod 和 PVC 处于待挂接状态,于是调用Volume Plugin挂接存储设备到目标 Worker 节点上
- 在 Worker 节点上,Kubelet 中的 Volume Manager 等待存储设备挂接完成,并通过 Volume Plugin 将设备挂载到全局目录:/var/lib/kubelet/pods/[pod uid]/volumes/kubernetes.io~iscsi/[PV name](以 iscsi 为例);
- Kubelet通过 Docker 启动 Pod 的 Containers,用 bind mount 方式将已挂载到本地全局目录的卷映射到容器中。
特别说明:
全局目录(global mount path)存在的目的:块设备在 Linux 上只能挂载一次,而在 K8s 场景中,一个 PV 可能被挂载到同一个 Node 上的多个 Pod 实例中。若块设备格式化后先挂载至 Node 上的一个临时全局目录,然后再使用 Linux 中的 bind mount 技术把这个全局目录挂载进 Pod 中对应的目录上,就可以满足要求。上述流程图中,全局目录即 /var/lib/kubelet/pods/[pod uid]/volumes/kubernetes.io~iscsi/[PV name]
挂载流程:
- 记录RBD镜像元数据信息。比如image使用的池、是否加密等。记录在本地文件中。
- map rbd image。对应rbd map /命令。
- 创建挂载目录。对应mkdir调用。
- 创建设备上的文件系统。mkfs.xfs或者mkfs.ext4程序创建文件系统,如果是裸块类型则该步跳过。
- 挂载块设备。对应mount调用。
相关参考链接,感谢文章作者:
https://blog.csdn.net/weixin_32093689/article/details/112317035
https://www.jianshu.com/p/92d2c31d0f4b
更多推荐
已为社区贡献1条内容
所有评论(0)