前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >K8s 上的分布式存储集群搭建(Rook/ceph)

K8s 上的分布式存储集群搭建(Rook/ceph)

作者头像
灵雀云
发布2021-12-10 12:14:27
3.5K0
发布2021-12-10 12:14:27
举报
文章被收录于专栏:云原生技术社区

本篇文章将手把手带你在 K8s 上搭建分布式存储集群(Rook/ceph)

1 环境准备

1.1 基础环境

  • 3台配置一致的虚拟机:
  • 虚拟机配置:4c 8g
  • 虚拟机操作系统:cents7
  • 硬盘:vda:40G vdb:20G
  • Kubernete 版本:1.20.0
  • Docker版本:20.10.7

默认k8s 已安装完成,采用kubeadm 容器化安装

1.2 所安装rook/ceph版本:

ceph:v15.2.11

rook:1.6.3

1.3 前提

  • 正常运行的多节点k8s集群,两个子节点及以上
  • rook的版本大于1.3,无法使用目录创建集群,要使用单独的裸盘进行创建,也就是创建一个新的磁盘,挂载到宿主机,不进行格式化,直接使用即可。检查步骤:
代码语言:javascript
复制
lsblk -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
vda                                                      
└─vda1 xfs          6f15c206-f516-4ee8-a4b7-89ad880647db /
vdb
  • FSTYPE为空的磁盘为可用磁盘,该磁盘需要清除数据(不能格式化)。
  • 做这个实验需要高配置,每个子节点配置不能低于2核4G,主节点不低于4核8G

2 搭建流程

2.1Rook是什么?

  • Rook本身并不是一个分布式存储系统,而是利用 Kubernetes 平台的强大功能,通过 Kubernetes Operator 为每个存储提供商提供服务。它是一个存储“编排器”,可以使用不同的后端(例如 Ceph、EdgeFS 等)执行繁重的管理存储工作,从而抽象出很多复杂性。
  • Rook 将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、供应、扩展、升级、迁移、灾难恢复、监控和资源管理
  • Rook 编排了多个存储解决方案,每个解决方案都有一个专门的 Kubernetes Operator 来实现自动化管理。目前支持Ceph、Cassandra、NFS。
  • 目前主流使用的后端是Ceph ,Ceph 提供的不仅仅是块存储;它还提供与 S3/Swift 兼容的对象存储和分布式文件系统。Ceph 可以将一个卷的数据分布在多个磁盘上,因此可以让一个卷实际使用比单个磁盘更多的磁盘空间,这很方便。当向集群添加更多磁盘时,它会自动在磁盘之间重新平衡/重新分配数据。

2.2 ceph-rook 与k8s集成方式

  • Rook 是一个开源的cloud-native storage编排, 提供平台和框架;为各种存储解决方案提供平台、框架和支持,以便与云原生环境本地集成。
  • Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。
  • Rook 使用底层云本机容器管理、调度和编排平台提供的工具来实现它自身的功能。
  • Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。
  • Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行

3 安装部署

3.1 安装前准备

代码语言:javascript
复制
#确认安装lvm2
yum install lvm2 -y
#启用rbd模块
modprobe rbd
cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules
do
  [ -x \$file ] && \$file
done
EOF
cat > /etc/sysconfig/modules/rbd.modules << EOF
modprobe rbd
EOF
chmod 755 /etc/sysconfig/modules/rbd.modules
lsmod |grep rbd

3.2 下载Rook安装文件

代码语言:javascript
复制
git clone --single-branch --branch v1.6.3 https://github.com/rook/rook.git

更改配置

代码语言:javascript
复制
cd rook/cluster/examples/kubernetes/ceph

修改Rook CSI镜像地址,原本的地址可能是gcr的镜像,但是gcr的镜像无法被国内访问,所以需要同步gcr的镜像到阿里云镜像仓库,本文档已经为大家完成同步,可以直接修改如下:

代码语言:javascript
复制
vim operator.yaml

改为:

代码语言:javascript
复制
ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-node-driver-registrar:v2.0.1"
 ROOK_CSI_RESIZER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-resizer:v1.0.1"
 ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-provisioner:v2.0.4"
 ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-snapshotter:v4.0.0"
 ROOK_CSI_ATTACHER_IMAGE: "registry.cn-beijing.aliyuncs.com/dotbalo/csi-attacher:v3.0.2"

还是operator文件,新版本rook默认关闭了自动发现容器的部署,可以找到ROOK_ENABLE_DISCOVERY_DAEMON改成true即可:

3.4 部署ROOK

代码语言:javascript
复制
cd cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

等待容器启动,只有都running才能进行下一步

代码语言:javascript
复制
[root@k8s-master01 ceph]# kubectl -n rook-ceph get pod
NAME                                                     READY   STATUS      RESTARTS   AGE
rook-ceph-operator-675f59664d-b9nch                      1/1     Running     0          32m
rook-discover-4m68r                                      1/1     Running     0          40m
rook-discover-chscc                                      1/1     Running     0          40m
rook-discover-mmk69                                      1/1     Running     0          40m

3.5 创建ceph集群

代码语言:javascript
复制
kubectl create -f cluster.yaml

创建完成后,可以查看pod的状态:

代码语言:javascript
复制
[root@k8s-master01 ceph]# kubectl -n rook-ceph get pod
NAME                                                     READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-8d6zn                                   3/3     Running     0          39m
csi-cephfsplugin-dr6wd                                   3/3     Running     0          39m
csi-cephfsplugin-gblpg                                   3/3     Running     0          39m
csi-cephfsplugin-provisioner-846ffc6cb4-qjv7s            6/6     Running     0          39m
csi-cephfsplugin-provisioner-846ffc6cb4-wbjzg            6/6     Running     0          39m
csi-rbdplugin-6bd9t                                      3/3     Running     0          39m
csi-rbdplugin-9b6gt                                      3/3     Running     0          39m
csi-rbdplugin-9vtpp                                      3/3     Running     0          39m
csi-rbdplugin-provisioner-75fd5c779f-9989z               6/6     Running     0          39m
csi-rbdplugin-provisioner-75fd5c779f-zx49t               6/6     Running     0          39m
rook-ceph-crashcollector-k8s-master01-75bb6c6dd9-lnncg   1/1     Running     0          38m
rook-ceph-crashcollector-k8s-node-90-84b555c8c8-5vt72    1/1     Running     0          38m
rook-ceph-crashcollector-k8s-node-94-798667dd4b-dzvbw    1/1     Running     0          31m
rook-ceph-mgr-a-86d4459f5b-8bk49                         1/1     Running     0          38m
rook-ceph-mon-a-847d986b98-tff45                         1/1     Running     0          39m
rook-ceph-mon-b-566894d545-nbw2t                         1/1     Running     0          39m
rook-ceph-mon-c-58c5789c6-xz5l7                          1/1     Running     0          38m
rook-ceph-operator-675f59664d-b9nch                      1/1     Running     0          32m
rook-ceph-osd-0-76db9d477d-dz9kf                         1/1     Running     0          38m
rook-ceph-osd-1-768487dbc8-g7zq9                         1/1     Running     0          31m
rook-ceph-osd-2-5d9f8d6fb-bfwtk                          1/1     Running     0          31m
rook-ceph-osd-prepare-k8s-master01-4b4mp                 0/1     Completed   0          31m
rook-ceph-osd-prepare-k8s-node-90-7jg4n                  0/1     Completed   0          31m
rook-ceph-osd-prepare-k8s-node-94-4mb7g                  0/1     Completed   0          31m
rook-discover-4m68r                                      1/1     Running     0          40m
rook-discover-chscc                                      1/1     Running     0          40m
rook-discover-mmk69                                      1/1     Running     0          40m

其中osd-0、osd-1、osd-2容器必须是存在且正常的,如果上述pod均正常运行成功,则视为集群安装成功。

3.6 安装ceph 客户端工具

这个文件的路径还是在ceph文件夹下

代码语言:javascript
复制
kubectl  create -f toolbox.yaml -n rook-ceph

待容器Running后,即可执行相关命令:

代码语言:javascript
复制
[root@k8s-master01 ~]# kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash
[root@rook-ceph-tools-fc5f9586c-m2wf5 /]# ceph status
  cluster:
    id:     9016340d-7f90-4634-9877-aadc927c4e81
    health: HEALTH_WARN
            mons are allowing insecure global_id reclaim
            clock skew detected on mon.b

  services:
    mon: 3 daemons, quorum a,b,c (age 3m)
    mgr: a(active, since 44m)
    osd: 3 osds: 3 up (since 38m), 3 in (since 38m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 57 GiB / 60 GiB avail
    pgs:     1 active+clean

常用命令:

代码语言:javascript
复制
ceph status
ceph osd status
ceph df 
rados df

3.7 配置ceph dashboard

默认的ceph 已经安装的ceph-dashboard,但是其svc地址为service clusterIP,并不能被外部访问

代码语言:javascript
复制
kubectl apply -f dashboard-external-https.yaml

创建NodePort类型就可以被外部访问了

代码语言:javascript
复制
[root@k8s-master01 ~]# kubectl get svc -n rook-ceph|grep dashboard
rook-ceph-mgr-dashboard                  ClusterIP   192.168.204.219   <none>        8443/TCP            49m
rook-ceph-mgr-dashboard-external-https   NodePort    192.168.34.227    <none>        8443:32529/TCP      49m

浏览器访问(master01-ip换成自己的集群ip):

https://master01-ip:32529/#/login?returnUrl=%2Fdashboard

用户名默认是admin,至于密码可以通过以下代码获取:

代码语言:javascript
复制
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"|base64 --decode && echo

4 删除集群并清除数据

4.1 删除Cephcluster CRD

代码语言:javascript
复制
kubectl -n rook-ceph delete cephcluster rook-ceph

确认上一步删除之后,查询一下

代码语言:javascript
复制
kubectl -n rook-ceph get cephcluster

4.2 删除Operator 和相关的资源

代码语言:javascript
复制
kubectl delete -f operator.yaml
kubectl delete -f common.yaml
kubectl delete -f crds.yaml

4.3 删除主机上的数据

rook创建cluster的时候会把部分数据卸载本机的/var/lib/rook(dataDirHostPath指定的目录)中,如果不删除会影响下次集群部署,rook据说下个版本会增加k8s 本地存储调用的功能,就不会直接存在硬盘上了

代码语言:javascript
复制
rm -rf /var/lib/rook

4.4 擦除硬盘上的数据

创建osd时被写入了数据,需要擦除,否则无法再次创建ceph集群,脚本中有各种硬盘的擦除命令,不需要全部执行成功,根据当前机器的硬盘情况确定。

代码语言:javascript
复制
vim clean-ceph.sh

#!/usr/bin/env bash
DISK="/dev/vdb"

sgdisk --zap-all $DISK

dd if=/dev/zero of="$DISK" bs=1M count=100 oflag=direct,dsync

blkdiscard $DISK

ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %

rm -rf /dev/ceph-*
rm -rf /dev/mapper/ceph--*

5 FAQ

5.1 卸载删除ceph-rook,kubectl get ns ,rook-ceph 显示未Terminating,无法删除

代码语言:javascript
复制
NAMESPACE=rook-ceph

kubectl proxy &

kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json

curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize

5.2 卸载osd 或者卸载集群另外一个后遗症,rook-ceph 名称空间删除了,但是 cephcluster无法删除

代码语言:javascript
复制
#查看名称空间,已经删除
[root@k8s-master01 ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   22h
kube-node-lease   Active   22h
kube-public       Active   22h
kube-system       Active   22h
#查看集群依然存在
[root@k8s-master01 ~]# kubectl -n rook-ceph get cephcluster
NAME        DATADIRHOSTPATH MONCOUNT AGE PHASE       MESSAGE                HEALTH
rook-ceph   /var/lib/rook   3        20h Progressing Configuring Ceph Mons
[root@k8s-master01 ~]# kubectl api-resources --namespaced=true -o name|xargs -n 1 kubectl get --show-kind --ignore-not-found -n rook-ceph
Error from server (MethodNotAllowed): the server does not allow this method on the requested resource
NAME                         TYPE                                  DATA   AGE
secret/default-token-lz6wh   kubernetes.io/service-account-token   3      8m34s
NAME                     SECRETS   AGE
serviceaccount/default   1         8m34s
Error from server (MethodNotAllowed): the server does not allow this method on the requested resource
NAME                                 DATADIRHOSTPATH   MONCOUNT   AGE   PHASE         MESSAGE                 HEALTH
cephcluster.ceph.rook.io/rook-ceph   /var/lib/rook     3          20h   Progressing   Configuring Ceph Mons   

#解决办法:
kubectl edit  cephcluster.ceph.rook.io -n rook-ceph
把finalizers的值删掉,cephcluster.ceph.rook.io便会自己删除

5.3 打开dashboard显示HEALTH_WARN警告

进入 ceph-tools 执行以下命令:

代码语言:javascript
复制
ceph config set mon auth_allow_insecure_global_id_reclaim false

其他常见警告解决链接:

https://docs.ceph.com/en/octopus/rados/operations/health-checks/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生技术社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 环境准备
    • 1.1 基础环境
      • 1.2 所安装rook/ceph版本:
        • 1.3 前提
        • 2 搭建流程
          • 2.1Rook是什么?
            • 2.2 ceph-rook 与k8s集成方式
            • 3 安装部署
              • 3.1 安装前准备
                • 3.2 下载Rook安装文件
                  • 3.4 部署ROOK
                    • 3.5 创建ceph集群
                      • 3.6 安装ceph 客户端工具
                        • 3.7 配置ceph dashboard
                        • 4 删除集群并清除数据
                          • 4.1 删除Cephcluster CRD
                            • 4.2 删除Operator 和相关的资源
                              • 4.3 删除主机上的数据
                                • 4.4 擦除硬盘上的数据
                                • 5 FAQ
                                  • 5.1 卸载删除ceph-rook,kubectl get ns ,rook-ceph 显示未Terminating,无法删除
                                    • 5.2 卸载osd 或者卸载集群另外一个后遗症,rook-ceph 名称空间删除了,但是 cephcluster无法删除
                                      • 5.3 打开dashboard显示HEALTH_WARN警告
                                      相关产品与服务
                                      对象存储
                                      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档