• 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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐