《做一个不背锅运维:理论篇:让我们一起鲁克鲁克——rook(开源存储编排)》

发布时间 2023-03-30 22:50:27作者: 不背锅运维

写在开篇

本文结合了官方文档对rook的知识点做了一个梳理,帮助有需要的朋友快速入门,本篇不讲实战操作,下篇再讲。

什么叫面向K8S的开源云原生存储

面向Kubernetes的开源云原生存储通常是指支持Kubernetes本地对象存储API的存储解决方案,以满足容器化应用程序的存储需求。这些解决方案可以使用Kubernetes内置的存储资源对象,例如PV(Persistent Volume)和PVC(Persistent Volume Claim),这使得管理存储资源变得更加容易和标准化。

一些主要的面向Kubernetes的开源云原生存储解决方案包括:

  1. Rook:这是一个开源的存储编排系统,它将Ceph、NFS、iSCSI等存储系统转化为Kubernetes上的资源,使得它们可以被动态管理和调度。
  2. OpenEBS:这是一个开源的块存储解决方案,它使用Kubernetes原生的API来提供弹性块存储。OpenEBS支持多种存储引擎,例如ZFS、Ceph等。
  3. Longhorn:这是一个开源的分布式块存储系统,它使用Kubernetes原生的API来提供高可用性、可扩展性和持久性的块存储。Longhorn使用Raft算法来提供高可用性,并使用快照和增量备份来提供持久性。
  4. Ceph:这是一个开源的分布式存储系统,它支持块存储、文件存储和对象存储,并可以与Kubernetes集成。Ceph支持多个存储协议,例如RADOS、RBD、CephFS等。

这些解决方案都使用了开源技术,并在Kubernetes上提供可靠的云原生存储。根据应用程序的需求,可以选择适合自己的存储解决方案。

Rook是什么

Rook 是一款开源的云原生存储编排器,可以帮助在Kubernetes上部署和管理Ceph集群,使得Ceph更容易地与Kubernetes集成。简而言之,Rook是一种在Kubernetes上运行Ceph的工具。

图片

当 Rook 部署在 Kubernetes 中时,它会自动部署一个 Ceph 集群。这个 Ceph 集群将会由若干个 Ceph Mon 节点和若干个 Ceph OSD 节点组成。Ceph Mon 节点主要负责元数据的管理和监控,Ceph OSD 节点主要负责数据存储和恢复。

在 Kubernetes 中使用 Rook 管理存储时,我们需要创建 Kubernetes 对象(例如 PVC 和 StorageClass),这些对象通过 Rook Operator 转换为 Ceph 对象(例如 RBD 和 CephFS),然后 Rook Operator 会自动将 Ceph 对象转换为 Ceph 集群的配置文件,最后将这些配置文件应用到 Ceph 集群中。

当我们使用 Kubernetes 客户端来创建 PVC 时,Kubernetes 会调用 Rook 提供的 CSI 驱动程序来为 PVC 创建一个 RBD 卷。这个 RBD 卷实际上是由 Rook 创建的 Ceph RBD 卷,并被挂载到了目标 Pod 中。同时,Rook 还会自动将 Ceph RBD 卷的映射信息保存在 Kubernetes 的 PV 中,以便于后续的使用。

Rook 和 Ceph 部署到 Kubernetes 中后,Rook 会将 Kubernetes 对象转换为 Ceph 对象,并管理 Ceph 集群的创建、配置和维护。Kubernetes 利用 Rook 提供的 CSI 驱动程序,将 PVC 转换为 Ceph RBD 卷,并将这些卷与 Pod 进行绑定。

测试环境规划

以下是在我准备好的k8s环境上对ceph osd做的规划:

主机名 IP 角色 数据磁盘
k8s-b-master 192.168.11.7 k8s master
k8s-b-node01 192.168.11.8 k8s worker、ceph osd 5个1TB硬盘
k8s-b-node02 192.168.11.9 k8s worker、ceph osd 5个1TB硬盘

在一个由1个master节点和2个worker节点组成的Kubernetes集群上使用Rook作为后端存储管理器来运行Ceph集群,对于OSD节点的规划,可以有两种方案:

  • 「方案一:」 想要在每个worker节点上运行osd,那么需要在每个worker节点上都安装有足够的磁盘用于存储Ceph OSD。每个节点上的磁盘数量和大小取决于你的应用程序和负载,可以根据需要进行规划。

    需要注意的是,当OSD和K8S工作节点共用且是生产级别的 Ceph 集群时,至少需要3个K8S工作节点来提供足够的资源支持 Ceph OSD 容器的运行。同时,还需要在 K8S 集群中部署足够数量的 Ceph Monitor 节点来提供元数据管理和监控,以确保在单个节点出现故障时集群不会收到影响,从而实现高可用性和容错性。总之,具体的规划方案取决于实际的需求和资源限制,我的是本地测试环境,所以目前就先给到2个工作节点。

  • 「方案二:」 另一种选择是将osd放置在一个独立的节点上,而不是在每个worker节点上运行一个osd。这个节点可以是另一台服务器或云虚拟机,也可以是一个专门的存储节点,这样可以将osd从计算节点中分离出来,减轻计算节点的负载。这时候就要在该服务器上安装并配置Ceph。可以在OSD节点上运行ceph-osd命令,并将该节点的IP地址和端口添加到Ceph集群中。然后,可以在Rook的cluster.yaml中指定该OSD节点的名称和其他详细信息,以便Rook可以管理该节点。在这种情况下,需要确保在Rook和Ceph之间正确配置网络连接以便通信。

先决条件

  1. 要确保已经有一个准备好的 Kubernetes 集群(还没有准备好环境的朋友,速度搞起来)
  2. Rook 支持最低版本Kubernetes v1.19 或更高版本
  3. 要配置 Ceph 存储集群,至少需要以下一种本地存储类型:
    • 原始设备(无分区或格式化文件系统)
    • 原始分区(无格式化文件系统)
    • LVM 逻辑卷(无格式化文件系统)
    • 存储类中可用的持久化卷以块设备方式访问(也就是说需要有一个支持以块设备方式访问数据的存储类,并且其中需要有可用的持久化卷(Persistent Volumes)供应用程序使用。)

关于更多先决条件请参考:https://rook.io/docs/rook/v1.10/Getting-Started/Prerequisites/prerequisites/#lvm-package

部署前的考虑

  1. 关于rook的operator.yaml中的 设备发现 的参数 "ROOK_ENABLE_DISCOVERY_DAEMON" 参数
  • 场景1: 如果仅打算使用 StorageClassDeviceSets 和 PVCs 来创建 OSDs,则不需要运行探索守护进程。这是因为使用 PVCs 创建 OSDs 可以直接指定存储设备的节点和名称,而不需要依赖探索守护进程来发现它们,所以就可以禁用发现功能,默认就是false。
  • 场景2: 如果需要使用其他 Rook 功能,例如自动添加新节点或自动发现和添加新的 Ceph 存储服务,则需要启用探索守护进程并设置 ROOK_ENABLE_DISCOVERY_DAEMON 参数为 true。

StorageClassDeviceSets 是 Kubernetes 存储资源模型的扩展,它允许管理员将节点上的物理存储设备映射为 Kubernetes 中的持久卷。这使得 Kubernetes 集群中的应用程序可以通过 PVC 访问节点上的物理存储设备,从而实现本地持久化存储。StorageClassDeviceSets 是通过使用 Rook 存储运营商(operator)实现的,它允许管理员将存储设备定义为 StorageClassDeviceSets 资源,并将其绑定到 Kubernetes 集群中的节点。在这种情况下,每个 StorageClassDeviceSets 对象表示一组存储设备,这些设备可以用于创建 PV,并绑定到 PVC 上。在使用 StorageClassDeviceSets 创建 PV 时,管理员可以指定存储设备的数量和类型。Rook operator 将会自动在集群中的节点上查找符合要求的存储设备,并创建相应的 PV。当 PVC 与 PV 绑定时,应用程序可以使用相应的 PV 来持久化数据。使用 StorageClassDeviceSets 可以简化 Kubernetes 存储的管理和部署,特别是对于需要使用本地持久化存储的应用程序来说。Rook 官方文档提供了更详细的使用说明和示例。

  1. 如果要启用或禁用某些 Rook 的功能,还可以继续在operator.yaml中设置,每一项设置都有说明,如没有特殊需求保持默认即可。
  2. 关于Rook中的CSI驱动程序 在Kubernetes中使用Rook作为存储管理器时,Rook已经提供了CSI驱动程序,因此不需要单独安装CSI驱动程序。但是,需要将CSI驱动程序的相关信息配置到Kubernetes集群中。这涉及到定义存储类(StorageClass),该存储类与Rook的CSI驱动程序关联,并指定相关的参数,如存储后端类型、访问模式等。这样,Kubernetes就可以通过CSI驱动程序与Rook集群建立联系,并动态地为应用程序提供所需的存储资源。
  3. 如果想将Rook部署到其它命名空间,可以通过修改Rook部署清单中的命名空间字段来实现,比如crds.yaml、common.yaml、operator.yaml、cluster.yaml、psp.yaml中的namespace字段,在这些文件中,只需要将所有的命名空间名称都改为想要的名称就可以了。

清单文件

Rook是一个开源的云原生存储编排器,它可以在Kubernetes集群中自动化地部署、管理和扩展存储系统。Rook使用一个名为"清单文件"的Kubernetes YAML文件,用于定义和配置Rook存储集群。清单文件是一种声明式的方式来描述Kubernetes对象的配置和状态,可以用于创建、更新或删除Kubernetes对象。

在Rook中,清单文件包含了用于创建和管理存储集群的各种资源和配置,例如存储池、存储类、卷声明和守护进程等。使用清单文件可以方便地管理和自动化存储集群的创建和配置,同时也能够确保存储集群的一致性和可重复性。

通过清单文件,Rook可以将存储系统的部署和管理与Kubernetes的API对象进行集成,使得存储集群可以像其他Kubernetes对象一样进行部署和管理,从而简化了存储系统的操作和维护。

下面列出了常用的清单文件:

  1. crds.yaml:该文件包含Rook所需的所有自定义资源定义(CRDs),用于定义Rook集群中的各种资源对象,例如Pool、Volume、Object Store等。这些CRDs允许用户通过Kubernetes API创建、删除、更新和查看这些资源对象。
  2. common.yaml:该文件包含了Rook的公共配置,包括用于创建命名空间、服务账户、RBAC规则等的配置。
  3. operator.yaml:该文件包含了Rook操作员的清单,它是一个Kubernetes控制器,用于监控Rook集群的各种资源对象,例如CRDs,然后根据需要创建、更新和删除它们。
  4. cluster.yaml:该文件包含了Rook存储集群的清单,用于定义存储集群的各种属性,例如存储池、存储节点、副本数等。
  5. psp.yaml:该文件包含了Rook使用的安全策略(Pod Security Policy),用于限制Pod可以使用的安全特权和访问权限,从而提高系统的安全性。

这些清单文件是Rook安装和配置的重要组成部分,需要根据自己的需要和环境来修改和使用这些文件。在部署Rook集群时,通常需要使用这些清单文件来创建自定义资源定义、服务账户、角色和权限、存储集群等各种资源对象。

除了上述提到的清单文件,Rook还包含一些其他的清单文件,这些文件包含了一些其他的配置和资源定义,例如:

  1. toolbox.yaml:该文件包含了Rook提供的调试和维护工具的清单,可以通过这些工具来检查集群的健康状态、执行各种操作和任务,例如修复OSD、清理数据等。
  2. external-cluster.yaml:该文件包含了Rook与外部Ceph集群集成所需的配置信息和资源定义,可以使用该文件将Rook连接到已有的Ceph集群上,从而利用Rook提供的管理和监控功能。
  3. rbd-storageclass.yaml:该文件包含了用于创建基于RBD卷的Kubernetes存储类的清单,可以使用该存储类来创建、管理RBD存储卷,以及定义RBD卷的各种属性和参数。
  4. csi-rbdplugin.yaml:该文件包含了CSI RBD插件的清单,用于在Kubernetes集群中为RBD卷提供CSI驱动程序,从而支持Kubernetes的CSI存储接口。

这些清单文件可以根据需要进行修改和使用,以实现不同的配置和功能需求。在使用Rook时,可以根据自己的实际需求选择适合自己的清单文件进行使用和部署。

部署思路

下面对在K8S集群中使用Rook来创建Ceph集群的步骤做一个概述:

  1. 部署Rook Operator 在Kubernetes集群中部署Rook Operator,可以通过使用Helm Chart或kubectl命令来实现。Rook Operator是一个控制器,它可以在Kubernetes集群中管理Ceph集群的创建和配置。
  2. 创建Ceph Cluster 创建一个名为ceph-cluster.yaml的清单文件,其中包含有关Ceph集群的配置信息,例如Ceph mon、Ceph OSD、Ceph MGR和Ceph RGW的数量、存储池配置等等。清单文件的格式应符合Kubernetes YAML格式。
  3. 创建存储类 在Kubernetes集群中创建一个存储类,该存储类使用Ceph集群提供的存储。可以通过创建一个名为ceph-storageclass.yaml的清单文件,其中包含关于存储类的配置信息,例如存储池、存储类名称等等。清单文件的格式应符合Kubernetes YAML格式。
  4. 创建块存储 使用存储类创建一个块存储,以供Pod使用。可以通过在Pod的卷声明中指定存储类来创建块存储。在使用块存储之前,需要先将其格式化并挂载到Pod中。

通过这些步骤,可以使用Rook在Kubernetes集群中创建一个Ceph集群,并将其作为Kubernetes存储类提供给Pod使用。Rook提供了许多其他的功能和配置选项,可以根据需要进行修改和扩展。

后面会实战的三种存储类型

  • 块:创建一个块存储,以供一个Pod使用
  • 共享文件系统:创建要在多个 Pod 之间共享的文件系统
  • 对象:创建可在 K8S 集群内部或外部访问的对象存储

本文转载于WX公众号:不背锅运维(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/MhR64q_LARDV31x4gfS5ow