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 Container-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 构建云原生存储环境
最后编辑:Jeebiz 更新时间:2024-08-02 14:28