-
Notifications
You must be signed in to change notification settings - Fork 0
26 利用rook在k8s集群快速搭建ceph文件系统
本文介绍如何利用rook在k8s集群中快速搭建ceph文件系统
对于运行在k8s集群中的系统,持久性存储是一个重要的部分。
Ceph是一个开源的分布式存储系统,提供出色的性能,可靠性和可扩展性,可以说是目前虽受欢迎的私有存储方案了。
Rook是一个开源的存储服务,它与k8s深度集成,利用它可以很方便的在k8s集群中搭建、使用Ceph提供的存储系统。
下载 rook 源码:
git clone https://github.com/rook/rook.git
git checkout release-0.9
cd rook/cluster/examples/kubernetes/ceph
Rook Operator会在每个node上创建一个代理容器,用于后续的集群建立等。
kubectl create -f operator.yaml
然后检查所有 pods 的状态已经变为 running
kubectl -n rook-ceph-system get pod
kubectl create -f cluster.yaml
检查 ceph 的容器状态
kubectl -n rook-ceph get pod
检查服务是否有正常运行:
kubectl -n rook-ceph get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.43.14.242 <none> 9283/TCP 5h
rook-ceph-mgr-dashboard ClusterIP 10.43.169.205 <none> 8443/TCP 5h
暴露Nodeport:
kubectl apply -f dashboard-external-https.yaml.
kubectl -n rook-ceph get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr ClusterIP 10.43.14.242 <none> 9283/TCP 5h
rook-ceph-mgr-dashboard ClusterIP 10.43.169.205 <none> 8443/TCP 5h
rook-ceph-mgr-dashboard-external-https NodePort 10.43.18.209 <none> 8443:31096/TCP 5h
然后就可以通过 https://nodeip:31096 访问 dashboard 了
登录用户名为 admin,密码可以通过如下命令获取:
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o yaml | grep "password:" | awk '{print $2}' | base64 --decode
kubectl create -f toolbox.yaml
然后就可以通过如下命令进入容器管理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
通过部署 mysql, wordpress 来测试存储
部署storageclass、ceph block pool:
kubectl apply -f storageclass.yaml
部署 mysql
kubectl apply -f ../mysql.yaml
部署 WordPress
kubectl apply -f ../wordpress.yaml
查看pod状况
kubectl get pods
我在这里遇到了 pod 无法创建成功的问题:timeout expired waiting for volumes to attach or mount for pod
搜寻了一些解决方案,有提到要升级 os 到 ubuntu 18的,有提到要升级 k8s 到最新版本的,当然最终找到了问题所在:Rook使用FlexVolume与Kubernetes集成以执行存储操作,而FlexVolume插件的路径与目前kubectl环境配置的插件路径不同导致。
下面有详细讨论到这个问题:
笔者的k8s集群是通过rancher搭建,参考rancher的解决方案,在 cluster.yaml 文件配置 kubelet 的插件目录,更新集群以后,volume就可以正常挂载了。
services:
kubelet:
extra_args:
volume-plugin-dir: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
extra_binds:
- /usr/libexec/kubernetes/kubelet-plugins/volume/exec:/usr/libexec/kubernetes/kubelet-plugins/volume/exec