K8s & K3s 集群中构建云原生存储系统( rook + ceph )

前景提要

容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保存在多个节点上,而与当前宿主机没有任何绑定关系。这样,无论你在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。
由于 Kubernetes 本身的松耦合设计,绝大多数存储项目,比如 Ceph、GlusterFS、NFS 等,都可以为 Kubernetes 提供持久化存储能力。

1 Rook 简介

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

Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行。下图说明了Ceph Rook如何与Kubernetes集成:


image

随着Rook在Kubernetes集群中运行,Kubernetes应用程序可以挂载由Rook管理的块设备和文件系统,或者可以使用S3 / Swift API提供对象存储。Rook oprerator自动配置存储组件并监控群集,以确保存储处于可用和健康状态。
Rook oprerator是一个简单的容器,具有引导和监视存储集群所需的全部功能。oprerator将启动并监控ceph monitor pods和OSDs的守护进程,它提供基本的RADOS存储。oprerator通过初始化运行服务所需的pod和其他组件来管理池,对象存储(S3 / Swift)和文件系统的CRD。
oprerator将监视存储后台驻留程序以确保群集正常运行。Ceph mons将在必要时启动或故障转移,并在群集增长或缩小时进行其他调整。oprerator还将监视api服务请求的所需状态更改并应用更改。
Rook oprerator还创建了Rook agent。这些agent是在每个Kubernetes节点上部署的pod。每个agent都配置一个Flexvolume插件,该插件与Kubernetes的volume controller集成在一起。处理节点上所需的所有存储操作,例如附加网络存储设备,安装卷和格式化文件系统。


image

该rook容器包括所有必需的Ceph守护进程和工具来管理和存储所有数据 - 数据路径没有变化。 rook并没有试图与Ceph保持完全的忠诚度。 许多Ceph概念(如placement groups和crush maps)都是隐藏的,因此您无需担心它们。 相反,Rook为管理员创建了一个简化的用户体验,包括物理资源,池,卷,文件系统和buckets。 同时,可以在需要时使用Ceph工具应用高级配置。
Rook在golang中实现。Ceph在C ++中实现,其中数据路径被高度优化。我们相信这种组合可以提供两全其美的效果。

2 Ceph 简介

Ceph是一种高度可扩展的分布式存储解决方案,提供对象、文件和块存储。在每个存储节点上,您将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进程。在Ceph集群上,您还可以找到Ceph MON(监控)守护程序,它们确保Ceph集群保持高可用性。


image
image

部署及运维

1 K8s/K3s 集群准备

利用 K8s & K3s 快速的构建节点的数量 >= 3 的测试集群

172.16.31.237 master
172.16.31.241 work01
172.16.31.238 work02

172.16.31.236 work03
172.16.31.235 work04
172.16.31.240 work05

说明: 在集群中至少有三个节点可用,满足ceph高可用要求,这里已配置master节点使其支持运行pod。

2 Ceph 存储方式

image

rook默认使用所有节点的所有资源,rook operator自动在所有节点上启动OSD设备,Rook会用如下标准监控并发现可用设备:

  • 设备没有分区
  • 设备没有格式化的文件系统

添加新磁盘:
这里在所有节点添加1块50GB的新磁盘:/dev/sdb,作为OSD盘,提供存储空间,添加完成后扫描磁盘,确保主机能够正常识别到:

#扫描 SCSI总线并添加 SCSI 设备
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done

#重新扫描 SCSI 总线
for scsi_device in $(ls /sys/class/scsi_device/); do echo 1 > /sys/class/scsi_device/$scsi_device/device/rescan; done

#查看已添加的磁盘,能够看到sdb说明添加成功
lsblk

说明: Rook不会使用不满足以上标准的设备。另外也可以通过修改配置文件,指定哪些节点或者设备会被使用。

3 Rook Operator 部署

  • 最低版本
    注: Rook支持Kubernetes v1.10或更高版本

  • 先决条件
    如果您要dataDirHostPath在kubernetes主机上持久保留rook数据,请确保您的主机在指定路径上至少有5GB的可用空间。
    可以参考以下文档 及 kubectl 命令和示例yaml文件创建一个简单的Rook集群。

  • 版本分支

# 克隆rook github仓库到本地
git clone https://github.com/rook/rook.git
# 查看版本。然后切换分支。切换分支之后按照官方文档的方式进行部署
git checkout release-1.1
  • 环境拉起
# 进入 Rook 部署目录
cd cluster/examples/kubernetes/ceph
kubectl create -f common.yaml
kubectl create -f operator.yaml

4 Rook Cluster 创建

# cluster测试就使用下面的yaml
kubectl create -f cluster-test.yaml
# 正式环境使用
kubectl create -f cluster.yaml

每个节点都加载一块无格式化的硬盘,因为使用官方的部署方式,不自己进行修改cluster.yaml的参数的话,会自动扫描磁盘。上生产环境的时候,需要自己指定磁盘类型

# 案例介绍
# 其中bluestore是直接使用裸磁盘的意思,会加打磁盘的效率
# filestore
nodes:
- name: "master001"
  devices:
  - name: "sdb"
  - name: "sdc"
  config:
    storeType: bluestore
- name: "master002"
  devices:
  - name: "sdb"
  - name: "sdc"
  config:
    storeType: bluestore
- name: "master003"
  devices:
  - name: "sdb"
  - name: "sdc"
  config:
    storeType: bluestore

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

5 rook-ceph-tools 检查

Rook工具箱是一个容器,其中包含用于rook调试和测试的常用工具。该工具箱基于CentOS,因此可以使用轻松安装更多选择的工具yum。
在Kubernetes中运行工具箱,Rook工具箱可以作为Kubernetes集群中的部署运行。确保已部署rook的Kubernetes集群正在运行时(请参阅Kubernetes说明),启动rook-ceph-tools pod。

# 启动rook-ceph-tools pod
kubectl create -f toolbox.yaml
# 等待工具箱窗格下载其容器并进入 running 状态
kubectl -n rook-ceph get pod -l "app=rook-ceph-tools"
# rook-ceph-tools pod运行后,您可以使用以下命令连接到它
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash

ceph 工具箱问题排查:

# 查看 ceph 状态
ceph status
# 查看 ceph osd 状态
ceph osd status
# 查看 ceph 存储
ceph df
# 查看 ceph osd 存储
rados df

# 使用完工具箱后,可以删除部署
kubectl -n rook-ceph delete deployment rook-ceph-tools

配置ceph dashboard

在cluster.yaml文件中默认已经启用了ceph dashboard,查看dashboard的service:

#  查看 ceph 的 deployment
$kubectl -n rook-ceph get deployment
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
rook-ceph-operator             1/1     1            1           162m
csi-cephfsplugin-provisioner   2/2     2            2           157m
rook-ceph-mon-a                1/1     1            1           155m
rook-ceph-mgr-a                1/1     1            1           155m
rook-ceph-osd-0                1/1     1            1           155m
rook-ceph-osd-3                1/1     1            1           154m
rook-ceph-osd-1                1/1     1            1           155m
rook-ceph-osd-2                1/1     1            1           155m
rook-ceph-osd-4                1/1     1            1           149m
csi-rbdplugin-provisioner      2/2     2            2           157m
rook-ceph-osd-5                1/1     1            1           95m
# 查看 ceph 的 service
$kubectl get service -n rook-ceph
NAME                                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
csi-rbdplugin-metrics                    ClusterIP   10.43.14.242    <none>        8080/TCP,8081/TCP   156m
csi-cephfsplugin-metrics                 ClusterIP   10.43.167.36    <none>        8080/TCP,8081/TCP   156m
rook-ceph-mon-a                          ClusterIP   10.43.229.177   <none>        6789/TCP,3300/TCP   155m
rook-ceph-mgr-dashboard                  ClusterIP   10.43.59.114    <none>        8443/TCP            154m
rook-ceph-mgr                            ClusterIP   10.43.185.3     <none>        9283/TCP            154m
rook-ceph-mgr-dashboard-external-https   NodePort    10.43.60.127    <none>        8443:30782/TCP      60m

rook-ceph-mgr-dashboard监听的端口是8443,创建nodeport类型的service以便集群外部访问

# 创建对外的服务
cd cluster/examples/kubernetes/ceph
kubectl apply -f rook/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
# 查看端口号,也可以自定义好端口号
kubectl get svc -n rook-ceph | grep rook-ceph-mgr-dashboard-external-https
# 查看一下nodeport暴露的端口
$kubectl get service -n rook-ceph | grep dashboard
rook-ceph-mgr-dashboard                  ClusterIP   10.43.59.114    <none>        8443/TCP            158m
rook-ceph-mgr-dashboard-external-https   NodePort    10.43.60.127    <none>        8443:30782/TCP      64m

# 获取Dashboard的登陆账号和密码
[centos@k8s-master ~]$ MGR_POD=`kubectl get pod -n rook-ceph | grep mgr | awk '{print $1}'`
[centos@k8s-master ~]$ kubectl -n rook-ceph logs $MGR_POD | grep password
2019-01-03 05:44:00.585 7fced4782700  0 log_channel(audit) log [DBG] : from='client.4151 10.244.1.2:0/3446600469' entity='client.admin' cmd=[{"username": "admin", "prefix": "dashboard set-login-credentials", "password": "8v2AbqHDj6", "target": ["mgr", ""], "format": "json"}]: dispatch
[centos@k8s-master ~]$ 

# 方式二:查看账号/密码信息(默认 admin)
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o yaml | grep "password:" | awk '{print $2}'  | awk 'NR==1' | base64 --decode

说明: 找到username和password字段,我这里是admin,8v2AbqHDj6 ; 打开浏览器输入任意一个Node的IP+nodeport端口,这里使用master节点 ip访问:

image

登录后界面如下:


image

image

image

备注说明:
可以看到 dataDirHostPath: /var/lib/rook 字段还有spec.storage.directories.path也需要修改成一样的
可以根据自己的需求进行修改默认的存储路径

cat cluster.yaml
image

存储清理

删除已创建的Ceph集群,可执行下面命令

kubectl delete -f cluster.yaml

删除Ceph集群后,在之前部署Ceph组件节点的/var/lib/rook/目录,会遗留下Ceph集群的配置信息。
若之后再部署新的Ceph集群,先把之前Ceph集群的这些信息删除,不然启动monitor会失败;

# cat clean-rook-dir.sh
hosts=(
  k8s-master
  k8s-node1
  k8s-node2
)

for host in ${hosts[@]} ; do
  ssh $host "rm -rf /var/lib/rook/*"
done

拓展阅读

Ceph 是圣克鲁兹加利福尼亚大学的 Sage Weil 在 2003 年开发的,也是他博士学位项目中的一部分。Ceph LTS 成熟稳定、高可用、生态强大,在云原生时代和 Kubernetes 紧密集成。

Ceph 基于 RADOS(Reliable Autonomic Distributed Object Store )的高可用存储,在云原生时代之前 2003 年发行起,已经广泛生产部署的高可用存储,支持最广泛的块存储 RBD、文件 POSIX Cephfs 以及对象存储访问协议。

RedHat/SUSE 目前是 Ceph 最主要的商业化支持者,在多个容器平台落地案例中,RBD、CephFS 都被采用作为容器平台实施的主要存储,用来弥补基础云存储的缺失。

参考链接:
Rook官网:https://rook.io
root项目地址:https://github.com/rook/rook
rook官方参考文档:https://rook.github.io/docs/rook/v0.9/ceph-quickstart.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容