centos7 k8s中部署rook+ceph存储系统
rook简介容器的持久化存储容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保存在多个节点上,而与当前宿主机没有任何绑定关系。这样,无论你在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。由于 Kubernete...
- rook简介
容器的持久化存储
容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保存在多个节点上,而与当前宿主机没有任何绑定关系。这样,无论你在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。
由于 Kubernetes 本身的松耦合设计,绝大多数存储项目,比如 Ceph、GlusterFS、NFS 等,都可以为 Kubernetes 提供持久化存储能力。
Ceph分布式存储系统
Ceph是一种高度可扩展的分布式存储解决方案,提供对象、文件和块存储。在每个存储节点上,您将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进程。在Ceph集群上,您还可以找到Ceph MON(监控)守护程序,它们确保Ceph集群保持高可用性。
Rook
Rook 是一个开源的cloud-native storage编排, 提供平台和框架;为各种存储解决方案提供平台、框架和支持,以便与云原生环境本地集成。
Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。
Rook 使用底层云本机容器管理、调度和编排平台提供的工具来实现它自身的功能。
Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。
Rook使用Kubernetes原语使Ceph存储系统能够在Kubernetes上运行。
下图说明了Ceph Rook如何与Kubernetes集成:
- 部署环境准备
在集群中至少有三个节点可用,满足ceph高可用要求,这里已配置master节点使其支持运行pod
- rook使用存储方式
rook默认使用所有节点的所有资源,rook operator自动在所有节点上启动OSD设备,Rook会用如下标准监控并发现可用设备:
设备没有分区
设备没有格式化的文件系统
Rook不会使用不满足以上标准的设备。另外也可以通过修改配置文件,指定哪些节点或者设备会被使用。
添加新磁盘
这里在所有节点添加1块20GB的新磁盘:/dev/sdb,作为OSD盘,提供存储空间,添加完成后扫描磁盘,确保主机能够正常识别到:
查看已添加的磁盘,能够看到sdb说明添加成功
lsblk
- 本次搭建的基本原理图:
无另外说明,以下全部操作都在master节点执行。
- 部署Rook Operator
- 克隆rook github仓库到本地
git clone https://github.com/rook/rook.git
进去到下载好的文件夹中 cd rook/ 执行以下操作
git checkout -b release-0.9 remotes/origin/release-0.9
git branch -a
这两步原来是不用做的,但是在之后创建服务的时候资源无法正常创建,我查看日志得到的结果是
因为创建的 CRDs 资源版本不匹配导致的。正确的方法就是切换到最新固定版本,需要执行上面的两步,0.9是最新的版本
输出结果是这样的
master
* release-0.9
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/release-0.4
remotes/origin/release-0.5
remotes/origin/release-0.6
remotes/origin/release-0.7
remotes/origin/release-0.8
remotes/origin/release-0.9
然后继续后续操作
cd rook/cluster/examples/kubernetes/ceph/
部署 Rook Operator
kubectl create -f operator.yaml
查看集群信息
创建rook Cluster
当检查到Rook operator, agent, and discover pods已经是running状态后,就可以部署rook cluster了。
kubectl apply -f cluster.yaml
查看集群信息
- 删除Ceph集群
如果要删除已创建的Ceph集群,可执行下面命令:
kubectl delete -f cluster.yaml
删除Ceph集群后,在之前部署Ceph组件节点(node节点)的/var/lib/rook/目录,会遗留下Ceph集群的配置信息。
若之后再部署新的Ceph集群,先把之前Ceph集群的这些信息删除,不然启动monitor会失败;
rm -rf /var/lib/rook/*
- 配置ceph dashboard
在cluster.yaml文件中默认已经启用了ceph dashboard,查看dashboard的service
kubectl get service -n rook-ceph
可以看到dashboard
rook-ceph-mgr-dashboard监听的端口是8443,创建nodeport类型的service以便集群外部访问。
kubectl apply -f rook/cluster/examples/kubernetes/ceph/dashboard-external-https.yaml
- 查看一下nodeport暴露的端口
这里是31823端口:
kubectl get service -n rook-ceph | grep dashboard
rook-ceph-mgr-dashboard ClusterIP 10.108.219.202 <none> 8443/TCP 2d20h
rook-ceph-mgr-dashboard-external-https NodePort 10.111.163.92 <none> 8443:31823/TCP 2d20h
- 获取Dashboard的登陆账号和密码
MGR_POD=`kubectl get pod -n rook-ceph | grep mgr | awk '{print $1}'`
kubectl -n rook-ceph logs $MGR_POD | grep password
打开浏览器输入任意一个Node的IP+nodeport端口,这里使用master节点 ip访问:
https://10.0.13.106:31823
输入账号密码
- 部署Ceph toolbox
默认启动的Ceph集群,是开启Ceph认证的,这样你登陆Ceph组件所在的Pod里,是没法去获取集群状态,以及执行CLI命令,这时需要部署Ceph toolbox,命令如下:
kubectl apply -f rook/cluster/examples/kubernetes/ceph/ toolbox.yaml
查看是否正常
kubectl -n rook-ceph get pods -o wide | grep ceph-tools
然后可以登陆该pod后,执行Ceph CLI命令:
[centos@k8s-master ceph]$ kubectl -n rook-ceph exec -it rook-ceph-tools-76c7d559b6-8w7bk bash
查看集群状态
ceph status
- rook提供RBD服务
rook可以提供以下3类型的存储:
Block: Create block storage to be consumed by a pod
Object: Create an object store that is accessible inside or outside the Kubernetes cluster
Shared File System: Create a file system to be shared across multiple pods
在提供(Provisioning)块存储之前,需要先创建StorageClass和存储池。K8S需要这两类资源,才能和Rook交互,进而分配持久卷(PV)。
在kubernetes集群里,要提供rbd块设备服务,需要有如下步骤:
- 创建rbd-provisioner pod
创建rbd对应的storageclass
创建pvc,使用rbd对应的storageclass
创建pod使用rbd pvc
通过rook创建Ceph Cluster之后,rook自身提供了rbd-provisioner服务,所以我们不需要再部署其provisioner。
备注:代码位置pkg/operator/ceph/provisioner/provisioner.go
创建pool和StorageClass
查看storageclass.yaml的配置(默认)
vim rook/cluster/examples/kubernetes/ceph/storageclass.yaml
配置文件中包含了一个名为replicapool的存储池,名为rook-ceph-block的storageClass
- 运行yaml文件
kubectl apply -f /rook/cluster/examples/kubernetes/ceph/storageclass.yaml
- 查看创建的storageclass:
[centos@k8s-master ~]$ kubectl get storageclass
NAME PROVISIONER AGE
rook-ceph-block ceph.rook.io/block 171m
- 登录ceph dashboard查看创建的存储池:
- 使用存储
以官方服务wordpress示例为例,创建一个经典的wordpress和mysql应用程序来使用Rook提供的块存储,这两个应用程序都将使用Rook提供的block volumes。
查看yaml文件配置,主要看定义的pvc和挂载volume部分,以wordpress.yaml为例:
vim /rook/cluster/examples/kubernetes/wordpress.yaml
yaml文件里定义了一个名为wp-pv-claim的pvc,指定storageClassName为rook-ceph-block,申请的存储空间大小为20Gi。最后一部分创建了一个名为wordpress-persistent-storage的volume,并且指定 claimName为pvc的名称,最后将volume挂载到pod的/var/lib/mysql目录下。
- 启动mysql和wordpress :
kubectl apply -f rook/cluster/examples/kubernetes/mysql.yaml
kubectl apply -f rook/cluster/examples/kubernetes/wordpress.yaml
这2个应用都会创建一个块存储卷,并且挂载到各自的pod中,查看声明的pvc和pv:
[centos@k8s-master ~]$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-5bfbe28e-0fc9-11e9-b90d-000c291c25f3 20Gi RWO rook-ceph-block 32m
wp-pv-claim Bound pvc-5f56c6d6-0fc9-11e9-b90d-000c291c25f3 20Gi RWO rook-ceph-block 32m
[centos@k8s-master ~]$ kubectl get pv
注意:这里的pv会自动创建,当提交了包含 StorageClass 字段的 PVC 之后,Kubernetes 就会根据这个 StorageClass 创建出对应的 PV,这是用到的是Dynamic Provisioning机制来动态创建pv,PV 支持 Static 静态请求,和动态创建两种方式。
登录ceph dashboard查看创建的images
- 一旦wordpress和mysql pods处于运行状态,获取wordpress应用程序的集群IP并使用浏览器访问:
[centos@k8s-master ~]$ kubectl get svc wordpress
更多推荐
所有评论(0)