Rook是一款用于将Ceph部署到Kubernetes集群中的工具。
目录
环境信息
- kubernetes: v1.23.5
- rook: v1.11.1
目前rook最新版为v1.11.1,支持kubernetes v1.21及以上版本
部署要求
osd节点需要准备好数据盘
#数据盘可以是一块硬盘sdb,也可以是硬盘的一个分区sdb2,或者是逻辑卷,但是这些都必须没有被格式过,没有指定文件系统类型。
#可以使用lsblk -f 来确认数据盘有没有被文件系统格式化过。FSTYPE字段为空即代表未被文件系统格式化过。
#如下所示,vdb可以作为ceph的数据盘。
[root@master ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0 iso9660 config-2 2023-05-08-09-42-28-00
vda
├─vda1 xfs 624b9bfb-904e-4d69-b7e0-cf598f443497 /boot
└─vda2 xfs 974b2a82-1668-42c8-a4b6-bb1d24eada2f /
vdb
下载LVM2
#Ceph OSD 在某些情况下(比如启用加密或指定元数据设备)依赖于 LVM(Logical Volume Manager)。如果没有安装 LVM2 软件包,则虽然 Rook 可以成功创建 Ceph OSD,但是当节点重新启动时,重新启动的节点上运行的 OSD pod 将无法启动。
yum -y install lvm2
加载rbd内核
#Ceph 存储需要包含了 RBD 模块的 Linux 内核来支持。在使用 Kubernetes 环境中运行 Ceph 存储之前,需要在 Kubernetes 节点上运行 modprobe rbd 命令来测试当前内核中是否已经加载了 RBD 内核。
#查看内核有没有加载rbd模块
#如下所示代表已加载
lsmod | grep rbd
[root@master ~]# lsmod | grep rbd
rbd 83640 0
libceph 306625 1 rbd
#如未加载可手动加载rbd内核模块
modprobe rbd
升级内核
如果需要使用文件存储CephFS,则需要将操作系统内核版本升级到4.17以上。
#查看内核版本
#uname -r
升级到最新稳定版:6.4.6-1.el7.elrepo.x86_64
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum install --enablerepo=elrepo-kernel kernel-ml -y
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-set-default 0
reboot
取消master污点
由于ceph集群默认最小三个节点,当前kubernetes也是三节点,1个master+2个worker,所以需要使用master节点来充当ceph节点,因此需要取消master节点上的污点,否是ceph相关pod无法调度到master节点,导致部署失败。
如果worker节点足够则无需此操作。
#获取 Kubernetes 集群中所有节点的 Taint 信息,输出的格式是 YAML 格式,其中用到了 grep 和 -A 两个命令参数。grep 用于过滤包含字符串 "taint" 的行,-A 参数后面跟的数字表示显示匹配行输出后多少行的内容,因此 -A 5 表示匹配行向下再显示 5 行内容,以显示与 Taint 相关的属性信息。
kubectl get no -o yaml | grep taint -A 5
#默认在master节点上会有名为node-role.kubernetes.io/master-的污点,使用该命令可以取消所有节点上的node-role.kubernetes.io/master-污点
kubectl taint nodes --all node-role.kubernetes.io/master-
下载rook
git clone --single-branch --branch v1.11.5 https://github.com/rook/rook.git
拉取镜像
cd rook/deploy/examples
#查看部署所需要的镜像提前拉取
cat images.txt
rook/ceph:v1.11.5
quay.io/ceph/ceph:v17.2.6
quay.io/cephcsi/cephcsi:v3.8.0
quay.io/csiaddons/k8s-sidecar:v0.5.0
registry.k8s.io/sig-storage/csi-attacher:v4.1.0
registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.7.0
registry.k8s.io/sig-storage/csi-provisioner:v3.4.0
registry.k8s.io/sig-storage/csi-resizer:v1.7.0
registry.k8s.io/sig-storage/csi-snapshotter:v6.2.1
docker pull rook/ceph:v1.11.5
docker pull quay.io/ceph/ceph:v17.2.6
docker pull quay.io/cephcsi/cephcsi:v3.8.0
docker pull quay.io/csiaddons/k8s-sidecar:v0.5.0
#如果拉不下去可使用以下脚本
#该脚本从阿里云镜像仓库拉取到本地,docker image tag为原镜像,再删除从阿里云拉取的镜像。
#!/bash/bin
image_list=(
csi-node-driver-registrar:v2.7.0
csi-attacher:v4.1.0
csi-snapshotter:v6.2.1
csi-resizer:v1.7.0
csi-provisioner:v3.4.0
)
aliyuncs="registry.aliyuncs.com/it00021hot"
google_gcr="registry.k8s.io/sig-storage"
for image in ${image_list[*]}
do
docker image pull ${aliyuncs}/${image}
docker image tag ${aliyuncs}/${image} ${google_gcr}/${image}
docker image rm ${aliyuncs}/${image}
echo "${aliyuncs}/${image} ${google_gcr}/${image} downloaded."
done
部署rook operator
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl -n rook-ceph get pod
部署ceph集群
kubectl create -f cluster.yaml
#如下图所示代表部署完成
ceph-osd-prepare 是job 所以状态是compute
部署ceph工具
cd rook/deploy/examples/
kubectl apply -f toolbox.yaml
kubectl exec -it rook-ceph-tools-598b59df89-kqjr9 -n rook-ceph -- bash
[root@master examples]# kubectl exec -it rook-ceph-tools-598b59df89-kqjr9 -n rook-ceph -- bash
bash-4.4$ ceph -s
cluster:
id: d5215f94-1830-4e95-96b7-d2ddbd6302da
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 4m)
mgr: b(active, since 2m), standbys: a
osd: 6 osds: 6 up (since 2m), 6 in (since 3m)
data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 122 MiB used, 180 GiB / 180 GiB avail
pgs: 1 active+clean
bash-4.4$ ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.17578 root default
-7 0.06839 host master
1 hdd 0.04880 osd.1 up 1.00000 1.00000
3 hdd 0.00980 osd.3 up 1.00000 1.00000
5 hdd 0.00980 osd.5 up 1.00000 1.00000
-5 0.05859 host node1
2 hdd 0.04880 osd.2 up 1.00000 1.00000
4 hdd 0.00980 osd.4 up 1.00000 1.00000
-3 0.04880 host node2
0 hdd 0.04880 osd.0 up 1.00000 1.00000
bash-4.4$ ceph osd status
ID HOST USED AVAIL WR OPS WR DATA RD OPS RD DATA STATE
0 node2 21.0M 49.9G 0 0 0 0 exists,up
1 master 19.6M 49.9G 0 0 0 0 exists,up
2 node1 20.9M 49.9G 0 0 0 0 exists,up
3 master 19.6M 9.98G 0 0 0 0 exists,up
4 node1 19.7M 9.98G 0 0 0 0 exists,up
5 master 20.8M 9.97G 0 0 0 0 exists,up
bash-4.4$ ceph osd pool ls
.mgr
bash-4.4$
部署ceph-dashboard
kubectl create -f dashboard-external-https.yaml
kubectl get svc -n rook-ceph
#删除原有的dashboard service
kubectl delete svc/rook-ceph-mgr-dashboard -n rook-ceph
访问地址:https://172.31.246.53:32326
用户名默认是admin,密码6^A%m-ZI=0k&rCg(08L-
密码可以通过以下代码获取:
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"|base64 --decode && echo
[root@master examples]# kubectl create -f dashboard-external-https.yaml
service/rook-ceph-mgr-dashboard-external-https created
[root@master examples]# kubectl get svc -n rook-ceph
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.10.226.83 <none> 9283/TCP 6m32s
rook-ceph-mgr-dashboard ClusterIP 10.10.205.62 <none> 8443/TCP 6m32s
rook-ceph-mgr-dashboard-external-https NodePort 10.10.157.25 <none> 8443:32326/TCP 4s
rook-ceph-mon-a ClusterIP 10.10.97.117 <none> 6789/TCP,3300/TCP 7m48s
rook-ceph-mon-b ClusterIP 10.10.174.129 <none> 6789/TCP,3300/TCP 7m21s
rook-ceph-mon-c ClusterIP 10.10.186.23 <none> 6789/TCP,3300/TCP 7m9s
[root@master examples]#
接下来,我们将使用这个ceph集群用于kubernetes集群的持久化存储,存储方式为存储类storageclass,详情请见: 使用ceph作为kubernetes集群的持久化存储(storageclass)