Rook 介绍

Rook 是一个开源的云原生存储编排器,为各种存储解决方案提供平台、框架和支持,以便与云原生环境进行原生集成。

Rook 将分布式存储系统转变为自管理、自扩展、自修复的存储服务。它使存储管理员的部署、引导、配置、配置、扩展、升级、迁移、灾难恢复、监控和资源管理等任务自动化。

简而言之,Rook 就是一组 Kubernetes 的 Operator,它可以完全控制多种数据存储解决方案(例如 Ceph、EdgeFS、Minio、Cassandra)的部署,管理以及自动恢复。

到目前为止,Rook 支持的最稳定的存储仍然是 Ceph,本文将介绍如何使用 Rook 来创建维护 Ceph 集群,并作为 Kubernetes 的持久化存储。

环境准备

Rook 可以安装在任何现有的 Kubernetes 集群上,只要它满足最低版本并且 Rook 被授予所需的权限(有关更多信息,请参见下文)。

最低版本

Ceph 算子支持Kubernetes v1.17或更高版本。

CPU架构

发布的架构是amd64 / x86_64和arm64.

Ceph 先决条件

为了配置 Ceph 存储集群,至少需要以下本地存储选项之一:

  • 原始设备(无分区或格式化文件系统)
  • 原始分区(无格式化文件系统)
  • block模式下存储类中可用的 PV
  • 您可以使用以下命令确认您的分区或设备是否使用文件系统格式化。
$ lsblk -f
NAME                  FSTYPE      LABEL UUID                                   MOUNTPOINT
vda
└─vda1                LVM2_member       >eSO50t-GkUV-YKTH-WsGq-hNJY-eKNf-3i07IB
  ├─ubuntu--vg-root   ext4              c2366f76-6e21-4f10-a8f3-6776212e2fe4   /
  └─ubuntu--vg-swap_1 swap              9492a3dc-ad75-47cd-9596-678e8cf17ff9   [SWAP]
vdb

如果该FSTYPE字段不为空,则在相应设备的顶部有一个文件系统。在这个例子中,你可以使用vdb 而不能使用它的vda分区

Admission Controller

建议启用 Rook 准入控制器以提供额外级别的验证,即 Rook 已使用自定义资源 (CR) 设置正确配置。准入控制器在对象持久化之前截取对 Kubernetes API 服务器的请求,但在请求经过身份验证和授权之后。

要部署 Rook 准入控制器,请在安装 Rook 之前安装证书管理器:

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.7.1/cert-manager.yaml

LVM 包

Ceph OSD 在以下场景中依赖于 LVM:

  • OSD 在原始设备或分区上创建
  • 如果启用了加密(encryptedDevice: “true”在集群 CR 中)
  • 指定了一个metadata设备

在这些情况下,OSD 不需要 LVM:

  • 使用storageClassDeviceSets

如果您的方案需要 LVM,则 LVM 需要在将运行 OSD 的主机上可用。某些 Linux 发行版不附带该lvm2软件包。在你的 k8s 集群中的所有存储节点上都需要这个包来运行 Ceph OSD。如果没有这个包,即使 Rook 能够成功创建 Ceph OSD,当节点重新启动时,在重新启动的节点上运行的 OSD pod 也将无法启动。请使用您的 Linux 发行版的包管理器安装 LVM。例如:
CentOS:

sudo yum install -y lvm2

Ubuntu:

sudo apt-get install -y lvm2

核心

RBD

Ceph 需要使用 RBD 模块构建的 Linux 内核。许多 Linux 发行版都有这个模块,但不是所有发行版都有。例如,GKE Con​​tainer-Optimized OS (COS) 没有 RBD。

您可以通过运行来测试您的 Kubernetes 节点modprobe rbd。如果它显示“未找到”,您可能必须重新构建内核并至少包含该rbd模块或选择不同的 Linux 发行版。

CephFS

如果您要从 Ceph 共享文件系统 (CephFS) 创建卷,建议的最低内核版本为4.17。如果您的内核版本低于 4.17,则不会强制执行请求的 PVC 大小。存储配额只会在较新的内核上实施。

快速开始

初始化集群

可以使用以下 kubectl 命令和示例清单创建一个简单的 Rook 集群。

$ git clone --single-branch --branch master https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
# 说明:
# 1.common.yaml里面主要是权限控制以及CRD资源定义
# 2.operator.yaml是rook-ceph-operator的deloyment
kubectl create -f cluster.yaml
# 重要说明:
# 不做定制化操作,Ceph集群默认会动态去识别node节点上未格式化的全新空闲硬盘,自动会对这些盘进行OSD初始化(至少是需要3个节点,每个节点至少一块空闲硬盘)

集群运行后,您可以创建块、对象或文件存储以供集群中的其他应用程序使用。

在继续之前,验证rook-ceph-operator是否处于“运行”状态

$ kubectl -n rook-ceph get pod
NAME                                                 READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-provisioner-d77bb49c6-n5tgs         5/5     Running     0          140s
csi-cephfsplugin-provisioner-d77bb49c6-v9rvn         5/5     Running     0          140s
csi-cephfsplugin-rthrp                               3/3     Running     0          140s
csi-rbdplugin-hbsm7                                  3/3     Running     0          140s
csi-rbdplugin-provisioner-5b5cd64fd-nvk6c            6/6     Running     0          140s
csi-rbdplugin-provisioner-5b5cd64fd-q7bxl            6/6     Running     0          140s
rook-ceph-crashcollector-minikube-5b57b7c5d4-hfldl   1/1     Running     0          105s
rook-ceph-mgr-a-64cd7cdf54-j8b5p                     1/1     Running     0          77s
rook-ceph-mon-a-694bb7987d-fp9w7                     1/1     Running     0          105s
rook-ceph-mon-b-856fdd5cb9-5h2qk                     1/1     Running     0          94s
rook-ceph-mon-c-57545897fc-j576h                     1/1     Running     0          85s
rook-ceph-operator-85f5b946bd-s8grz                  1/1     Running     0          92m
rook-ceph-osd-0-6bb747b6c5-lnvb6                     1/1     Running     0          23s
rook-ceph-osd-1-7f67f9646d-44p7v                     1/1     Running     0          24s
rook-ceph-osd-2-6cd4b776ff-v4d68                     1/1     Running     0          25s
rook-ceph-osd-prepare-node1-vx2rz                    0/2     Completed   0          60s
rook-ceph-osd-prepare-node2-ab3fd                    0/2     Completed   0          60s
rook-ceph-osd-prepare-node3-w4xyz                    0/2     Completed   0          60s
  • 如果遇到镜像拉取失败,修改镜像地址 *

也可以使用 lank8s.cn,他们的对应关系 k8s.gcr.io –> lank8s.cn,gcr.io –> gcr.lank8s.cn

docker pull k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
# 换成
docker pull registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.3.0

也可以使用 lank8s.cn,他们的对应关系 k8s.gcr.io –> lank8s.cn,gcr.io –> gcr.lank8s.cn

docker pull k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
# 换成
docker pull lank8s.cn/sig-storage/csi-node-driver-registrar:v2.3.0

配置 Ceph 集群 dashboard

Ceph Dashboard 是一个内置的基于 Web 的管理和监视应用程序,它是开源 Ceph 发行版的一部分。通过 Dashboard 可以获取 Ceph 集群的各种基本状态信息。

默认的 ceph 已经安装的 ceph-dashboard,其 SVC 地址是 service clusterIP,并不能被外部访问,需要创建 service 服务

$ kubectl apply -f dashboard-external-http.yaml
apiVersion: v1
kind: Service
metadata:
  name: rook-ceph-mgr-dashboard-external-https
  namespace: rook-ceph # namespace:cluster
  labels:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph # namespace:cluster
spec:
  ports:
    - name: dashboard
      port: 8443
      protocol: TCP
      targetPort: 8443
  selector:
    app: rook-ceph-mgr
    rook_cluster: rook-ceph
  sessionAffinity: None
  type: NodePort

访问方式:

http://{master1-ip:NodePort}

密码获取方法:

 kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"|base64 --decode && echo

图片

部署 rook 工具箱

rook 工具箱可以作为部署在 Kubernetes 集群中运行,您可以在其中连接和运行任意 Ceph 命令。

启动 rook-ceph-tools pod:

kubectl create -f deploy/examples/toolbox.yaml

等待工具箱 pod 下载其容器并进入running状态:

kubectl -n rook-ceph rollout status deploy/rook-ceph-tools

rook-ceph-tools pod 运行后,您可以通过以下方式连接到它:

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

工具箱中的所有可用工具都可以满足您的故障排除需求。

示例:

ceph status
ceph osd status
ceph df
rados df

要验证集群是否处于健康状态,连接到Rook 工具箱并运行ceph status命令。

  • 所有的mon都应该是活跃的
  • mgr应该是活跃的
  • 至少一个 OSD 应该处于活动状态
  • 如果健康状况不佳HEALTH_OK,则应调查警告或错误
$ ceph status
  cluster:
    id:     a0452c76-30d9-4c1a-a948-5d8405f19a7c
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum a,b,c (age 3m)
    mgr: a(active, since 2m)
    osd: 3 osds: 3 up (since 1m), 3 in (since 1m)
[]...]

部署 StorageClass

创建文件系统

CephFilesystem通过为CRD中的元数据池、数据池和元数据服务器指定所需的设置来创建文件系统。在此示例中,我们创建了具有三个复制的元数据池和一个具有三个复制的单个数据池。有关更多选项,请参阅有关创建共享文件系统的文档。

将此共享文件系统定义保存为filesystem.yaml

apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: myfs
  namespace: rook-ceph
spec:
  metadataPool:
    replicated:
      size: 3
  dataPools:
    - name: replicated
      replicated:
        size: 3
  preserveFilesystemOnDelete: true
  metadataServer:
    activeCount: 1
    activeStandby: true

Rook 操作员将创建启动服务所需的所有池和其他资源。这可能需要一分钟才能完成。

kubectl create -f deploy/examples/filesystem.yaml

要确认文件系统已配置,请等待 mds pod 启动:

$ kubectl -n rook-ceph get pod -l app=rook-ceph-mds
NAME                                      READY     STATUS    RESTARTS   AGE
rook-ceph-mds-myfs-7d59fdfcf4-h8kw9       1/1       Running   0          12s
rook-ceph-mds-myfs-7d59fdfcf4-kgkjp       1/1       Running   0          12s

配置存储

在 Rook 开始配置存储之前,需要基于文件系统创建一个 StorageClass。这是 Kubernetes 与 CSI 驱动程序互操作以创建持久卷所必需的。

将此存储类定义另存为storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-cephfs
# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
  # clusterID is the namespace where the rook cluster is running
  # If you change this namespace, also change the namespace below where the secret namespaces are defined
  clusterID: rook-ceph

  # CephFS filesystem name into which the volume shall be created
  fsName: myfs

  # Ceph pool into which the volume shall be created
  # Required for provisionVolume: "true"
  pool: myfs-replicated

  # The secrets contain Ceph admin credentials. These are generated automatically by the operator
  # in the same namespace as the cluster.
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph

reclaimPolicy: Delete

如果您已将 Rook 运算符部署在“rook-ceph”以外的命名空间中,通常更改配置器中的前缀以匹配您使用的命名空间。例如,如果 Rook 操作符在“rook-op”中运行,则配置器值应该是“rook-op.rbd.csi.ceph.com”。

创建存储类。

kubectl create -f deploy/examples/csi/cephfs/storageclass.yaml

使用共享文件系统:K8s Registry 示例

kubectl create -f deploy/examples/csi/cephfs/kube-registry.yaml

您现在有一个 docker 注册表,它是具有持久存储的 HA。

参考链接

在 Kubernetes 中使用 Rook 构建云原生存储环境

rook官网

完美解决 gcr.io 镜像下载失败的 4 种方法

作者:Jeebiz  创建时间:2023-11-22 12:51
最后编辑:Jeebiz  更新时间:2024-08-02 14:28