写点什么

Kubernetes 版本对接对象存储

作者:琦彦
  • 2022 年 7 月 24 日
  • 本文字数:1936 字

    阅读完需:约 6 分钟

Kubernetes版本对接对象存储

对象存储

想要通过创建 PersistentVolume(PV)/PersistentVolumeClaim(PVC),并为工作负载挂载数据卷的方式使用云对象存储 COS


对于对象存储,在 k8s 中不需要 PV/PVC 来做资源抽象,应用可以直接访问和使用,如果需要在 k8s 支持访问,就需要相应的 csi 插件,支持对象存储转成文件存储例如: 几个大厂的方式阿里:https://help.aliyun.com/document_detail/130911.html腾讯:https://cloud.tencent.com/document/product/457/44232华为:https://support.huaweicloud.com/intl/zh-cn/usermanual-cce/cce_01_0267.html


如果对接文件存储,可以使用使用 S3fs 可以把 Bucket 当成一个文件夹挂载到 Linux 系统内部,当成一个系统文件夹使用。

社区方案

方案 1:Object Storage API (COSI)

目前开发中,不成熟


官方文档

https://container-object-storage-interface.github.io/docs/

https://container-object-storage-interface.github.io/

https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/1979-object-storage-support#provisionergetinfo

Kubernetes v1.23 正式发布,有哪些增强?


Kubernetes 现在对文件和块存储都有了较好的扩展支持 (CSI),但是这些并不能很好的支持对象存储,原因如下:


  • oss 以桶 (bucket) 来组织分配存储单元而不是文件系统挂载或是块设备

  • oss 服务的访问是通过网络调用而不是本地的 POSIX 调用

  • oss 不试用 csi 定义的 Attach/Detach 逻辑 (无需挂载/卸载)


COSI 是关于如何为容器化的工作负载 (Pod) 提供对象存储服务 (oss) 的标准协议。与 csi 和 cni 类似,Kubernetes 旨在通过定义一些标准的接口与第三方 oss 服务提供方解耦。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJJmj72m-1651055590510)(https://cdn.jsdelivr.net/gh/Fly0905/note-picture@main/img/202204252104317.jpeg)]

方案2:csi-s3

可以使用,但需要多测试


官方文档

https://github.com/CTrox/csi-s3

https://github.com/majst01/csi-driver-s3

使用s3(minio)为kubernetes提供pv存储

Kubernetes 要求

  • Kubernetes 1.13+(CSI v1.0.0 兼容性)

  • <font color=red>Kubernetes 必须允许特权容器</font>

  • Docker 守护进程必须允许共享挂载(systemd 标志MountFlags=shared

  • <font color=red>是非常实验性的,还未在任何生产环境中使用。根据使用的挂载程序和 S3 存储后端,可能会发生意外的数据丢失。</font>

MountFlags

在 18.09 之前的 Docker 版本中,containerd 由 Docker 引擎守护进程管理。


在 Docker Engine 18.09 中,containerd 由 systemd 管理。由于 containerd 由 systemd 管理,因此任何docker.service更改挂载设置的 systemd 配置的自定义配置(例如,MountFlags=slave)都会破坏 Docker Engine 守护进程和 containerd 之间的交互,并且您将无法启动容器。


运行以下命令以获取 的MountFlags属性的当前值docker.service


$ sudo systemctl show --property=MountFlags docker.serviceMountFlags=
复制代码


如果此命令为 打印非空值,请更新您的配置MountFlags,然后重新启动 docker 服务。

为什么要将 S3 以文件存储的方式挂载到 Kubernetes 平台?

对于原来使用本地目录访问数据的应用程序,比如使用本地磁盘或网络共享盘保存数据的应用系统,如果用户希望把数据放到 S3 上,则需要修改数据的访问方式,比如修改为使用 SDK 或 CLI 访问 S3 中存储的数据。


同时实现 kubernetes 集群是很多用户的需求,无论是使用托管服务还是自建 kubernetes 集群,存储都是 kubernetes 集群搭建的重点。并且 docker 的部署方式也让客户程序减少了对于底层环境的依赖。为了让用户原来的应用系统能在不做修改的情况下直接使用 S3 服务,需要把 S3 存储桶作为目录挂载到用户 kubernetes 集群中的 worker 节点上


利用 S3fs 将 S3 存储桶在 kubernetes 平台上以sidecar方式挂载到 kubernetes 集群的 worker 实例上的 pod 中,挂载后需要读写此存储桶的 pod 都可以对此桶进行读写,以实现共享存储功能。

什么是 S3FS ?

S3fs 是基于 FUSE 的文件系统,允许 Linux 和 Mac Os X 挂载 S3 的存储桶在本地文件系统,S3fs 能够保持对象原来的格式,S3FS 是 POSIX 的大子集,包括读/写文件、目录、符号链接、模式、uid/gid 和扩展属性,AmazonS3、Google 云存储和其他基于 S3 的对象存储兼容。关于 S3fs 的详细介绍,请参见:https://github.com/s3fs-fuse/s3fs-fuse

后续

  1. 验证特权容器,升级了多少特权

参考链接

  1. 使用s3(minio)为kubernetes提供pv存储

  2. 基于openshift+华为对象存储的CSI开发

  3. 利用 S3FS 将 S3 作为共享存储挂载到 Kubernetes Pod

  4. 使用S3fs在Linux实例上挂载Bucket

  5. S3FS:基于对象存储的文件系统

  6. https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core

  7. https://github.com/FLY-Open-K8s/csi-driver-s3.git

发布于: 2022 年 07 月 24 日阅读数: 49
用户头像

琦彦

关注

孤独的技术没有价值 2019.08.24 加入

还未添加个人简介

评论

发布
暂无评论
Kubernetes版本对接对象存储_对象存储_琦彦_InfoQ写作社区