rook介绍
rook是一个开源的云原生存储编排工具,rook将分布式存储系统转变为自我管理、自我扩展、自我修复的存储服务。它自动执行存储管理员的任务:部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监视和资源管理。
rook利用Kubernetes平台的强大功能,通过Kubernetes Operator为每个存储提供商提供服务。rook目前支持Ceph、NFS、Minio Object Store和CockroachDB。
部署rook
下载rook并部署
git clone https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl apply -f crds.yaml -f common.yaml -f operator.yaml
查看rook部署情况
注意我的ecs是香港的,如果是国内的需要修改operator.yaml中的镜像,否则k8s.gcr.io或者quay.io是无法访问的,也可以参考这里的方法下载到dockerhub等镜像仓库中。
kubectl get all -n rook-ceph
部署ceph
创建osd会挂载数据盘,所以ecs需要挂载一块空盘,不要mount。
cd rook/deploy/examples
kubectl apply -f cluster.yaml
kubectl get po -n rook-ceph
部署rook-ceph-tools
ceph-tools是用来调试和测试ceph的常用工具容器,可以执行ceph命令来查看ceph集群状态。
cd rook/deploy/examples
kubectl apply -f toolbox.yaml
kubectl get po -n rook-ceph
进入tools容器,执行ceph命令。
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 status
ceph osd status
ceph df
rados df
可以看到所有mons应该达到法定数量,mgr 应该是激活状态,至少有一个 OSD 处于激活状态。
部署ceph-dashboard
ceph有一个dashboard工具,我们可以在上面查看集群的状态,包括总体运行状态,mgr、osd 和其他ceph进程的状态,查看池和PG状态,以及显示守护进程的日志等等。
在cluster.yaml中,设置dashboard.enable=true即可,这样 Rook Operator就会启用ceph-mgr dashboard模块,创建一个service来暴露该服务。
kubectl get svc -n rook-ceph
我的ecs是公网的,没有多余的域名,所以采用NodePort方式访问,如果有域名或者本地测试的话可以使用ingress。下面修改svc,添加安全组规则。
kubectl edit svc rook-ceph-mgr-dashboard -n rook-ceph
这里会无法访问,因为使用了ssl的8443端口,修改cluster.yaml,将ssl改为false,port改为7000。如果通过反向代理访问dashboard,可以设置 urlPrefix。
由于ceph是通过opreator来安装的,所以修改svc过一会会自动还原。。。创建一个dashboard-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: rook-ceph-mgr-dashboard-nodeport
namespace: rook-ceph
labels:
app: rook-ceph-mgr
rook_cluster: rook-ceph
# 这个label需要看你的pod实际的label,也可以对照默认创建的svc中的laebel来修改
ceph_daemon_id: b
spec:
ports:
- name: dashboard
port: 7000
protocol: TCP
targetPort: 7000
selector:
app: rook-ceph-mgr
rook_cluster: rook-ceph
ceph_daemon_id: b
type: NodePort
kubectl apply -f dashboard-svc.yaml
访问ip:30724
用户名为admin,密码需要通过secret来获取。
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
查看dashboard
通过CephFilesystem方式挂载到ceph
当前是没有filesystem的,先创建文件系统,
kubectl apply -f examples/filesystem.yaml
可以看到创建了myfs的filesystem,这2个pod所在节点上的crashcollector也会重启。
在dashboard中可以看到创建了2个pools,一个是用于数据myfs-replicated,一个用于元数据myfs-metadata。
也可以通过ceph-tools容器中的ceph命令查看:
kubectl exec -it rook-ceph-tools-79bc54b8d8-jw6hv -n rook-ceph -- ceph fs ls
创建storageclass来使用这个filesystem。
kubectl apply -f deploy/examples/csi/cephfs/storageclass.yaml
kubectl get sc
创建pvc绑定sc。
kubectl apply -f deploy/examples/csi/cephfs/pvc.yaml
kubectl get pvc
创建pod挂载pvc。
kubectl apply -f deploy/examples/csi/cephfs/pod.yaml
kubectl get po
kubectl exec -it csicephfs-demo-pod -- df -h
可以看到/var/lib/www/html
的filesystem为rook-ceph-mon,证明ceph可以正常挂载。同时在dashboard中也可以看到myfs多了一个client,root为pod挂载的目录。
通过RBD方式挂载到ceph
同样的创建sc,pvc,pod
cd deploy/examples/csi/rbd
kubectl apply -f storageclass.yaml
kubectl apply -f pvc.yaml
# 这里需要修改pod的名字,如果你没有删除上面的filesystem pod。
kubectl apply -f pod.yaml
kubectl get sc
kubectl get po,pvc
kubectl exec -it csi-rbd-pod -- df -h
可以看到pod中filesystem为/dev/rbd0
。
同时dashborad可以在block查看到一个image。
pool中也有一个replicapool。