Skip to content

26 利用rook在k8s集群快速搭建ceph文件系统

Jinxin Chen edited this page Dec 11, 2019 · 1 revision

本文介绍如何利用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

Rook Operator会在每个node上创建一个代理容器,用于后续的集群建立等。

kubectl create -f operator.yaml

然后检查所有 pods 的状态已经变为 running

kubectl -n rook-ceph-system get pod

部署 Rook Cluster

kubectl create -f cluster.yaml

检查 ceph 的容器状态

kubectl -n rook-ceph get pod

暴露 ceph dashboard

检查服务是否有正常运行:

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

部署 ceph tool box

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

参考

Clone this wiki locally